From e582da19576dae701b56cc2b7bd561943e33a9f7 Mon Sep 17 00:00:00 2001 From: Almond-S Date: Tue, 14 Jun 2022 22:02:52 +0200 Subject: [PATCH 01/56] First test version of factorize to check encoding problem --- R/factorize | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 R/factorize diff --git a/R/factorize b/R/factorize new file mode 100644 index 0000000..9232664 --- /dev/null +++ b/R/factorize @@ -0,0 +1,7 @@ +#' Factorize tensor product effect +#' +#' @export + +factorize <- factorise <- function(x, ...) { + UseMethod("factorize") +} From db124dcd965fc80e15069f3044bb8dfd2f67def2 Mon Sep 17 00:00:00 2001 From: "stoeckea.hub" Date: Tue, 14 Jun 2022 22:18:29 +0200 Subject: [PATCH 02/56] test commit with fac --- R/factorize.R | 11 +++++++++++ man/factorize.Rd | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 R/factorize.R create mode 100644 man/factorize.Rd diff --git a/R/factorize.R b/R/factorize.R new file mode 100644 index 0000000..5e4ce17 --- /dev/null +++ b/R/factorize.R @@ -0,0 +1,11 @@ + +#' Factorize tensor product effects +#' +#' @export +#' @name factorize + +factorize <- factorise <- function(x, ...) { + UseMethod("factorize") +} + +factorize.default <- function(x, ...) stop("No default factorization.") \ No newline at end of file diff --git a/man/factorize.Rd b/man/factorize.Rd new file mode 100644 index 0000000..0cced70 --- /dev/null +++ b/man/factorize.Rd @@ -0,0 +1,11 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/factorize.R +\name{factorize} +\alias{factorize} +\title{Factorize tensor product effects} +\usage{ +factorize(x, ...) +} +\description{ +Factorize tensor product effects +} From c86142e08126f67dcbee5d9a12b301e3c6d9b437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Almond=20St=C3=B6cker?= Date: Tue, 14 Jun 2022 22:27:12 +0200 Subject: [PATCH 03/56] check --- DESCRIPTION | 2 +- NAMESPACE | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 17f9a88..da03039 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -57,7 +57,7 @@ Collate: 'methods.R' 'stabsel.R' 'utilityFunctions.R' -RoxygenNote: 7.1.1 +RoxygenNote: 7.2.0 BugReports: https://github.com/boost-R/FDboost/issues URL: https://github.com/boost-R/FDboost VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index 6fca0e5..5cf7c3b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -44,6 +44,7 @@ export(bsignal) export(clr) export(cvLong) export(cvMa) +export(factorize) export(funMRD) export(funMSE) export(funRsquared) From ea80e02185f57a37dd78ea51af3e0b5b0a7ac618 Mon Sep 17 00:00:00 2001 From: Sarah Brockhaus Date: Tue, 14 Jun 2022 23:27:32 +0200 Subject: [PATCH 04/56] adapt DESCRIPTION --- DESCRIPTION | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index da03039..48c0494 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: FDboost Type: Package Title: Boosting Functional Regression Models -Version: 1.0-0 -Date: 2020-08-31 +Version: 1.1-0 +Date: 2022-06-14 Authors@R: c(person("Sarah", "Brockhaus", role = "aut", email = "Sarah.Brockhaus@stat.uni-muenchen.de"), person("David", "Ruegamer", role = c("aut", "cre"), @@ -41,7 +41,7 @@ Suggests: refund, testthat License: GPL-2 -Packaged: 2020-06-20 12:19:33 UTC; brockhaus +Packaged: 2022-06-14 12:19:33 UTC; brockhaus Collate: 'aaa.R' 'FDboost-package.R' @@ -52,12 +52,14 @@ Collate: 'clr_functions.R' 'constrainedX.R' 'crossvalidation.R' + 'factorize.R' 'FDboostLSS.R' 'hmatrix.R' 'methods.R' 'stabsel.R' 'utilityFunctions.R' RoxygenNote: 7.2.0 +Encoding: UTF-8 BugReports: https://github.com/boost-R/FDboost/issues URL: https://github.com/boost-R/FDboost VignetteBuilder: knitr From e00b7d621e7c80c820c29437b2c52e89674560ee Mon Sep 17 00:00:00 2001 From: Sarah Brockhaus Date: Tue, 14 Jun 2022 23:28:16 +0200 Subject: [PATCH 05/56] delete factorize without file ending --- R/factorize | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 R/factorize diff --git a/R/factorize b/R/factorize deleted file mode 100644 index 9232664..0000000 --- a/R/factorize +++ /dev/null @@ -1,7 +0,0 @@ -#' Factorize tensor product effect -#' -#' @export - -factorize <- factorise <- function(x, ...) { - UseMethod("factorize") -} From a700b19bcb442e25f105845331edcbd261aaf48d Mon Sep 17 00:00:00 2001 From: Sarah Brockhaus Date: Tue, 14 Jun 2022 23:30:24 +0200 Subject: [PATCH 06/56] add @param to roxygen code for manuals --- R/factorize.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/factorize.R b/R/factorize.R index 5e4ce17..3ecfd71 100644 --- a/R/factorize.R +++ b/R/factorize.R @@ -1,6 +1,9 @@ #' Factorize tensor product effects #' +#' @param x input +#' @param ... additional parameters +#' #' @export #' @name factorize @@ -8,4 +11,4 @@ factorize <- factorise <- function(x, ...) { UseMethod("factorize") } -factorize.default <- function(x, ...) stop("No default factorization.") \ No newline at end of file +factorize.default <- function(x, ...) stop("No default factorization.") From b51770add95f1f5ad4cedc89f84d068a4b4663e1 Mon Sep 17 00:00:00 2001 From: almond-s Date: Wed, 15 Jun 2022 11:30:34 +0200 Subject: [PATCH 07/56] factorize.FDboost method, tests, and respective plotting/prediction methods --- NAMESPACE | 6 + R/factorize.R | 352 ++++++++++++++++++++++++++++++- man/FDboost_fac-class.Rd | 15 ++ man/factorize.Rd | 328 +++++++++++++++++++++++++++- man/predict.FDboost_fac.Rd | 37 ++++ tests/factorize_test_irregular.R | 174 +++++++++++++++ tests/factorize_test_regular.R | 110 ++++++++++ 7 files changed, 1014 insertions(+), 8 deletions(-) create mode 100644 man/FDboost_fac-class.Rd create mode 100644 man/predict.FDboost_fac.Rd create mode 100644 tests/factorize_test_irregular.R create mode 100644 tests/factorize_test_regular.R diff --git a/NAMESPACE b/NAMESPACE index 5cf7c3b..e261bc2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,7 @@ S3method("[",hmatrix) S3method(coef,FDboost) S3method(cvrisk,FDboost) S3method(cvrisk,FDboostLSS) +S3method(factorize,FDboost) S3method(fitted,FDboost) S3method(getArgvals,hmatrix) S3method(getArgvalsLab,hmatrix) @@ -18,6 +19,7 @@ S3method(plot,FDboost) S3method(plot,bootstrapCI) S3method(plot,validateFDboost) S3method(predict,FDboost) +S3method(predict,FDboost_fac) S3method(print,FDboost) S3method(print,bootstrapCI) S3method(print,validateFDboost) @@ -70,10 +72,13 @@ export(subset_hmatrix) export(truncateTime) export(validateFDboost) export(wide2long) +exportClasses(FDboost_fac) import(Matrix) import(mboost) import(methods) importFrom(MASS,Null) +importFrom(MASS,ginv) +importFrom(Matrix,rankMatrix) importFrom(gamboostLSS,GaussianLSS) importFrom(gamboostLSS,GaussianMu) importFrom(gamboostLSS,GaussianSigma) @@ -92,6 +97,7 @@ importFrom(graphics,par) importFrom(graphics,persp) importFrom(graphics,plot) importFrom(graphics,points) +importFrom(methods,setOldClass) importFrom(mgcv,gam) importFrom(mgcv,s) importFrom(parallel,mclapply) diff --git a/R/factorize.R b/R/factorize.R index 3ecfd71..5f0022d 100644 --- a/R/factorize.R +++ b/R/factorize.R @@ -1,14 +1,354 @@ -#' Factorize tensor product effects -#' -#' @param x input -#' @param ... additional parameters +#' Factorize tensor product model #' +#' Factorize an FDboost tensor product model into the response and covariate parts +#' \deqn{h_j(x, t) = \sum_{k} v_j^{(k)}(t) h_j^{(k)}(x), j = 1, ..., J,} +#' for effect visualization as proposed in Stoecker and Greven (2021). +#' +#' @param x a model object of class FDboost. +#' @param ... other arguments passed to methods. +#' +#' @details The mboost infrastructure is used for handling the orthogonal response +#' directions \eqn{v_j^{(k)}(t)} in one \code{mboost}-object +#' (with \eqn{k} running over iteration indices) and the effects into the respective +#' directions \eqn{h_j^{(k)}(t)} in another, both of subclass \code{FDboost_fac}. +#' +#' @return a list of two mboost models of class \code{FDboost_fac} containing basis functions +#' for response and covariates, respectively, as base-learners. #' @export +#' #' @name factorize - +#' @aliases factorise factorize.FDboost +#' @importFrom MASS ginv +#' @importFrom Matrix rankMatrix +#' @seealso [FDboost_fac-class] +#' +#' @references +#' Stoecker, A. and Greven, S. (2021): +#' Functional additive models on manifolds of planar shapes and forms +#' +#' +#' +#' @example tests/factorize_test_irregular.R +#' @example tests/factorize_test_regular.R +#' factorize <- factorise <- function(x, ...) { UseMethod("factorize") } -factorize.default <- function(x, ...) stop("No default factorization.") +#' @param newdata new data the factorization is based on. +#' By default (\code{NULL}), the factorization is carried out on the data used for fitting. +#' @param newweights vector of the length of the data or length one, +#' containing new weights used for factorization. +#' @param blwise logical, should the factorization be carried out base-learner-wise (\code{TRUE}, default) +#' or for the whole model simultaneously. +#' +#' @method factorize FDboost +#' @export +#' @rdname factorize +factorize.FDboost <- function(x, newdata = NULL, newweights = 1, blwise = TRUE, ...) { + + FDboost_regular <- !inherits(x, c("FDboostScalar", "FDboostLong")) + + nd <- !is.null(newdata) + + # built subdata + dat <- list() + dat$cov <- if(!nd) x$data + else newdata[names(x$data)] + dat$cov[[x$yname]] <- rep(1, min(lengths(dat$cov))) + if(is.list(x$yind)) { + dat$resp <- if(!nd) x$yind else newdata[names(x$yind)] + } else { + dat$resp <- if(!nd) setNames(list(x$yind), + attr(x$yind, "nameyind")) else + newdata[attr(x$yind, "nameyind")] + } + dat$resp <- as.data.frame(dat$resp) + dat$resp[[x$yname]] <- 1 + + # extract formulae + formulae <- list() + formulae$cov <- as.formula(x$formulaFDboost) + formulae$resp <- as.formula(paste(x$yname, x$timeformula)) + + # set up component models + mod <- list() + # standard mboost model for covariates + mod$cov <- mboost(formulae$cov, + data = dat$cov, + offset = 0, + control = boost_control(mstop = 0, nu = 1)) + # artificial FDboost intercept model for response + mod$resp <- mboost(formulae$resp, + data = dat$resp, + offset = if(FDboost_regular) + matrix(x$offset, nrow = x$ydim[1])[1,] else + x$offset, + control = boost_control(mstop = 0, nu = 1)) + # copy essential parts from base model to response + which_vars <- c("yname", "ydim", "predictOffset", "withIntercept", + "callEval", "timeformula", "formulaFDboost", + "formulaMboost", "family", "(weights)", "id") + cls <- class(mod$resp) + mod$resp[which_vars] <- unclass(x)[which_vars] + if(FDboost_regular) mod$resp$ydim <- c(1, x$ydim[2]) + mod$resp$yind <- range(x$yind) + attr(mod$resp$yind, "nameyind") <- attr(x$yind, "nameyind") + if(FDboost_regular) + class(mod$resp) <- c("FDboostLong", class(x)) else + class(mod$resp) <- class(x) + + if(nd) { + if(length(newweights)==1) + mod$resp[["(weights)"]] <- rep(newweights, length(dat$resp[[x$yname]])) else { + stopifnot(length(newweights) == length(dat$resp[[x$yname]])) + mod$resp[["(weights)"]] <- newweights + } + mod$resp$id <- newdata[[attr(mod$resp$id, "nameid")]] + } + + # set to FDboost_fac class + for(i in names(mod)) + class(mod[[i]]) <- c("FDboost_fac", class(mod[[i]])) + + # get coefficients (only of selected learners) + bl_selected <- x$which(usedonly = TRUE) + cf <- coef(x, raw = TRUE, which = bl_selected) + + # extract design matrices + + X <- list( + cov = extract(mod$cov, what = "design", which = bl_selected), + resp = extract(mod$resp, what = "design", which = 1) + ) + index <- list( + cov = extract(mod$cov, what = "index", which = bl_selected), + resp = extract(mod$resp, what = "index", which = 1) + ) + + wghts <- mod$resp$`(weights)` + + if(is.null(wghts)) { + wghts <- list(cov = 1, resp = 1) + } else { + if(FDboost_regular) { + + dim(wghts) <- x$ydim + wghts <- list( + cov = rowMeans(wghts), + resp = wghts[1, ] + ) + } else { + wghts <- list(cov = as.vector(tapply(wghts, mod$resp$id, mean))) + wghts$resp <- mod$resp[["(weights)"]] / wghts$cov[mod$resp$id] + } + } + + wghts <- Map(function(w, idx) { + lapply(idx, function(i) { + if(is.null(i)) w else + c(tapply(w, i, sum)) + }) + }, wghts, index) + + # multiply sqrt(weights) to X to take them into account + X <- Map(function(x,w) { + Map(function(.x, .w) sqrt(.w) * .x, x,w) + }, X, wghts) + # NOTE: X is now sqrt(w) * X ! + + # do QR decomposition to achieve orthonormal basis representation + QR <- lapply(X, lapply, qr) + ## extract Q as orthonormal version of X + # Q <- lapply(QR, lapply, qr.Q) # not necessary + + # transform cf accordingly + R <- lapply(QR, lapply, function(x) { + if(inherits(x, "qr")) + qr.R(x)[, order(x$pivot)] else + qrR(x, backPermute = TRUE) }) + + cf <- Map(matrix, cf, nrow = lapply(X$cov, ncol), byrow = !FDboost_regular) + cf <- Map(function(r1, o) r1 %*% tcrossprod(o, R$resp[[1]]), R$cov, cf) + + # perform SVD on cf + if(blwise) { + SVD <- lapply(cf, svd) + Ud <- lapply(SVD, function(x) sweep(x$u, 2, x$d, "*")) + d2 <- list(cov = lapply(SVD, function(x) (x$d)^2)) + V <- lapply(SVD, `[[`, "v") + rm(SVD) + } else { + cf <- do.call(rbind, cf) + SVD <- svd(cf) + cfidx <- relist(seq_len(nrow(cf)), + lapply(X$cov, function(x) numeric(ncol(x)))) + Ud <- lapply(cfidx, function(idx) + sweep(SVD$u[idx, , drop = FALSE], 2, SVD$d, "*")) + d2 <- list( + cov = lapply(Ud, function(ud) colSums(ud^2)), + resp = SVD$d^2 + ) + V <- list(model = SVD$v) + rm(SVD) + } + + # compute new coefs + d_max <- sqrt(max(unlist(d2))) + if(d_max == 0) d_max <- 1 + cf <- list() + my_solve <- function(a, b) { + ret <- try(solve(a, b), silent = TRUE) + if(inherits(ret, "try-error")) { + ret <- ginv(a) %*% b + } + ret + } + cf$cov <- Map(function(R, du) { + as.matrix(my_solve(R, du)) / d_max + }, R$cov, Ud) + cf$resp <- setNames( + lapply(V, my_solve, a = R$resp[[1]] / d_max), + nm = if(blwise) + paste0(names(X$resp)[1], " [", names(X$cov), "]") else + names(X$resp)[1] + ) + .no_mat <- which(!sapply(cf$resp, is.matrix)) + cf$resp[.no_mat] <- + lapply(cf$resp[.no_mat], as.matrix) + # drop dimension discrepancies + if(length(cf$cov) == length(cf$resp)) { + for(bl in seq_along(cf$cov)) { + nc <- min(NCOL(cf$cov[[bl]]), NCOL(cf$resp[[bl]])) + cf$cov[[bl]] <- cf$cov[[bl]][, 1:nc, drop = FALSE] + cf$resp[[bl]] <- cf$resp[[bl]][, 1:nc, drop = FALSE] + } + } + for(bl in seq_along(cf$cov)) { + d2$cov[[bl]] <- head(d2$cov[[bl]], NCOL(cf$cov[[bl]])) + } + + # decomposition complete - now prepare output --------------- + + # get model environments + e <- lapply(mod, function(m) environment(m$predict)) + + # clone and equip baselearners + bl_dims <- lapply(cf, sapply, NCOL) + # vector for cloning bls + bl_mltpl <- list( + cov = rep(seq_along(bl_dims$cov), bl_dims$cov), + resp = rep(1, sum(bl_dims$resp)) + ) + bl_names <- Map(function(.cf, .bl_dims) + unlist(Map(function(name, len) paste0(name, " [", seq_len(len), "]"), + names(.cf), .bl_dims), use.names = FALSE), + cf, bl_dims) + # order of newly generated bls with respect to their variance + d2l <- lapply(d2, unlist) + bl_order <- Map(function(bmlt, d2) order(bmlt)[order(d2, decreasing = TRUE)], + bl_mltpl, d2l) + + for(i in names(mod)) { + this_select <- if(i=="cov") bl_selected else 1 + mod[[i]]$baselearner <- e[[i]]$blg <- setNames( + e[[i]]$blg[this_select][bl_mltpl[[i]]], bl_names[[i]]) + mod[[i]]$basemodel <- e[[i]]$bl <- setNames( + e[[i]]$bl[this_select][bl_mltpl[[i]]], bl_names[[i]]) + e[[i]]$bnames <- bl_names[[i]] + # fill in coefs with bl order decreasing with explained variance + e[[i]]$xselect <- bl_order[[i]] + e[[i]]$ens <- unlist(lapply(cf[[i]], asplit, 2), recursive = FALSE) + e[[i]]$ens <- Map( function(x, cls) { + bm <- list(model = x) + class(bm) <- gsub("bl", "bm", cls) + bm + }, + x = e[[i]]$ens[bl_order[[i]]], + cls = lapply(mod[[i]]$basemodel, class)[bl_order[[i]]]) + # add risk + this_d2l <- d2l[[i]] + if(is.null(this_d2l)) + this_d2l <- d2l[[1]] + e[[i]]$mrisk <- sum(this_d2l) - + cumsum(c(0,sort(this_d2l, decreasing = TRUE))) + # engage full number of components + mod[[i]]$subset(sum(this_d2l>0)) + } + + # return factor models + mod +} + + +# define class and methods ---------------------------------------------------- + +#' @importFrom methods setOldClass +#' @exportClass FDboost_fac + +setOldClass("FDboost_fac") + +#' `FDboost_fac` S3 class for factorized FDboost model components +#' +#' @description Model factorization with `factorize()` decomposes an +#' `FDboost` model into two objects of class `FDboost_fac` - one for the +#' response and one for the covariate predictor. The first is essentially +#' an `FDboost` object and the second an `mboost` object, however, +#' in a 'read-only' mode and slightly adjusted methods (method defaults). +#' +#' @name FDboost_fac-class +#' @seealso [factorize(), factorize.FDboost()] +NULL + + + +#' Prediction and plotting for factorized FDboost model components +#' +#' @param object,x a model-factor given as a \code{FDboost_fac} object +#' @param newdata optionally, a data frame or list +#' in which to look for variables with which to predict. +#' See \code{\link{predict.mboost}}. +#' @param which a subset of base-learner components to take into +#' account for computing predictions or coefficients. Different +#' components are never aggregated to a joint prediction, but always +#' returned as a matrix or list. Select the k-th component +#' by name in the format \code{bl(x, ...)[k]} or all components of a base-learner +#' by dropping the index or all base-learners of a variable by using +#' the variable name. +#' @param main the plot title. By default, base-learner names are used with +#' component numbers \code{[k]}. +#' @param ... additional arguments passed to underlying methods. +#' +#' @method predict FDboost_fac +#' +#' @export +#' @name predict.FDboost_fac +#' @aliases plot.FDboost_fac +#' +#' @seealso [factorize(), factorize.FDboost()] +#' +predict.FDboost_fac <- function(object, newdata = NULL, which = NULL, ...) { + w <- object$which(which) + if(any(is.na(w))) + stop("Don't know 'which' base-learner is meant.") + names(w) <- names(object$baselearner)[w] + drop(sapply(w, + function(x) predict.mboost(which = x, + object = object, + newdata = newdata, + aggregate = "sum", ...))) +} + +#' @method plot FDboost_fac +#' @rdname predict.FDboost_fac +plot.FDboost_fac <- function(x, which = NULL, main = NULL, ...) { + w <- x$which(which, usedonly = TRUE) + if(any(is.na(w))) + stop(paste("Don't know which base-learner is meant by:", + which[which.min(is.na(w))])) + if(is.null(main)) + main <- names(x$baselearner)[w] + for(i in seq_along(w)) + plot.mboost(x, which = w[i], main = main[i], ...) +} \ No newline at end of file diff --git a/man/FDboost_fac-class.Rd b/man/FDboost_fac-class.Rd new file mode 100644 index 0000000..f470d1f --- /dev/null +++ b/man/FDboost_fac-class.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/factorize.R +\name{FDboost_fac-class} +\alias{FDboost_fac-class} +\title{`FDboost_fac` S3 class for factorized FDboost model components} +\description{ +Model factorization with `factorize()` decomposes an +`FDboost` model into two objects of class `FDboost_fac` - one for the +response and one for the covariate predictor. The first is essentially +an `FDboost` object and the second an `mboost` object, however, +in a 'read-only' mode and slightly adjusted methods (method defaults). +} +\seealso{ +[factorize(), factorize.FDboost()] +} diff --git a/man/factorize.Rd b/man/factorize.Rd index 0cced70..5f7acc5 100644 --- a/man/factorize.Rd +++ b/man/factorize.Rd @@ -2,10 +2,334 @@ % Please edit documentation in R/factorize.R \name{factorize} \alias{factorize} -\title{Factorize tensor product effects} +\alias{factorise} +\alias{factorize.FDboost} +\title{Factorize tensor product model} \usage{ factorize(x, ...) + +\method{factorize}{FDboost}(x, newdata = NULL, newweights = 1, blwise = TRUE, ...) +} +\arguments{ +\item{x}{a model object of class FDboost.} + +\item{...}{other arguments passed to methods.} + +\item{newdata}{new data the factorization is based on. +By default (\code{NULL}), the factorization is carried out on the data used for fitting.} + +\item{newweights}{vector of the length of the data or length one, +containing new weights used for factorization.} + +\item{blwise}{logical, should the factorization be carried out base-learner-wise (\code{TRUE}, default) +or for the whole model simultaneously.} +} +\value{ +a list of two mboost models of class \code{FDboost_fac} containing basis functions +for response and covariates, respectively, as base-learners. } \description{ -Factorize tensor product effects +Factorize an FDboost tensor product model into the response and covariate parts +\deqn{h_j(x, t) = \sum_{k} v_j^{(k)}(t) h_j^{(k)}(x), j = 1, ..., J,} +for effect visualization as proposed in Stoecker and Greven (2021). +} +\details{ +The mboost infrastructure is used for handling the orthogonal response +directions \eqn{v_j^{(k)}(t)} in one \code{mboost}-object +(with \eqn{k} running over iteration indices) and the effects into the respective +directions \eqn{h_j^{(k)}(t)} in another, both of subclass \code{FDboost_fac}. +} +\examples{ +library(FDboost) + +# generate irregular toy data ------------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time & id +set.seed(90384) +t <- runif(n = n*m, -pi,pi) +id <- sample(1:n, size = n*m, replace = TRUE) + +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) + +mu1 <- d[1] * fx[[1]][id] * ft[[1]] +mu2 <- d[2] * fx[[2]][id] * ft[[2]] +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] + +mu3 <- d[3] * fx[[3]][id] * ft[[3]] + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]], id = id) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), + id = ~ id, + offset = 0, #numInt = "Riemann", + control = boost_control(nu = 1), + data = dat) +MU <- split(mu, id) +PRED <- split(predict(m), id) +Ti <- split(t, id) +t0 <- seq(-pi, pi, length.out = 40) +MU <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + MU, Ti)) +PRED <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PRED, Ti)) + +opar <- par(mfrow = c(2,2)) +image(t0, x, MU) +contour(t0, x, MU, add = TRUE) +image(t0, x, PRED) +contour(t0, x, PRED, add = TRUE) +persp(t0, x, MU, zlim = range(c(MU, PRED), na.rm = TRUE)) +persp(t0, x, PRED, zlim = range(c(MU, PRED), na.rm = TRUE)) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, sort(vi$reduction, decreasing = TRUE)[1:3]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in 1:length(wch)) { + plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose predictions +preds <- lapply(fac, predict) +predf <- rowSums(preds$resp * preds$cov[id, ]) +PREDf <- split(predf, id) +PREDf <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PREDf, Ti)) +opar <- par(mfrow = c(1,2)) +image(t0,x, PRED, main = "original prediction") +contour(t0,x, PRED, add = TRUE) +image(t0,x,PREDf, main = "recomposed") +contour(t0,x, PREDf, add = TRUE) +par(opar) + +stopifnot(all.equal(PRED, PREDf)) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + + +# check factorization on a new dataset ------------------------------------ + +t_grid <- seq(-pi,pi,len = 30) +x_grid <- seq(0,2,len = 30) +x_lin_grid <- seq(min(dat$x_lin), max(dat$x_lin), len = 30) + +# use grid data for factorization +griddata <- expand.grid( + # time + t = t_grid, + # covariates + x = x_grid, + x_lin = 0 +) + +griddata_lin <- expand.grid( + t = seq(-pi, pi, len = 30), + x = 0, + x_lin = x_lin_grid +) + +griddata <- rbind(griddata, griddata_lin) + +griddata$id <- as.numeric(factor(paste(griddata$x, griddata$x_lin, sep = ":"))) + +fac2 <- factorize(m, newdata = griddata) + +ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, which = 1))) + +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in 1:length(wch)) { + plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + + lines(sort(griddata$t), + ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + this_x <- fac2$cov$model.frame(which = wch[w])[[1]][[1]] + lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], col = cols[w], lty = 1) +} +par(opar) + +# check predictions +p <- predict(fac2$resp, which = 1) +library(FDboost) + +# generate regular toy data -------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time +t <- seq(-pi,pi,len = m) +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) +mu1 <- d[1] * fx[[1]] \%*\% t(ft[[1]]) +mu2 <- d[2] * fx[[2]] \%*\% t(ft[[2]]) +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] +mu3 <- d[3] * fx[[3]] \%*\% t(ft[[3]]) + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]]) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), offset = 0, + control = boost_control(nu = 1), + data = dat) + +opar <- par(mfrow = c(1,2)) +image(t, x, t(mu)) +contour(t, x, t(mu), add = TRUE) +image(t, x, t(predict(m))) +contour(t, x, t(predict(m)), add = TRUE) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, vi$reduction[c(1:2, 10)]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in 1:length(wch)) { + plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose prediction +preds <- lapply(fac, predict) +PREDSf <- array(0, dim = c(nrow(preds$resp),nrow(preds$cov))) +for(i in 1:ncol(preds$resp)) + PREDSf <- PREDSf + preds$resp[,i] \%*\% t(preds$cov[,i]) + +opar <- par(mfrow = c(1,2)) +image(t,x, t(predict(m)), main = "original prediction") +contour(t,x, t(predict(m)), add = TRUE) +image(t,x,PREDSf, main = "recomposed") +contour(t,x, PREDSf, add = TRUE) +par(opar) +# => matches +stopifnot(all.equal(as.numeric(t(predict(m))), as.numeric(PREDSf))) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + +} +\references{ +Stoecker, A. and Greven, S. (2021): +Functional additive models on manifolds of planar shapes and forms + +} +\seealso{ +[FDboost_fac-class] } diff --git a/man/predict.FDboost_fac.Rd b/man/predict.FDboost_fac.Rd new file mode 100644 index 0000000..2bb2643 --- /dev/null +++ b/man/predict.FDboost_fac.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/factorize.R +\name{predict.FDboost_fac} +\alias{predict.FDboost_fac} +\alias{plot.FDboost_fac} +\title{Prediction and plotting for factorized FDboost model components} +\usage{ +\method{predict}{FDboost_fac}(object, newdata = NULL, which = NULL, ...) + +\method{plot}{FDboost_fac}(x, which = NULL, main = NULL, ...) +} +\arguments{ +\item{object, x}{a model-factor given as a \code{FDboost_fac} object} + +\item{newdata}{optionally, a data frame or list +in which to look for variables with which to predict. +See \code{\link{predict.mboost}}.} + +\item{which}{a subset of base-learner components to take into +account for computing predictions or coefficients. Different +components are never aggregated to a joint prediction, but always +returned as a matrix or list. Select the k-th component +by name in the format \code{bl(x, ...)[k]} or all components of a base-learner +by dropping the index or all base-learners of a variable by using +the variable name.} + +\item{...}{additional arguments passed to underlying methods.} + +\item{main}{the plot title. By default, base-learner names are used with +component numbers \code{[k]}.} +} +\description{ +Prediction and plotting for factorized FDboost model components +} +\seealso{ +[factorize(), factorize.FDboost()] +} diff --git a/tests/factorize_test_irregular.R b/tests/factorize_test_irregular.R new file mode 100644 index 0000000..b794ec3 --- /dev/null +++ b/tests/factorize_test_irregular.R @@ -0,0 +1,174 @@ +library(FDboost) + +# generate irregular toy data ------------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time & id +set.seed(90384) +t <- runif(n = n*m, -pi,pi) +id <- sample(1:n, size = n*m, replace = TRUE) + +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) + +mu1 <- d[1] * fx[[1]][id] * ft[[1]] +mu2 <- d[2] * fx[[2]][id] * ft[[2]] +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] + +mu3 <- d[3] * fx[[3]][id] * ft[[3]] + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]], id = id) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), + id = ~ id, + offset = 0, #numInt = "Riemann", + control = boost_control(nu = 1), + data = dat) +MU <- split(mu, id) +PRED <- split(predict(m), id) +Ti <- split(t, id) +t0 <- seq(-pi, pi, length.out = 40) +MU <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + MU, Ti)) +PRED <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PRED, Ti)) + +opar <- par(mfrow = c(2,2)) +image(t0, x, MU) +contour(t0, x, MU, add = TRUE) +image(t0, x, PRED) +contour(t0, x, PRED, add = TRUE) +persp(t0, x, MU, zlim = range(c(MU, PRED), na.rm = TRUE)) +persp(t0, x, PRED, zlim = range(c(MU, PRED), na.rm = TRUE)) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, sort(vi$reduction, decreasing = TRUE)[1:3]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in 1:length(wch)) { + plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose predictions +preds <- lapply(fac, predict) +predf <- rowSums(preds$resp * preds$cov[id, ]) +PREDf <- split(predf, id) +PREDf <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PREDf, Ti)) +opar <- par(mfrow = c(1,2)) +image(t0,x, PRED, main = "original prediction") +contour(t0,x, PRED, add = TRUE) +image(t0,x,PREDf, main = "recomposed") +contour(t0,x, PREDf, add = TRUE) +par(opar) + +stopifnot(all.equal(PRED, PREDf)) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + + +# check factorization on a new dataset ------------------------------------ + +t_grid <- seq(-pi,pi,len = 30) +x_grid <- seq(0,2,len = 30) +x_lin_grid <- seq(min(dat$x_lin), max(dat$x_lin), len = 30) + +# use grid data for factorization +griddata <- expand.grid( + # time + t = t_grid, + # covariates + x = x_grid, + x_lin = 0 +) + +griddata_lin <- expand.grid( + t = seq(-pi, pi, len = 30), + x = 0, + x_lin = x_lin_grid +) + +griddata <- rbind(griddata, griddata_lin) + +griddata$id <- as.numeric(factor(paste(griddata$x, griddata$x_lin, sep = ":"))) + +fac2 <- factorize(m, newdata = griddata) + +ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, which = 1))) + +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in 1:length(wch)) { + plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + + lines(sort(griddata$t), + ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + this_x <- fac2$cov$model.frame(which = wch[w])[[1]][[1]] + lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], col = cols[w], lty = 1) +} +par(opar) + +# check predictions +p <- predict(fac2$resp, which = 1) diff --git a/tests/factorize_test_regular.R b/tests/factorize_test_regular.R new file mode 100644 index 0000000..0ab401a --- /dev/null +++ b/tests/factorize_test_regular.R @@ -0,0 +1,110 @@ +library(FDboost) + +# generate regular toy data -------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time +t <- seq(-pi,pi,len = m) +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) +mu1 <- d[1] * fx[[1]] %*% t(ft[[1]]) +mu2 <- d[2] * fx[[2]] %*% t(ft[[2]]) +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] +mu3 <- d[3] * fx[[3]] %*% t(ft[[3]]) + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]]) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), offset = 0, + control = boost_control(nu = 1), + data = dat) + +opar <- par(mfrow = c(1,2)) +image(t, x, t(mu)) +contour(t, x, t(mu), add = TRUE) +image(t, x, t(predict(m))) +contour(t, x, t(predict(m)), add = TRUE) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, vi$reduction[c(1:2, 10)]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in 1:length(wch)) { + plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose prediction +preds <- lapply(fac, predict) +PREDSf <- array(0, dim = c(nrow(preds$resp),nrow(preds$cov))) +for(i in 1:ncol(preds$resp)) + PREDSf <- PREDSf + preds$resp[,i] %*% t(preds$cov[,i]) + +opar <- par(mfrow = c(1,2)) +image(t,x, t(predict(m)), main = "original prediction") +contour(t,x, t(predict(m)), add = TRUE) +image(t,x,PREDSf, main = "recomposed") +contour(t,x, PREDSf, add = TRUE) +par(opar) +# => matches +stopifnot(all.equal(as.numeric(t(predict(m))), as.numeric(PREDSf))) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + From c4009a0d4eb33077c49d50ec52877e416e708b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Almond=20St=C3=B6cker?= Date: Sat, 18 Jun 2022 12:08:27 +0200 Subject: [PATCH 08/56] NEW updated --- inst/NEWS.Rd | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/inst/NEWS.Rd b/inst/NEWS.Rd index e946607..e2c76b2 100644 --- a/inst/NEWS.Rd +++ b/inst/NEWS.Rd @@ -1,6 +1,15 @@ \name{NEWS} \title{News for Package 'FDboost'} +\section{Changes in FDboost version 1.0-3 (2022-06-15)}{ + \subsection{New feature}{ + \itemize{ + \item Function \code{factorize} added for tensor-product factorization of + estimated effects or models. + } + } +} + \section{Changes in FDboost version 0.3-4 (2020-08-31)}{ \subsection{Bug-fixes}{ \itemize{ From 6bb21008e9c1e1d50c6e9b52866d63a78b61a507 Mon Sep 17 00:00:00 2001 From: almond-s Date: Tue, 12 Jul 2022 16:06:58 +0200 Subject: [PATCH 09/56] factorize added to FDboost-package.R --- R/FDboost-package.R | 13 +++++++++++++ man/FDboost-package.Rd | 14 +++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/R/FDboost-package.R b/R/FDboost-package.R index 7213a60..fd7c1f9 100644 --- a/R/FDboost-package.R +++ b/R/FDboost-package.R @@ -29,6 +29,15 @@ #' cross-validation or bootstrap. #' This can be done using the function \code{\link{applyFolds}}. #' +#' Aside from common effect surface plots, tensor product factorization via the +#' function \code{\link{factorize}} presents an alternative tool for visualization +#' of estimated effects for non-linear function-on-scalar models +#' (Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). +#' After factorization, effects are decomposed multiple scalar effects into +#' functional main effect directions, which can be separately plotted allowing to +#' visualize more complex effect structures. +#' +#' #' @references #' Brockhaus, S., Ruegamer, D. and Greven, S. (2017): #' Boosting Functional Regression Models with FDboost. @@ -60,6 +69,10 @@ #' Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. #' Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. #' +#' Stoecker A., Steyer L., Greven S. (2022): +#' Functional Additive Models on Manifolds of Planar Shapes and Forms. +#' arXiv preprint arXiv:2109.02624. +#' #' @author #' Sarah Brockhaus, David Ruegamer and Almond Stoecker #' diff --git a/man/FDboost-package.Rd b/man/FDboost-package.Rd index 9e1069c..9086b98 100644 --- a/man/FDboost-package.Rd +++ b/man/FDboost-package.Rd @@ -33,7 +33,15 @@ Like the fitting procedures in \pkg{mboost}, the function \code{FDboost} DOES NO select an appropriate stopping iteration. This must be chosen by the user. The user can determine an adequate stopping iteration by resampling methods like cross-validation or bootstrap. -This can be done using the function \code{\link{applyFolds}}. +This can be done using the function \code{\link{applyFolds}}. + +Aside from common effect surface plots, tensor product factorization via the +function \code{\link{factorize}} presents an alternative tool for visualization +of estimated effects for non-linear function-on-scalar models +(Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). +After factorization, effects are decomposed multiple scalar effects into +functional main effect directions, which can be separately plotted allowing to +visualize more complex effect structures. } \references{ Brockhaus, S., Ruegamer, D. and Greven, S. (2017): @@ -65,6 +73,10 @@ arXiv preprint arXiv:2110.11771. Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. + +Stoecker A., Steyer L., Greven S. (2022): +Functional Additive Models on Manifolds of Planar Shapes and Forms. +arXiv preprint arXiv:2109.02624. } \seealso{ \code{\link{FDboost}} for the main fitting function and From 5b1f89444e180cb9e84bf184dc40262d84aa9313 Mon Sep 17 00:00:00 2001 From: almond-s Date: Tue, 12 Jul 2022 16:11:27 +0200 Subject: [PATCH 10/56] reference Brockhaus, Ruegamer, Greven, JSS in FDboost-package.R updated --- R/FDboost-package.R | 7 ++++--- man/FDboost-package.Rd | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/R/FDboost-package.R b/R/FDboost-package.R index fd7c1f9..04c0dea 100644 --- a/R/FDboost-package.R +++ b/R/FDboost-package.R @@ -14,7 +14,7 @@ #' Details on the functional regression models that can be fitted with \pkg{FDboost} #' can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). #' A hands-on tutorial for the package can be found -#' in Brockhaus, Ruegamer and Greven (2017), see \url{https://arxiv.org/abs/1705.10662}. +#' in Brockhaus, Ruegamer and Greven (2020), see \url{https://doi.org/10.18637/jss.v094.i10}. #' For density-on-scalar regression models see Maier et al. (2021). #' #' Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on @@ -39,8 +39,9 @@ #' #' #' @references -#' Brockhaus, S., Ruegamer, D. and Greven, S. (2017): -#' Boosting Functional Regression Models with FDboost. +#' Brockhaus, S., Ruegamer, D. and Greven, S. (2020): +#' Boosting Functional Regression Models with FDboost. +#' Journal of Statistical Software, 94(10), 1–50. #' #' #' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): diff --git a/man/FDboost-package.Rd b/man/FDboost-package.Rd index 9086b98..0da93ad 100644 --- a/man/FDboost-package.Rd +++ b/man/FDboost-package.Rd @@ -20,7 +20,7 @@ Furthermore, the package can be used to fit density-on-scalar regression models. Details on the functional regression models that can be fitted with \pkg{FDboost} can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). A hands-on tutorial for the package can be found -in Brockhaus, Ruegamer and Greven (2017), see \url{https://arxiv.org/abs/1705.10662}. +in Brockhaus, Ruegamer and Greven (2020), see \url{https://doi.org/10.18637/jss.v094.i10}. For density-on-scalar regression models see Maier et al. (2021). Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on @@ -44,8 +44,9 @@ functional main effect directions, which can be separately plotted allowing to visualize more complex effect structures. } \references{ -Brockhaus, S., Ruegamer, D. and Greven, S. (2017): -Boosting Functional Regression Models with FDboost. +Brockhaus, S., Ruegamer, D. and Greven, S. (2020): +Boosting Functional Regression Models with FDboost. +Journal of Statistical Software, 94(10), 1–50. Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): From c75ba59772b55a7becb1d5983a9382b15a176089 Mon Sep 17 00:00:00 2001 From: almond-s Date: Tue, 12 Jul 2022 16:22:20 +0200 Subject: [PATCH 11/56] fix plots in factorize tests --- tests/factorize_test_irregular.R | 4 ++-- tests/factorize_test_regular.R | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/factorize_test_irregular.R b/tests/factorize_test_irregular.R index b794ec3..bd14743 100644 --- a/tests/factorize_test_irregular.R +++ b/tests/factorize_test_irregular.R @@ -93,7 +93,7 @@ cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) for(w in 1:length(wch)) { - plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) plot(fac$cov, which = wch[w], @@ -158,7 +158,7 @@ ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, wh opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) for(w in 1:length(wch)) { - plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(sort(griddata$t), diff --git a/tests/factorize_test_regular.R b/tests/factorize_test_regular.R index 0ab401a..27c357c 100644 --- a/tests/factorize_test_regular.R +++ b/tests/factorize_test_regular.R @@ -76,7 +76,7 @@ cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) for(w in 1:length(wch)) { - plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) plot(fac$cov, which = wch[w], From 2771e5714c98715484197be37c6b59a8cadd89e8 Mon Sep 17 00:00:00 2001 From: almond-s Date: Tue, 12 Jul 2022 16:34:22 +0200 Subject: [PATCH 12/56] factorize docu updated --- R/factorize.R | 9 ++++++--- man/factorize.Rd | 15 +++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/R/factorize.R b/R/factorize.R index 5f0022d..792b227 100644 --- a/R/factorize.R +++ b/R/factorize.R @@ -3,7 +3,7 @@ #' #' Factorize an FDboost tensor product model into the response and covariate parts #' \deqn{h_j(x, t) = \sum_{k} v_j^{(k)}(t) h_j^{(k)}(x), j = 1, ..., J,} -#' for effect visualization as proposed in Stoecker and Greven (2021). +#' for effect visualization as proposed in Stoecker, Steyer and Greven (2022). #' #' @param x a model object of class FDboost. #' @param ... other arguments passed to methods. @@ -11,7 +11,10 @@ #' @details The mboost infrastructure is used for handling the orthogonal response #' directions \eqn{v_j^{(k)}(t)} in one \code{mboost}-object #' (with \eqn{k} running over iteration indices) and the effects into the respective -#' directions \eqn{h_j^{(k)}(t)} in another, both of subclass \code{FDboost_fac}. +#' directions \eqn{h_j^{(k)}(t)} in another \code{mboost}-object, +#' both of subclass \code{FDboost_fac}. +#' The number of boosting iterations of \code{FDboost_fac}-objects cannot be +#' further increased as in regular \code{mboost}-objects. #' #' @return a list of two mboost models of class \code{FDboost_fac} containing basis functions #' for response and covariates, respectively, as base-learners. @@ -24,7 +27,7 @@ #' @seealso [FDboost_fac-class] #' #' @references -#' Stoecker, A. and Greven, S. (2021): +#' Stoecker, A., Steyer L. and Greven, S. (2022): #' Functional additive models on manifolds of planar shapes and forms #' #' diff --git a/man/factorize.Rd b/man/factorize.Rd index 5f7acc5..06d53d3 100644 --- a/man/factorize.Rd +++ b/man/factorize.Rd @@ -31,13 +31,16 @@ for response and covariates, respectively, as base-learners. \description{ Factorize an FDboost tensor product model into the response and covariate parts \deqn{h_j(x, t) = \sum_{k} v_j^{(k)}(t) h_j^{(k)}(x), j = 1, ..., J,} -for effect visualization as proposed in Stoecker and Greven (2021). +for effect visualization as proposed in Stoecker, Steyer and Greven (2022). } \details{ The mboost infrastructure is used for handling the orthogonal response directions \eqn{v_j^{(k)}(t)} in one \code{mboost}-object (with \eqn{k} running over iteration indices) and the effects into the respective -directions \eqn{h_j^{(k)}(t)} in another, both of subclass \code{FDboost_fac}. +directions \eqn{h_j^{(k)}(t)} in another \code{mboost}-object, +both of subclass \code{FDboost_fac}. +The number of boosting iterations of \code{FDboost_fac}-objects cannot be +further increased as in regular \code{mboost}-objects. } \examples{ library(FDboost) @@ -135,7 +138,7 @@ cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) for(w in 1:length(wch)) { - plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) plot(fac$cov, which = wch[w], @@ -200,7 +203,7 @@ ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, wh opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) for(w in 1:length(wch)) { - plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(sort(griddata$t), @@ -292,7 +295,7 @@ cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) for(w in 1:length(wch)) { - plot(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) plot(fac$cov, which = wch[w], @@ -326,7 +329,7 @@ cf <- coef(fac$resp, which = 1) } \references{ -Stoecker, A. and Greven, S. (2021): +Stoecker, A., Steyer L. and Greven, S. (2022): Functional additive models on manifolds of planar shapes and forms } From f5122a16f5350827e87eef635685903b0f271eb4 Mon Sep 17 00:00:00 2001 From: davidruegamer Date: Wed, 13 Jul 2022 07:09:15 +0200 Subject: [PATCH 13/56] update to match CRAN requirements --- NAMESPACE | 2 ++ R/FDboost-package.R | 2 +- R/FDboost.R | 14 +++++++------- R/methods.R | 6 +++--- man/FDboost-package.Rd | 2 +- man/factorize.Rd | 12 ++++++++---- tests/factorize_test_irregular.R | 9 ++++++--- tests/factorize_test_regular.R | 3 ++- vignettes/density-on-scalar_birth.Rnw | 4 +++- vignettes/density-on-scalar_birth.pdf | Bin 602948 -> 434197 bytes 10 files changed, 33 insertions(+), 21 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index e261bc2..0b1790e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -119,8 +119,10 @@ importFrom(stats,na.omit) importFrom(stats,predict) importFrom(stats,quantile) importFrom(stats,sd) +importFrom(stats,setNames) importFrom(stats,terms.formula) importFrom(stats,variable.names) importFrom(utils,getS3method) importFrom(utils,packageDescription) +importFrom(utils,relist) importFrom(zoo,na.locf) diff --git a/R/FDboost-package.R b/R/FDboost-package.R index 04c0dea..5a3ea2b 100644 --- a/R/FDboost-package.R +++ b/R/FDboost-package.R @@ -14,7 +14,7 @@ #' Details on the functional regression models that can be fitted with \pkg{FDboost} #' can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). #' A hands-on tutorial for the package can be found -#' in Brockhaus, Ruegamer and Greven (2020), see \url{https://doi.org/10.18637/jss.v094.i10}. +#' in Brockhaus, Ruegamer and Greven (2020), see . #' For density-on-scalar regression models see Maier et al. (2021). #' #' Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on diff --git a/R/FDboost.R b/R/FDboost.R index 3284b83..aeed4ba 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -431,8 +431,8 @@ #' @import methods Matrix mboost #' @importFrom grDevices heat.colors rgb #' @importFrom graphics abline barplot contour legend lines matplot par persp plot points -#' @importFrom utils getS3method packageDescription -#' @importFrom stats approx as.formula coef complete.cases fitted formula lm median model.matrix model.weights na.omit predict quantile sd terms.formula variable.names +#' @importFrom utils relist getS3method packageDescription +#' @importFrom stats setNames approx as.formula coef complete.cases fitted formula lm median model.matrix model.weights na.omit predict quantile sd terms.formula variable.names #' @importFrom gamboostLSS GaussianLSS GaussianMu GaussianSigma make.grid cvrisk.mboostLSS mboostLSS_fit #' @importFrom stabs stabsel stabsel_parameters #' @importFrom splines bs splineDesign @@ -471,8 +471,8 @@ FDboost <- function(formula, ### response ~ xvars } ## check formulas - if(class(try(id)) == "try-error") stop("id must either be NULL or a formula object.") - if(missing(timeformula) || class(try(timeformula)) == "try-error") + if(inherits(try(id), "try-error")) stop("id must either be NULL or a formula object.") + if(missing(timeformula) || inherits(try(timeformula), "try-error")) stop("timeformula must either be NULL or a formula object.") stopifnot(class(formula) == "formula") if(!is.null(timeformula)) stopifnot(class(timeformula) == "formula") @@ -817,7 +817,7 @@ FDboost <- function(formula, ### response ~ xvars }else{ bl_df <- vector("list", length(tmp)) bl_df[equalBrackets] <- lapply(tmp[equalBrackets], function(x) try(get_df(x))) - bl_df <- unlist(bl_df[equalBrackets & (!sapply(bl_df, class) %in% "try-error")]) + bl_df <- unlist(bl_df[equalBrackets & (!sapply(bl_df, function(x) inherits(x, "try-error")))]) #print(bl_df) if( !is.null(bl_df) && any(abs(bl_df - bl_df[1]) > .Machine$double.eps * 10^10) ){ @@ -1066,7 +1066,7 @@ FDboost <- function(formula, ### response ~ xvars silent = offset_control$silent ) } - if(any(class(modOffset) == "try-error")){ + if(inherits(modOffset, "try-error")){ warning(paste("Could not fit the smooth offset by adaptive splines (default), use a simple spline expansion with 5 df instead.", if(offset_control$cyclic) "This offset is not cyclic!")) if(round(length(time)/2) < 8) warning("Most likely because of too few time-points.") @@ -1121,7 +1121,7 @@ FDboost <- function(formula, ### response ~ xvars silent = offset_control$silent ) } - if(any(class(modOffset) == "try-error")){ + if(inherits(modOffset, "try-error")){ warning(paste("Could not fit the smooth offset by adaptive splines (default), use a simple spline expansion with 5 df instead.", if(offset_control$cyclic) "This offset is not cyclic!")) if(round(length(time)/2) < 8) warning("Most likely because of too few time-points.") diff --git a/R/methods.R b/R/methods.R index 2e62829..ea78d04 100644 --- a/R/methods.R +++ b/R/methods.R @@ -1284,7 +1284,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, ## short names for the terms, if shortnames() does not work, use the original names shrtlbls <- try(unlist(lapply(names(object$baselearner), shortnames))) - if(class(shrtlbls)=="try-error") shrtlbls <- names(object$baselearner) + if(inherits(shrtlbls, "try-error")) shrtlbls <- names(object$baselearner) ###### just return the data that is used for the prediction if(returnData){ @@ -1697,14 +1697,14 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, rm(temp) } - if(class(terms)!="list") terms <- list(terms) + if(!inherits(terms,"list")) terms <- list(terms) if(mstop(x) > 0 && length(which) == 1 && which == 0) terms[[1]] <- offset if(length(which) == 1 && length(terms[[1]]) == 1 && terms[[1]] == 0){ terms[[1]] <- rep(0, l=length(x$yind)) } #if(length(which)==1 && !any(class(x)=="FDboostLong")) terms <- list(terms) shrtlbls <- try(coef(x, which=which, computeCoef=FALSE))# get short names - if(class(shrtlbls) == "try-error"){ + if(inherits(shrtlbls, "try-error")){ shrtlbls <- names(x$baselearner)[which[which!=0]] if(0 %in% which) shrtlbls <- c("offset", which) } diff --git a/man/FDboost-package.Rd b/man/FDboost-package.Rd index 0da93ad..65ad3c8 100644 --- a/man/FDboost-package.Rd +++ b/man/FDboost-package.Rd @@ -20,7 +20,7 @@ Furthermore, the package can be used to fit density-on-scalar regression models. Details on the functional regression models that can be fitted with \pkg{FDboost} can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). A hands-on tutorial for the package can be found -in Brockhaus, Ruegamer and Greven (2020), see \url{https://doi.org/10.18637/jss.v094.i10}. +in Brockhaus, Ruegamer and Greven (2020), see . For density-on-scalar regression models see Maier et al. (2021). Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on diff --git a/man/factorize.Rd b/man/factorize.Rd index 06d53d3..b5244dd 100644 --- a/man/factorize.Rd +++ b/man/factorize.Rd @@ -127,7 +127,8 @@ par(opar) fac <- factorize(m) vi <- as.data.frame(varimp(fac$cov)) -lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) cbind(d^2, sort(vi$reduction, decreasing = TRUE)[1:3]) @@ -207,11 +208,13 @@ for(w in 1:length(wch)) { main = names(fac$resp$baselearner[wch[w]])) lines(sort(griddata$t), - ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], col = cols[w], lty = 2) + ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], + col = cols[w], lty = 2) plot(fac$cov, which = wch[w], main = names(fac$cov$baselearner[wch[w]])) this_x <- fac2$cov$model.frame(which = wch[w])[[1]][[1]] - lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], col = cols[w], lty = 1) + lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], + col = cols[w], lty = 1) } par(opar) @@ -284,7 +287,8 @@ par(opar) fac <- factorize(m) vi <- as.data.frame(varimp(fac$cov)) -lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) cbind(d^2, vi$reduction[c(1:2, 10)]) diff --git a/tests/factorize_test_irregular.R b/tests/factorize_test_irregular.R index bd14743..2e62a45 100644 --- a/tests/factorize_test_irregular.R +++ b/tests/factorize_test_irregular.R @@ -82,7 +82,8 @@ par(opar) fac <- factorize(m) vi <- as.data.frame(varimp(fac$cov)) -lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) cbind(d^2, sort(vi$reduction, decreasing = TRUE)[1:3]) @@ -162,11 +163,13 @@ for(w in 1:length(wch)) { main = names(fac$resp$baselearner[wch[w]])) lines(sort(griddata$t), - ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], col = cols[w], lty = 2) + ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], + col = cols[w], lty = 2) plot(fac$cov, which = wch[w], main = names(fac$cov$baselearner[wch[w]])) this_x <- fac2$cov$model.frame(which = wch[w])[[1]][[1]] - lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], col = cols[w], lty = 1) + lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], + col = cols[w], lty = 1) } par(opar) diff --git a/tests/factorize_test_regular.R b/tests/factorize_test_regular.R index 27c357c..2945c09 100644 --- a/tests/factorize_test_regular.R +++ b/tests/factorize_test_regular.R @@ -65,7 +65,8 @@ par(opar) fac <- factorize(m) vi <- as.data.frame(varimp(fac$cov)) -lattice::barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) cbind(d^2, vi$reduction[c(1:2, 10)]) diff --git a/vignettes/density-on-scalar_birth.Rnw b/vignettes/density-on-scalar_birth.Rnw index 85e5119..1ed6c01 100644 --- a/vignettes/density-on-scalar_birth.Rnw +++ b/vignettes/density-on-scalar_birth.Rnw @@ -10,6 +10,8 @@ \usepackage{authblk} \usepackage[left=25mm, right=25mm, top=20mm, bottom=20mm]{geometry} %\usepackage[nolists]{endfloat} +%\usepackage{mathspec} +\usepackage{dsfont} \usepackage{bbm} %\VignetteEngine{knitr::knitr} @@ -211,7 +213,7 @@ In the continuous case, the sum is proportional to the integral numerically, if Thus, using \texttt{bbsc} is suitable in this case, as well. Second, we must specify the B-spline basis in \texttt{bbsc} appropriately. The continuous case is straightforward, e.g., by using cubic B-splines. -In our discrete case, a suitable (unconstrained) basis is $(\mathbbm{1}_{\{1\}}, \ldots, \mathbbm{1}_{\{12\}}) \in L^2 ( \delta)^{12}$, where $\mathbbm{1}_{A}$ denotes the indicator function of $A \in \mathcal{A}$. +In our discrete case, a suitable (unconstrained) basis is $(\mathds{1}_{\{1\}}, \ldots, \mathds{1}_{\{12\}}) \in L^2 ( \delta)^{12}$, where $\mathds{1}_{A}$ denotes the indicator function of $A \in \mathcal{A}$. This results in the identity matrix as design matrix. In \texttt{bbs()} (or \texttt{bbsc()}, which yields the corresponding constrained basis), this can be achieved using \texttt{degree = 1} with knots equal to $\mathcal{T}$. diff --git a/vignettes/density-on-scalar_birth.pdf b/vignettes/density-on-scalar_birth.pdf index 6d9bfc27613cb9c0446d5e461b40bbc77978a339..fe37e55cc796d02622ebd4ff67d564d7ab933e7c 100644 GIT binary patch literal 434197 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%0AXF~}J*gVR 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
gjH8wB`JUEQx+FS9ME6eov03{i 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

$aGcWavL+ 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 literal 602948 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

@X% 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

$oo>&!hB&syrH_Ab3m_s^5?XeKv2gXT4-7o#%g| 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

kfLEnq)6dD#KOdGm%2q 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 From 6b663c5fc22256e694950285e312fd432fbbc02e Mon Sep 17 00:00:00 2001 From: davidruegamer Date: Wed, 13 Jul 2022 11:36:31 +0200 Subject: [PATCH 14/56] comment out applyFolds to reduce compilation run time --- vignettes/density-on-scalar_birth.Rnw | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/vignettes/density-on-scalar_birth.Rnw b/vignettes/density-on-scalar_birth.Rnw index 1ed6c01..1bbacb6 100644 --- a/vignettes/density-on-scalar_birth.Rnw +++ b/vignettes/density-on-scalar_birth.Rnw @@ -235,11 +235,13 @@ model <- FDboost(birth_densities_clr ~ 1 + bolsc(sex, df = 1) + @ To determine the optimal stopping iteration we perform a $10$-fold bootstrap. -This is rather time-consuming (especially in the continuous case, when the response densities are evaluated at many grid-values) and preferably should be executed parallelized on multiple cores. +This is rather time-consuming (especially in the continuous case, when the response densities are evaluated at many grid-values) and preferably should be executed parallelized on multiple cores. In order to avoid long compilation times for the vignette, the following code is commented out, but it should be possible to obtain the same stopping iteration within a few minutes. <>= -set.seed(1708) -folds <- applyFolds(model, folds = cv(rep(1, model$ydim[1]), type = "bootstrap", B = 10)) -model <- model[mstop(folds)] # mstop(folds): 999 +# set.seed(1708) +# folds <- applyFolds(model, folds = cv(rep(1, model$ydim[1]), type = "bootstrap", B = 10)) +# ms <- mstop(folds) # = 999 +ms <- 999 +model <- model[ms] @ Our final object \texttt{model} contains the fit of model~\eqref{model_clr}, i.e., on clr-level. From f7fb63ab557163aebb9323386fced517f7677442 Mon Sep 17 00:00:00 2001 From: davidruegamer Date: Thu, 8 Sep 2022 09:46:19 +0200 Subject: [PATCH 15/56] remove donttest mod4 example in md, documented in #24 now --- R/FDboost.R | 13 ------------- man/FDboost.Rd | 13 ------------- 2 files changed, 26 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index aeed4ba..abefc68 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -398,19 +398,6 @@ #' ## plot(mod4) #' ## plotPredicted(mod4, lwdPred = 2) #' -#' \donttest{ -#' ## Find optimal mstop, small grid/low B for a fast example -#' set.seed(123) -#' folds4 <- cv(rep(1, length(unique(mod4$id))), B = 3) -#' appl4 <- applyFolds(mod4, folds = folds4, grid = 1:50) -#' ## val4 <- validateFDboost(mod4, folds = folds4, grid = 1:50) -#' -#' set.seed(123) -#' folds4long <- cvLong(id = mod4$id, weights = model.weights(mod4), B = 3) -#' cvm4 <- cvrisk(mod4, folds = folds4long, grid = 1:50) -#' mstop(cvm4) -#' } -#' #' ## Be careful if you want to predict newdata with irregular response, #' ## as the argument index is not considered in the prediction of newdata. #' ## Thus, all covariates have to be repeated according to the number of observations diff --git a/man/FDboost.Rd b/man/FDboost.Rd index 0d5b8ca..6af97e4 100644 --- a/man/FDboost.Rd +++ b/man/FDboost.Rd @@ -400,19 +400,6 @@ mod4 <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept = FAL ## plot(mod4) ## plotPredicted(mod4, lwdPred = 2) -\donttest{ - ## Find optimal mstop, small grid/low B for a fast example - set.seed(123) - folds4 <- cv(rep(1, length(unique(mod4$id))), B = 3) - appl4 <- applyFolds(mod4, folds = folds4, grid = 1:50) - ## val4 <- validateFDboost(mod4, folds = folds4, grid = 1:50) - - set.seed(123) - folds4long <- cvLong(id = mod4$id, weights = model.weights(mod4), B = 3) - cvm4 <- cvrisk(mod4, folds = folds4long, grid = 1:50) - mstop(cvm4) -} - ## Be careful if you want to predict newdata with irregular response, ## as the argument index is not considered in the prediction of newdata. ## Thus, all covariates have to be repeated according to the number of observations From 15e600be2124b42edc373f61f8c07d2424a5f3ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Almond=20St=C3=B6cker?= Date: Thu, 8 Sep 2022 12:31:28 +0200 Subject: [PATCH 16/56] "Value" added to %Xc% and %A% docus --- DESCRIPTION | 2 +- R/constrainedX.R | 7 ++++++- man/anisotropic_Kronecker.Rd | 4 ++++ man/grapes-Xc-grapes.Rd | 4 ++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 48c0494..ba724a2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -58,7 +58,7 @@ Collate: 'methods.R' 'stabsel.R' 'utilityFunctions.R' -RoxygenNote: 7.2.0 +RoxygenNote: 7.2.1 Encoding: UTF-8 BugReports: https://github.com/boost-R/FDboost/issues URL: https://github.com/boost-R/FDboost diff --git a/R/constrainedX.R b/R/constrainedX.R index 24c65ad..0d15ef6 100644 --- a/R/constrainedX.R +++ b/R/constrainedX.R @@ -20,6 +20,9 @@ #' where \code{1} induces a global intercept and \code{x1}, \code{x2} are factor variables, #' see Ruegamer et al. (2018). #' +#' @return An object of class \code{blg} (base-learner generator) with a \code{dpp} function +#' as for other \code{\link[mboost:baselearners]{baselearners}}. +#' #' @references #' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): #' The functional linear array model. Statistical Modelling, 15(3), 279-300. @@ -611,8 +614,10 @@ bl_lin_matrix_a <- function(blg, Xfun, args) { #' \code{\%Xa0\%} computes like \code{\%X\%} the row tensor product of two base-learners, #' with the difference that it sets the penalty for one direction to zero. #' Thus, \code{\%Xa0\%} behaves to \code{\%X\%} analogously like \code{\%A0\%} to \code{\%O\%}. -#' #' +#' @return An object of class \code{blg} (base-learner generator) with a \code{dpp} function +#' as for other \code{\link[mboost:baselearners]{baselearners}}. +#' #' @references #' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): #' The functional linear array model. Statistical Modelling, 15(3), 279-300. diff --git a/man/anisotropic_Kronecker.Rd b/man/anisotropic_Kronecker.Rd index 2b734e3..d3f748f 100644 --- a/man/anisotropic_Kronecker.Rd +++ b/man/anisotropic_Kronecker.Rd @@ -18,6 +18,10 @@ bl1 \%Xa0\% bl2 \item{bl2}{base-learner 2, e.g. \code{bbs(x2)}} } +\value{ +An object of class \code{blg} (base-learner generator) with a \code{dpp} function +as for other \code{\link[mboost:baselearners]{baselearners}}. +} \description{ Kronecker product or row tensor product of two base-learners allowing for anisotropic penalties. For the Kronecker product, \code{\%A\%} works in the general case, \code{\%A0\%} for the special case where diff --git a/man/grapes-Xc-grapes.Rd b/man/grapes-Xc-grapes.Rd index 2c1e2cc..11f3826 100644 --- a/man/grapes-Xc-grapes.Rd +++ b/man/grapes-Xc-grapes.Rd @@ -11,6 +11,10 @@ bl1 \%Xc\% bl2 \item{bl2}{base-learner 2, e.g. \code{bols(x2)}} } +\value{ +An object of class \code{blg} (base-learner generator) with a \code{dpp} function +as for other \code{\link[mboost:baselearners]{baselearners}}. +} \description{ Combining single base-learners to form new, more complex base-learners, with an identifiability constraint to center the interaction around the intercept and From 88f0c26f0071ea424b8be180dee973ac086b688e Mon Sep 17 00:00:00 2001 From: davidruegamer Date: Fri, 9 Sep 2022 08:54:43 +0200 Subject: [PATCH 17/56] update date --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 48c0494..e32dc29 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: FDboost Type: Package Title: Boosting Functional Regression Models -Version: 1.1-0 -Date: 2022-06-14 +Version: 1.1-1 +Date: 2022-09-08 Authors@R: c(person("Sarah", "Brockhaus", role = "aut", email = "Sarah.Brockhaus@stat.uni-muenchen.de"), person("David", "Ruegamer", role = c("aut", "cre"), From 5778cbaee7996a8794261e3868bfe891eaddc024 Mon Sep 17 00:00:00 2001 From: almond-s Date: Thu, 22 Sep 2022 20:45:33 +0200 Subject: [PATCH 18/56] Should fix applyFolds issue for irregular data (https://github.com/boost-R/FDboost/issues/24#issue-1365709430) --- R/FDboost.R | 13 +++++++++++++ R/utilityFunctions.R | 2 ++ 2 files changed, 15 insertions(+) diff --git a/R/FDboost.R b/R/FDboost.R index abefc68..aeed4ba 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -398,6 +398,19 @@ #' ## plot(mod4) #' ## plotPredicted(mod4, lwdPred = 2) #' +#' \donttest{ +#' ## Find optimal mstop, small grid/low B for a fast example +#' set.seed(123) +#' folds4 <- cv(rep(1, length(unique(mod4$id))), B = 3) +#' appl4 <- applyFolds(mod4, folds = folds4, grid = 1:50) +#' ## val4 <- validateFDboost(mod4, folds = folds4, grid = 1:50) +#' +#' set.seed(123) +#' folds4long <- cvLong(id = mod4$id, weights = model.weights(mod4), B = 3) +#' cvm4 <- cvrisk(mod4, folds = folds4long, grid = 1:50) +#' mstop(cvm4) +#' } +#' #' ## Be careful if you want to predict newdata with irregular response, #' ## as the argument index is not considered in the prediction of newdata. #' ## Thus, all covariates have to be repeated according to the number of observations diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index c98e6bf..b29f4f8 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -1182,6 +1182,8 @@ reweightData <- function(data, argvals, vars, i <- i + 1 } idvars_new <- c(factor(my_temp_idvars)) + # regain 1:n ids format expected by FDboost + idvars_new <- as.numeric(idvars_new) ## check whether id variable of hmatrix-object and id variable of long variables are equal if(!is.null(idvars_new_hmatrix)){ if(!all(idvars_new == idvars_new_hmatrix)) From d7aa0c4d52412b28d6afea8b7d05ecfc9b520756 Mon Sep 17 00:00:00 2001 From: davidruegamer Date: Thu, 22 Sep 2022 21:09:03 +0200 Subject: [PATCH 19/56] change plotting settings --- R/FDboostLSS.R | 3 +- R/baselearners.R | 11 ++-- R/bootstrapCIs.R | 2 +- R/clr_functions.R | 4 +- R/constrainedX.R | 3 +- R/crossvalidation.R | 9 ++- R/factorize.R | 4 +- R/hmatrix.R | 13 ++-- R/methods.R | 2 +- R/utilityFunctions.R | 6 +- man/FDboostLSS.Rd | 3 +- man/anisotropic_Kronecker.Rd | 3 +- man/applyFolds.Rd | 3 +- man/bhistx.Rd | 4 -- man/birthDistribution.Rd | 4 +- man/bsignal.Rd | 10 +-- man/factorize.Rd | 2 + man/funplot.Rd | 3 + man/getTime.Rd | 3 + man/getTime.hmatrix.Rd | 3 + man/hmatrix.Rd | 5 +- man/integrationWeights.Rd | 3 + man/is.hmatrix.Rd | 3 + man/o_control.Rd | 3 + man/plot.FDboost.Rd | 3 + man/plot.bootstrapCI.Rd | 3 + man/plot.validateFDboost.Rd | 3 + man/predict.FDboost_fac.Rd | 4 ++ man/sub-.hmatrix.Rd | 3 + man/subset_hmatrix.Rd | 3 + man/truncateTime.Rd | 3 +- man/validateFDboost.Rd | 4 +- man/viscosity.Rd | 123 +++++++++++++++++------------------ man/wide2long.Rd | 3 + 34 files changed, 162 insertions(+), 99 deletions(-) diff --git a/R/FDboostLSS.R b/R/FDboostLSS.R index b07e5a8..debc3dd 100644 --- a/R/FDboostLSS.R +++ b/R/FDboostLSS.R @@ -121,11 +121,12 @@ #' m_boost <- m_boost[mstop(cvr)] ## 832 #' #' ## plot smooth effects of functional covariates for mu and sigma -#' par(mfrow = c(1,2)) +#' oldpar <- par(mfrow = c(1,2)) #' plot(m_boost$mu, which = 2, ylim = c(0,5)) #' lines(s, sin(s*pi)*5, col = 3, lwd = 2) #' plot(m_boost$sigma, which = 2, ylim = c(-2.5,2.5)) #' lines(s, -cos(s*pi)*2, col = 3, lwd = 2) +#' par(oldpar) #' } #' } #' @export diff --git a/R/baselearners.R b/R/baselearners.R index 01ab85e..a23bae5 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -65,6 +65,7 @@ #' xind2 <- xind + 0.5 #' integrationWeightsLeft(X1, xind2, leftWeight = "zero") #' +#' @return Matrix with integration #' @export ################################# # Trapezoidal integration weights for a functional variable X1 on grid xind @@ -573,9 +574,8 @@ X_bsignal <- function(mf, vary, args) { #' + bsignal(NIR, nir.lambda, knots = 40, df=4, check.ident = FALSE), #' timeformula = NULL, data = fuelSubset) #' summary(mod2) -#' ## plot(mod2) -#' #' +#' #' ############################################### #' ### data simulation like in manual of pffr::ff #' @@ -608,10 +608,11 @@ X_bsignal <- function(mf, vary, args) { #' m1_pffr <- pffr(Y ~ ff(X1, xind = s), yind = t, data = data1) #' #' \donttest{ -#' par(mfrow = c(2, 2)) +#' oldpar <- par(mfrow = c(2, 2)) #' plot(m1, which = 1); plot(m1, which = 2) #' plot(m1_pffr, select = 1, shift = m1_pffr$coefficients["(Intercept)"]) #' plot(m1_pffr, select = 2) +#' par(oldpar) #' } #' #' @@ -645,12 +646,12 @@ X_bsignal <- function(mf, vary, args) { #' m2_pffr <- pffr(Y ~ ff(X1, xind = s, limits = "s<=t"), yind = t, data = data2) #' #' \donttest{ -#' par(mfrow = c(2, 2)) +#' oldpar <- par(mfrow = c(2, 2)) #' plot(m2, which = 1); plot(m2, which = 2) #' ## plot of smooth intercept does not contain m1_pffr$coefficients["(Intercept)"] #' plot(m2_pffr, select = 1, shift = m2_pffr$coefficients["(Intercept)"]) #' plot(m2_pffr, select = 2) -#' +#' par(oldpar) #' } #' #' diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index 8ccf2b3..8e31c57 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -490,7 +490,7 @@ bootstrapCI <- function(object, which = NULL, #' @details \code{plot.bootstrapCI} plots the bootstrapped coefficients. #' #' @aliases print.bootstrapCI -#' +#' @return No return value (plot method) or \code{x} itself (print method) #' @method plot bootstrapCI #' #' @export diff --git a/R/clr_functions.R b/R/clr_functions.R index 7ad772a..c11540a 100644 --- a/R/clr_functions.R +++ b/R/clr_functions.R @@ -195,7 +195,7 @@ clr <- function(f, w = 1, inverse = FALSE) { #' # Plot densities #' year_col <- rainbow(70, start = 0.5, end = 1) #' year_lty <- c(1, 2, 4, 5) -#' par(mfrow = c(1, 2)) +#' oldpar <- par(mfrow = c(1, 2)) #' funplot(1:12, birthDistribution$birth_densities[1:70, ], ylab = "densities", xlab = "month", #' xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") #' funplot(1:12, birthDistribution$birth_densities[71:140, ], ylab = "densities", xlab = "month", @@ -237,5 +237,5 @@ clr <- function(f, w = 1, inverse = FALSE) { #' xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") #' funplot(1:12, predictions[71:140, ], ylab = "predictions", xlab = "month", ylim = pred_ylim, #' xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Female") -#' par(mfrow = c(1, 1)) +#' par(oldpar) "birthDistribution" \ No newline at end of file diff --git a/R/constrainedX.R b/R/constrainedX.R index 0d15ef6..27bf9fc 100644 --- a/R/constrainedX.R +++ b/R/constrainedX.R @@ -683,7 +683,7 @@ bl_lin_matrix_a <- function(blg, Xfun, args) { #' #' ## compare estimated coefficients #' \donttest{ -#' par(mfrow=c(4, 2)) +#' oldpar <- par(mfrow=c(4, 2)) #' plot(mod1, which = 1) #' plot(mod1a, which = 1) #' plot(mod1, which = 2) @@ -692,6 +692,7 @@ bl_lin_matrix_a <- function(blg, Xfun, args) { #' plot(mod1a, which = 3) #' funplot(mod1$yind, predict(mod1, which=4)) #' funplot(mod1$yind, predict(mod1a, which=4)) +#' par(oldpar) #' } #' #' @name anisotropic_Kronecker diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 3961d8e..f8b4f61 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -143,9 +143,10 @@ #' #' \donttest{ #' ## plot the out-of-bag risk -#' par(mfrow = c(1,3)) +#' oldpar <- par(mfrow = c(1,3)) #' plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) #' plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) +#' par(oldpar) #' } #' #'} @@ -659,7 +660,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ #' cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) #' #' ## plot the out-of-bag risk -#' par(mfrow = c(1,3)) +#' oldpar <- par(mfrow = c(1,3)) #' plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) #' plot(cvr2) #' plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) @@ -678,6 +679,8 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ #' plotPredCoef(cvr_jackknife, which = 3) #' ## plot coefficients per fold for 2nd effect #' plotPredCoef(cvr_jackknife, which = 2, terms = FALSE) +#' +#' par(oldpar) #' #'} #'} @@ -1200,6 +1203,8 @@ print.validateFDboost <- function(x, ...){ #' coefficients that were estimated in the folds - only possible if the argument getCoefCV is \code{TRUE} in #' the call to \code{validateFDboost}. #' +#' @return No return value (plot method) or the object itself (print method) +#' #' @aliases mstop.validateFDboost #' #' @method plot validateFDboost diff --git a/R/factorize.R b/R/factorize.R index 792b227..632c121 100644 --- a/R/factorize.R +++ b/R/factorize.R @@ -47,6 +47,7 @@ factorize <- factorise <- function(x, ...) { #' or for the whole model simultaneously. #' #' @method factorize FDboost +#' @return A factorized model #' @export #' @rdname factorize factorize.FDboost <- function(x, newdata = NULL, newweights = 1, blwise = TRUE, ...) { @@ -328,7 +329,8 @@ NULL #' @export #' @name predict.FDboost_fac #' @aliases plot.FDboost_fac -#' +#' @return A matrix of predictions (for predict method) or no +#' return value (plot method) #' @seealso [factorize(), factorize.FDboost()] #' predict.FDboost_fac <- function(object, newdata = NULL, which = NULL, ...) { diff --git a/R/hmatrix.R b/R/hmatrix.R index a4c38a4..bf4b99f 100644 --- a/R/hmatrix.R +++ b/R/hmatrix.R @@ -66,6 +66,8 @@ #' str(mydat) #' str(mydat[id1 %in% c(2, 3), ]) #' str(myhmatrix[id1 %in% c(2, 3), ]) +#' +#' @return An matrix object of type \code{"hmatrix"} #' #' @export hmatrix <- function(time, id, x, argvals=1:ncol(x), @@ -120,7 +122,7 @@ hmatrix <- function(time, id, x, argvals=1:ncol(x), #' @seealso \code{\link{hmatrix}} for the h.atrix class. #' #' @aliases getId getX getArgvals getTimeLab getIdLab getXLab getArgvalsLab -#' +#' @return properties of a hmatrix or fmatrix #' @export getTime <- function(object) { UseMethod("getTime", object) } @@ -165,6 +167,7 @@ getArgvalsLab <- function(object) { UseMethod("getArgvalsLab", object) } #' \code{getIdLab}, \code{getXLab}, \code{getArgvalsLab} for an object of class \code{hmatrix}. #' #' @aliases getId.hmatrix getX.hmatrix getArgvals.hmatrix getTimeLab.hmatrix getXLab.hmatrix getArgvalsLab.hmatrix +#' @return properties of a hmatrix #' #' @export getTime.hmatrix <- function(object) object[ , 1, drop=TRUE] @@ -203,7 +206,7 @@ getArgvalsLab.hmatrix <- function(object) attr(object, "argvalsLab") #' #' is.hmatrix tests if its argument is an object of class hmatrix. #' @param object object of class hmatrix -#' +#' @return logical value #' @export is.hmatrix <- function(object){ inherits(object, "hmatrix") @@ -231,7 +234,7 @@ is.hmatrix <- function(object){ #' From the functional covariate \code{x} rows are selected accordingly. #' #' @seealso ?"[" -#' +#' @return a \code{"hmatrix"} object #' @export `[.hmatrix` <- function(x, i, j, ..., drop=FALSE) { @@ -272,7 +275,7 @@ is.hmatrix <- function(object){ #' repeated accordingly so that two vectors of the same length are returned. #' @param time the observation points #' @param id the id for the curve -#' +#' @return a list with \code{time} and \code{id} #' @export wide2long <- function(time, id){ newtime <- rep(time, each=length(unique(id))) @@ -303,6 +306,8 @@ wide2long <- function(time, id){ #' try(resMat2 <- subset_hmatrix(resMat, index = index2)) #' resMat <- subset_hmatrix(hmat, index = index1, compress = FALSE) #' try(resMat2 <- subset_hmatrix(resMat, index = index2)) +#' +#' @return a \code{hmatrix} object #' #' @export subset_hmatrix <- function(x, index, compress = TRUE) diff --git a/R/methods.R b/R/methods.R index ea78d04..77043de 100644 --- a/R/methods.R +++ b/R/methods.R @@ -1373,7 +1373,7 @@ getColPersp <- function(z, col1 = "tomato", col2 = "lightblue"){ #' #' @seealso \code{\link{FDboost}} for the model fit and #' \code{\link{coef.FDboost}} for the calculation of the coefficient functions. -#' +#' @return no return value (plot method) #' @method plot FDboost #' @export ### function to plot raw values or coefficient-functions/surfaces of a model diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index c98e6bf..0277c37 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -8,7 +8,7 @@ #' @param silent print error messages of model fit? #' @param cyclic defaults to FALSE, if TRUE cyclic splines are used #' @param knots arguments knots passed to \code{\link[mgcv]{gam}} -#' +#' @return a list with controls #' @export o_control <- function(k_min=20, rule=2, silent=TRUE, cyclic=FALSE, knots=NULL) { RET <- list(k_min=k_min, rule=rule, silent=silent, cyclic=cyclic, knots=knots) @@ -38,10 +38,11 @@ o_control <- function(k_min=20, rule=2, silent=TRUE, cyclic=FALSE, knots=NULL) { #' datTr <- truncateTime(funVar=c("hgtm","hgtf"), time="age", newtime=1:16, data=dat) #' #' \donttest{ -#' par(mfrow=c(1,2)) +#' oldpar <- par(mfrow=c(1,2)) #' with(dat, funplot(age, hgtm, main="Original data")) #' with(datTr, funplot(age, hgtm, main="Yearly data")) #' par(mfrow=c(1,1)) +#' par(oldpar) #' } #' } #' @export @@ -81,6 +82,7 @@ truncateTime <- function(funVar, time, newtime, data){ #' with(fda::growth, funplot(age, t(hgtm))) #' } #' } +#' @return see \code{\link[graphics]{matplot}} #' @export funplot <- function(x, y, id=NULL, rug=TRUE, ...){ diff --git a/man/FDboostLSS.Rd b/man/FDboostLSS.Rd index 7a04ef8..f3697da 100644 --- a/man/FDboostLSS.Rd +++ b/man/FDboostLSS.Rd @@ -110,11 +110,12 @@ summary(m_boost) m_boost <- m_boost[mstop(cvr)] ## 832 ## plot smooth effects of functional covariates for mu and sigma - par(mfrow = c(1,2)) + oldpar <- par(mfrow = c(1,2)) plot(m_boost$mu, which = 2, ylim = c(0,5)) lines(s, sin(s*pi)*5, col = 3, lwd = 2) plot(m_boost$sigma, which = 2, ylim = c(-2.5,2.5)) lines(s, -cos(s*pi)*2, col = 3, lwd = 2) + par(oldpar) } } } diff --git a/man/anisotropic_Kronecker.Rd b/man/anisotropic_Kronecker.Rd index d3f748f..b226782 100644 --- a/man/anisotropic_Kronecker.Rd +++ b/man/anisotropic_Kronecker.Rd @@ -135,7 +135,7 @@ mod1k0$formulaMboost ## compare estimated coefficients \donttest{ -par(mfrow=c(4, 2)) +oldpar <- par(mfrow=c(4, 2)) plot(mod1, which = 1) plot(mod1a, which = 1) plot(mod1, which = 2) @@ -144,6 +144,7 @@ plot(mod1, which = 3) plot(mod1a, which = 3) funplot(mod1$yind, predict(mod1, which=4)) funplot(mod1$yind, predict(mod1a, which=4)) +par(oldpar) } } diff --git a/man/applyFolds.Rd b/man/applyFolds.Rd index 8ebe9c7..79a4b3d 100644 --- a/man/applyFolds.Rd +++ b/man/applyFolds.Rd @@ -210,9 +210,10 @@ mod <- mod[75] \donttest{ ## plot the out-of-bag risk - par(mfrow = c(1,3)) + oldpar <- par(mfrow = c(1,3)) plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) + par(oldpar) } } diff --git a/man/bhistx.Rd b/man/bhistx.Rd index dd2f13e..67eca49 100644 --- a/man/bhistx.Rd +++ b/man/bhistx.Rd @@ -142,10 +142,6 @@ mod <- FDboost(Y ~ 1 + bhistx(x = X1h, df = 5, knots = 5) \%X\% bols(zlong), cv <- cvrisk(mod, folds = cv(model.weights(mod), B = 5)) mstop(cv) mod[mstop(cv)] - - appl1 <- applyFolds(mod, folds = cv(rep(1, length(unique(mod$id))), type = "bootstrap", B = 5)) - - # plot(mod) } } diff --git a/man/birthDistribution.Rd b/man/birthDistribution.Rd index abe726e..60b64f5 100644 --- a/man/birthDistribution.Rd +++ b/man/birthDistribution.Rd @@ -63,7 +63,7 @@ data("birthDistribution", package = "FDboost") # Plot densities year_col <- rainbow(70, start = 0.5, end = 1) year_lty <- c(1, 2, 4, 5) -par(mfrow = c(1, 2)) +oldpar <- par(mfrow = c(1, 2)) funplot(1:12, birthDistribution$birth_densities[1:70, ], ylab = "densities", xlab = "month", xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") funplot(1:12, birthDistribution$birth_densities[71:140, ], ylab = "densities", xlab = "month", @@ -105,7 +105,7 @@ funplot(1:12, predictions[1:70, ], ylab = "predictions", xlab = "month", ylim = xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") funplot(1:12, predictions[71:140, ], ylab = "predictions", xlab = "month", ylim = pred_ylim, xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Female") -par(mfrow = c(1, 1)) +par(oldpar) } \references{ Maier, E.-M., Stoecker, A., Fitzenberger, B., Greven, S. (2021): diff --git a/man/bsignal.Rd b/man/bsignal.Rd index cf3c0af..6334a79 100644 --- a/man/bsignal.Rd +++ b/man/bsignal.Rd @@ -245,9 +245,8 @@ mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check. + bsignal(NIR, nir.lambda, knots = 40, df=4, check.ident = FALSE), timeformula = NULL, data = fuelSubset) summary(mod2) -## plot(mod2) - + ############################################### ### data simulation like in manual of pffr::ff @@ -280,10 +279,11 @@ s <- attr(data1, "xindex") m1_pffr <- pffr(Y ~ ff(X1, xind = s), yind = t, data = data1) \donttest{ - par(mfrow = c(2, 2)) + oldpar <- par(mfrow = c(2, 2)) plot(m1, which = 1); plot(m1, which = 2) plot(m1_pffr, select = 1, shift = m1_pffr$coefficients["(Intercept)"]) plot(m1_pffr, select = 2) + par(oldpar) } @@ -317,12 +317,12 @@ s <- attr(data2, "xindex") m2_pffr <- pffr(Y ~ ff(X1, xind = s, limits = "s<=t"), yind = t, data = data2) \donttest{ -par(mfrow = c(2, 2)) +oldpar <- par(mfrow = c(2, 2)) plot(m2, which = 1); plot(m2, which = 2) ## plot of smooth intercept does not contain m1_pffr$coefficients["(Intercept)"] plot(m2_pffr, select = 1, shift = m2_pffr$coefficients["(Intercept)"]) plot(m2_pffr, select = 2) - +par(oldpar) } diff --git a/man/factorize.Rd b/man/factorize.Rd index b5244dd..5175295 100644 --- a/man/factorize.Rd +++ b/man/factorize.Rd @@ -27,6 +27,8 @@ or for the whole model simultaneously.} \value{ a list of two mboost models of class \code{FDboost_fac} containing basis functions for response and covariates, respectively, as base-learners. + +A factorized model } \description{ Factorize an FDboost tensor product model into the response and covariate parts diff --git a/man/funplot.Rd b/man/funplot.Rd index febce71..8b6198a 100644 --- a/man/funplot.Rd +++ b/man/funplot.Rd @@ -18,6 +18,9 @@ or vector or functional observations, in this case id has to be specified} \item{...}{further arguments passed to \code{\link[graphics]{matplot}}.} } +\value{ +see \code{\link[graphics]{matplot}} +} \description{ Plot functional data with linear interpolation of missing values } diff --git a/man/getTime.Rd b/man/getTime.Rd index 836c0c6..046c954 100644 --- a/man/getTime.Rd +++ b/man/getTime.Rd @@ -30,6 +30,9 @@ getArgvalsLab(object) \arguments{ \item{object}{an R-object, currently implemented for hmatrix and fmatrix} } +\value{ +properties of a hmatrix or fmatrix +} \description{ Extract attributes of an object. } diff --git a/man/getTime.hmatrix.Rd b/man/getTime.hmatrix.Rd index e21c969..6139327 100644 --- a/man/getTime.hmatrix.Rd +++ b/man/getTime.hmatrix.Rd @@ -30,6 +30,9 @@ \arguments{ \item{object}{object of class hmatrix} } +\value{ +properties of a hmatrix +} \description{ Extract attributes of an object of class \code{hmatrix}. } diff --git a/man/hmatrix.Rd b/man/hmatrix.Rd index b692acf..9d273fa 100644 --- a/man/hmatrix.Rd +++ b/man/hmatrix.Rd @@ -34,6 +34,9 @@ is observed, by default \code{1:ncol(x)}} \item{argvalsLab}{name of the argument for the covariate by default \code{s}} } +\value{ +An matrix object of type \code{"hmatrix"} +} \description{ The hmatrix class represents data for a functional historical effect. The class is basically a matrix containing the time and the id for the observations of the @@ -82,7 +85,7 @@ mydat <- data.frame(I(myhmatrix), z=rnorm(3)[id1]) str(mydat) str(mydat[id1 \%in\% c(2, 3), ]) str(myhmatrix[id1 \%in\% c(2, 3), ]) - + } \seealso{ \code{\link{getTime.hmatrix}} to extract attributes, diff --git a/man/integrationWeights.Rd b/man/integrationWeights.Rd index 74130ce..1d6978f 100644 --- a/man/integrationWeights.Rd +++ b/man/integrationWeights.Rd @@ -25,6 +25,9 @@ The default is to use the mean over all integration weights, \code{"mean"}. Alternatively one can use the first integration weight, \code{"first"}, or use the distance to zero, \code{"zero"}.} } +\value{ +Matrix with integration +} \description{ Computes trapezoidal integration weights (Riemann sums) for a functional variable \code{X1} that has evaluation points \code{xind}. diff --git a/man/is.hmatrix.Rd b/man/is.hmatrix.Rd index 8b243a9..0348a03 100644 --- a/man/is.hmatrix.Rd +++ b/man/is.hmatrix.Rd @@ -9,6 +9,9 @@ is.hmatrix(object) \arguments{ \item{object}{object of class hmatrix} } +\value{ +logical value +} \description{ is.hmatrix tests if its argument is an object of class hmatrix. } diff --git a/man/o_control.Rd b/man/o_control.Rd index dffb138..672425f 100644 --- a/man/o_control.Rd +++ b/man/o_control.Rd @@ -19,6 +19,9 @@ closest non-missing value, see \code{\link[stats:approxfun]{approx}}} \item{knots}{arguments knots passed to \code{\link[mgcv]{gam}}} } +\value{ +a list with controls +} \description{ Function to control estimation of smooth offset } diff --git a/man/plot.FDboost.Rd b/man/plot.FDboost.Rd index c04e4a4..a59a6be 100644 --- a/man/plot.FDboost.Rd +++ b/man/plot.FDboost.Rd @@ -89,6 +89,9 @@ Per default all observations are plotted.} \item{lwdPred}{lwd of predicted curves (only used in plotPredicted)} } +\value{ +no return value (plot method) +} \description{ Takes a fitted \code{FDboost}-object produced by \code{\link{FDboost}()} and plots the fitted effects or the coefficient-functions/surfaces. diff --git a/man/plot.bootstrapCI.Rd b/man/plot.bootstrapCI.Rd index 519bd27..cdc674b 100644 --- a/man/plot.bootstrapCI.Rd +++ b/man/plot.bootstrapCI.Rd @@ -42,6 +42,9 @@ defaults to \code{probs = c(0.25, 0.5, 0.75)}} \item{...}{additional arguments passed to callies.} } +\value{ +No return value (plot method) or \code{x} itself (print method) +} \description{ Methods for objects that are fitted to compute bootstrap confidence intervals. } diff --git a/man/plot.validateFDboost.Rd b/man/plot.validateFDboost.Rd index bbaef3c..bff5eb6 100644 --- a/man/plot.validateFDboost.Rd +++ b/man/plot.validateFDboost.Rd @@ -84,6 +84,9 @@ predicted values of the whole model can be compared to the predictions of the cr \item{probs}{vector of quantiles to be used in the plotting of 2-dimensional coefficients surfaces, defaults to \code{probs = c(0.25, 0.5, 0.75)}} } +\value{ +No return value (plot method) or the object itself (print method) +} \description{ Methods for objects that are fitted to determine the optimal mstop and the prediction error of a model fitted by FDboost. diff --git a/man/predict.FDboost_fac.Rd b/man/predict.FDboost_fac.Rd index 2bb2643..6fceb1f 100644 --- a/man/predict.FDboost_fac.Rd +++ b/man/predict.FDboost_fac.Rd @@ -29,6 +29,10 @@ the variable name.} \item{main}{the plot title. By default, base-learner names are used with component numbers \code{[k]}.} } +\value{ +A matrix of predictions (for predict method) or no +return value (plot method) +} \description{ Prediction and plotting for factorized FDboost model components } diff --git a/man/sub-.hmatrix.Rd b/man/sub-.hmatrix.Rd index 62f5c92..9e53123 100644 --- a/man/sub-.hmatrix.Rd +++ b/man/sub-.hmatrix.Rd @@ -19,6 +19,9 @@ vectors or empty (missing) or NULL. Numeric values are coerced to integer as by (or just a matrix). This only works for extracting elements, not for the replacement, defaults to \code{FALSE}.} } +\value{ +a \code{"hmatrix"} object +} \description{ Operator acting on hmatrix preserving the attributes when rows are extracted. } diff --git a/man/subset_hmatrix.Rd b/man/subset_hmatrix.Rd index e573335..7cba3cd 100644 --- a/man/subset_hmatrix.Rd +++ b/man/subset_hmatrix.Rd @@ -15,6 +15,9 @@ for each curve to select} \item{compress}{logical, defaults to \code{TRUE}. Only used to force a meaningful behaviour of \code{applyFolds} with hmatrix objects when using nested resampling.} } +\value{ +a \code{hmatrix} object +} \description{ Subsets hmatrix according to an index } diff --git a/man/truncateTime.Rd b/man/truncateTime.Rd index 6c83c0a..0534c05 100644 --- a/man/truncateTime.Rd +++ b/man/truncateTime.Rd @@ -36,10 +36,11 @@ if(require(fda)){ datTr <- truncateTime(funVar=c("hgtm","hgtf"), time="age", newtime=1:16, data=dat) \donttest{ - par(mfrow=c(1,2)) + oldpar <- par(mfrow=c(1,2)) with(dat, funplot(age, hgtm, main="Original data")) with(datTr, funplot(age, hgtm, main="Yearly data")) par(mfrow=c(1,1)) + par(oldpar) } } } diff --git a/man/validateFDboost.Rd b/man/validateFDboost.Rd index 0ed6033..bbd390f 100644 --- a/man/validateFDboost.Rd +++ b/man/validateFDboost.Rd @@ -137,7 +137,7 @@ mod <- mod[75] cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) ## plot the out-of-bag risk - par(mfrow = c(1,3)) + oldpar <- par(mfrow = c(1,3)) plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) plot(cvr2) plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) @@ -156,6 +156,8 @@ mod <- mod[75] plotPredCoef(cvr_jackknife, which = 3) ## plot coefficients per fold for 2nd effect plotPredCoef(cvr_jackknife, which = 2, terms = FALSE) + + par(oldpar) } } diff --git a/man/viscosity.Rd b/man/viscosity.Rd index bfdb9eb..2fe32ba 100644 --- a/man/viscosity.Rd +++ b/man/viscosity.Rd @@ -1,62 +1,61 @@ -\name{viscosity} -\alias{viscosity} -\docType{data} -\title{ Viscosity of resin over time} -\description{ - - In an experimental setting the viscosity of resin was measured over time - to asses the curing process depending on 5 binary factors (low-high). - -} -\usage{data("viscosity")} -\format{ - A data list with 64 observations on the following 7 variables. - \describe{ - \item{\code{visAll}}{viscosity measures over all available time points} - \item{\code{timeAll}}{time points of viscosity measures} - \item{\code{T_C}}{ temperature of tools} - \item{\code{T_A}}{temperature of resin} - \item{\code{T_B}}{temperature of curing agent} - \item{\code{rspeed}}{rotational speed} - \item{\code{mflow}}{mass flow} - } -} -\details{ -The aim is to determine factors that affect the curing process in the mold. -The desired viscosity-curve has low values in the beginning followed -by a sharp increase. -Due to technical reasons the measuring method of the rheometer has to be -changed in a certain range of viscosity. The first observations are measured -by rotation of a blade giving observations every two seconds, -the later observations are measured through oscillation of a blade giving -observations every ten seconds. In the later observations the resin is quite -hard so the measurements should be interpreted as a qualitative measure of hardening. -} -\source{ - Wolfgang Raffelt, Technical University of Munich, Institute for Carbon Composites -} -\examples{ - - data("viscosity", package = "FDboost") - ## set time-interval that should be modeled - interval <- "101" - - ## model time until "interval" and take log() of viscosity - end <- which(viscosity$timeAll==as.numeric(interval)) - viscosity$vis <- log(viscosity$visAll[,1:end]) - viscosity$time <- viscosity$timeAll[1:end] - # with(viscosity, funplot(time, vis, pch=16, cex=0.2)) - - ## fit median regression model with 100 boosting iterations, - ## step-length 0.4 and smooth time-specific offset - ## the factors are in effect coding -1, 1 for the levels - mod <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept=FALSE) - + bols(T_A, contrasts.arg = "contr.sum", intercept=FALSE), - timeformula=~bbs(time, lambda=100), - numInt="equal", family=QuantReg(), - offset=NULL, offset_control = o_control(k_min = 9), - data=viscosity, control=boost_control(mstop = 100, nu = 0.4)) - summary(mod) - -} -\keyword{datasets} +\name{viscosity} +\alias{viscosity} +\docType{data} +\title{ Viscosity of resin over time} +\description{ + + In an experimental setting the viscosity of resin was measured over time + to asses the curing process depending on 5 binary factors (low-high). + +} +\usage{data("viscosity")} +\format{ + A data list with 64 observations on the following 7 variables. + \describe{ + \item{\code{visAll}}{viscosity measures over all available time points} + \item{\code{timeAll}}{time points of viscosity measures} + \item{\code{T_C}}{ temperature of tools} + \item{\code{T_A}}{temperature of resin} + \item{\code{T_B}}{temperature of curing agent} + \item{\code{rspeed}}{rotational speed} + \item{\code{mflow}}{mass flow} + } +} +\details{ +The aim is to determine factors that affect the curing process in the mold. +The desired viscosity-curve has low values in the beginning followed +by a sharp increase. +Due to technical reasons the measuring method of the rheometer has to be +changed in a certain range of viscosity. The first observations are measured +by rotation of a blade giving observations every two seconds, +the later observations are measured through oscillation of a blade giving +observations every ten seconds. In the later observations the resin is quite +hard so the measurements should be interpreted as a qualitative measure of hardening. +} +\source{ + Wolfgang Raffelt, Technical University of Munich, Institute for Carbon Composites +} +\examples{ + + data("viscosity", package = "FDboost") + ## set time-interval that should be modeled + interval <- "101" + + ## model time until "interval" and take log() of viscosity + end <- which(viscosity$timeAll==as.numeric(interval)) + viscosity$vis <- log(viscosity$visAll[,1:end]) + viscosity$time <- viscosity$timeAll[1:end] + + ## fit median regression model with 100 boosting iterations, + ## step-length 0.4 and smooth time-specific offset + ## the factors are in effect coding -1, 1 for the levels + mod <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept=FALSE) + + bols(T_A, contrasts.arg = "contr.sum", intercept=FALSE), + timeformula=~bbs(time, lambda=100), + numInt="equal", family=QuantReg(), + offset=NULL, offset_control = o_control(k_min = 9), + data=viscosity, control=boost_control(mstop = 100, nu = 0.4)) + summary(mod) + +} +\keyword{datasets} diff --git a/man/wide2long.Rd b/man/wide2long.Rd index bc1269e..9f8b26f 100644 --- a/man/wide2long.Rd +++ b/man/wide2long.Rd @@ -11,6 +11,9 @@ wide2long(time, id) \item{id}{the id for the curve} } +\value{ +a list with \code{time} and \code{id} +} \description{ Transform id and time from wide format into long format, i.e., time and id are repeated accordingly so that two vectors of the same length are returned. From 2b3f011da9b94182e124309c3fbc661d5fe74644 Mon Sep 17 00:00:00 2001 From: almond-s Date: Sat, 24 Sep 2022 16:19:09 +0200 Subject: [PATCH 20/56] bootstrapCI examples fixed for Windows --- R/bootstrapCIs.R | 33 +++++++++++++++++++-------------- man/FDboost.Rd | 13 +++++++++++++ man/bootstrapCI.Rd | 32 ++++++++++++++++++-------------- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index 8ccf2b3..5fc2e3d 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -103,23 +103,26 @@ #' #' ## now speed things up by defining the inner resampling #' ## function with parallelization based on mclapply (does not work on Windows) +#' isWindows <- Sys.info()['sysname']=="Windows" #' #' my_inner_fun <- function(object){ #' cvrisk(object, folds = cvLong(id = object$id, weights = #' model.weights(object), #' B = 10 # 10-fold for inner resampling -#' ), mc.cores = 10) # use ten cores +#' ), mc.cores = if(isWindows) 1 else 10) # use ten cores #' } #' #' \donttest{ -#' bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun) +#' bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, +#' B_outer = 5) # small B_outer to speed up #' } #' #' ## We can also use the ... argument to parallelize the applyFolds #' ## function in the outer resampling #' #' \donttest{ -#' bootCIs <- bootstrapCI(m1, mc.cores = 30) +#' bootCIs <- bootstrapCI(m1, mc.cores = if(isWindows) 1 else 30, +#' B_inner = 5, B_outer = 3) #' } #' #' ## Now let's parallelize the outer resampling and use @@ -128,17 +131,24 @@ #' my_inner_fun <- function(object){ #' cvrisk(object, folds = cvLong(id = object$id, weights = #' model.weights(object), type = "kfold", # use CV -#' B = 10, # 10-fold for inner resampling +#' B = 5, # 5-fold for inner resampling #' ), -#' mc.cores = 10) # use ten cores +#' mc.cores = if(isWindows) 1 else 5) # use five cores #' } #' #' # use applyFolds for outer function to avoid messing up weights #' my_outer_fun <- function(object, fun){ #' applyFolds(object = object, #' folds = cv(rep(1, length(unique(object$id))), -#' type = "bootstrap", B = 100), fun = fun, -#' mc.cores = 10) # parallelize on 10 cores +#' type = "bootstrap", B = 10), fun = fun, +#' mc.cores = if(isWindows) 1 else 10) # parallelize on 10 cores +#' } +#' +#' \donttest{ +#' bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, +#' resampling_fun_outer = my_outer_fun, +#' B_inner = 5, B_outer = 10) +# -> provide B_inner & B_outer only for enabling default plot #' } #' #' ######## Example for scalar-on-function-regression with bsignal() @@ -165,15 +175,10 @@ #' #' \donttest{ #' # takes some time, because of defaults: B_outer = 100, B_inner = 25 -#' bootCIs <- bootstrapCI(mod2) +#' bootCIs <- bootstrapCI(mod2, B_outer = 10, B_inner = 5) +#' # in practice, rather set B_outer = 1000 #' } #' -#' ## run with a larger number of outer bootstrap samples -#' ## and only 10-fold for validation of each outer fold -#' ## WARNING: This may take very long! -#' \donttest{ -#' bootCIs <- bootstrapCI(mod2, B_outer = 1000, B_inner = 10) -#' } #' #' @export bootstrapCI <- function(object, which = NULL, diff --git a/man/FDboost.Rd b/man/FDboost.Rd index 6af97e4..0d5b8ca 100644 --- a/man/FDboost.Rd +++ b/man/FDboost.Rd @@ -400,6 +400,19 @@ mod4 <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept = FAL ## plot(mod4) ## plotPredicted(mod4, lwdPred = 2) +\donttest{ + ## Find optimal mstop, small grid/low B for a fast example + set.seed(123) + folds4 <- cv(rep(1, length(unique(mod4$id))), B = 3) + appl4 <- applyFolds(mod4, folds = folds4, grid = 1:50) + ## val4 <- validateFDboost(mod4, folds = folds4, grid = 1:50) + + set.seed(123) + folds4long <- cvLong(id = mod4$id, weights = model.weights(mod4), B = 3) + cvm4 <- cvrisk(mod4, folds = folds4long, grid = 1:50) + mstop(cvm4) +} + ## Be careful if you want to predict newdata with irregular response, ## as the argument index is not considered in the prediction of newdata. ## Thus, all covariates have to be repeated according to the number of observations diff --git a/man/bootstrapCI.Rd b/man/bootstrapCI.Rd index 817f423..6d89523 100644 --- a/man/bootstrapCI.Rd +++ b/man/bootstrapCI.Rd @@ -130,23 +130,26 @@ plot(bootCIs, ask = FALSE) ## now speed things up by defining the inner resampling ## function with parallelization based on mclapply (does not work on Windows) +isWindows <- Sys.info()['sysname']=="Windows" my_inner_fun <- function(object){ cvrisk(object, folds = cvLong(id = object$id, weights = model.weights(object), B = 10 # 10-fold for inner resampling -), mc.cores = 10) # use ten cores +), mc.cores = if(isWindows) 1 else 10) # use ten cores } \donttest{ -bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun) +bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, + B_outer = 5) # small B_outer to speed up } ## We can also use the ... argument to parallelize the applyFolds ## function in the outer resampling \donttest{ -bootCIs <- bootstrapCI(m1, mc.cores = 30) +bootCIs <- bootstrapCI(m1, mc.cores = if(isWindows) 1 else 30, + B_inner = 5, B_outer = 3) } ## Now let's parallelize the outer resampling and use @@ -155,17 +158,23 @@ bootCIs <- bootstrapCI(m1, mc.cores = 30) my_inner_fun <- function(object){ cvrisk(object, folds = cvLong(id = object$id, weights = model.weights(object), type = "kfold", # use CV -B = 10, # 10-fold for inner resampling +B = 5, # 5-fold for inner resampling ), -mc.cores = 10) # use ten cores +mc.cores = if(isWindows) 1 else 5) # use five cores } # use applyFolds for outer function to avoid messing up weights my_outer_fun <- function(object, fun){ applyFolds(object = object, folds = cv(rep(1, length(unique(object$id))), -type = "bootstrap", B = 100), fun = fun, -mc.cores = 10) # parallelize on 10 cores +type = "bootstrap", B = 10), fun = fun, +mc.cores = if(isWindows) 1 else 10) # parallelize on 10 cores +} + +\donttest{ +bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, + resampling_fun_outer = my_outer_fun, + B_inner = 5, B_outer = 10) } ######## Example for scalar-on-function-regression with bsignal() @@ -192,15 +201,10 @@ mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check. \donttest{ # takes some time, because of defaults: B_outer = 100, B_inner = 25 -bootCIs <- bootstrapCI(mod2) +bootCIs <- bootstrapCI(mod2, B_outer = 10, B_inner = 5) + # in practice, rather set B_outer = 1000 } -## run with a larger number of outer bootstrap samples -## and only 10-fold for validation of each outer fold -## WARNING: This may take very long! -\donttest{ -bootCIs <- bootstrapCI(mod2, B_outer = 1000, B_inner = 10) -} } \author{ From d948f05eac9f0bd6ced5a5cfd65b81c6e8b60913 Mon Sep 17 00:00:00 2001 From: davidruegamer Date: Mon, 26 Sep 2022 21:10:45 +0200 Subject: [PATCH 21/56] remove unused level example bhistx --- R/baselearnersX.R | 4 ++-- R/bootstrapCIs.R | 1 - R/crossvalidation.R | 14 ++++++++------ man/bhistx.Rd | 8 ++++++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/R/baselearnersX.R b/R/baselearnersX.R index 1ce1e4d..8ad90b2 100644 --- a/R/baselearnersX.R +++ b/R/baselearnersX.R @@ -409,8 +409,8 @@ X_histx <- function(mf, vary, args) { #' dataList$X1h <- I(X1h) #' dataList$svals <- attr(data1, "xindex") #' ## add a factor variable -#' dataList$zlong <- factor(gl(n = 2, k = n/2, length = n*nygrid), levels = 1:3) -#' dataList$z <- factor(gl(n = 2, k = n/2, length = n), levels = 1:3) +#' dataList$zlong <- factor(gl(n = 2, k = n/2, length = n*nygrid), levels = 1:2) +#' dataList$z <- factor(gl(n = 2, k = n/2, length = n), levels = 1:2) #' #' ## do the model fit with main effect of bhistx() and interaction of bhistx() and bolsc() #' mod <- FDboost(Y ~ 1 + bhistx(x = X1h, df = 5, knots = 5) + diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index 415cc7b..ec1e574 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -148,7 +148,6 @@ #' bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, #' resampling_fun_outer = my_outer_fun, #' B_inner = 5, B_outer = 10) -# -> provide B_inner & B_outer only for enabling default plot #' } #' #' ######## Example for scalar-on-function-regression with bsignal() diff --git a/R/crossvalidation.R b/R/crossvalidation.R index f8b4f61..6d75e92 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -460,9 +460,10 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ } # compute risk with integration weights like in FDboost::validateFDboost - risk <- sapply(grid, function(g){riskfct( response_oobweights, - withCallingHandlers(predict(mod[g], newdata = dat_oobweights, toFDboost = FALSE), warning = h2), - w = oobwstand )}) ## oobwstand[oobweights[object$id] != 0 ] + risk <- sapply(grid, function(g){riskfct( + response_oobweights, + withCallingHandlers(predict(mod[g], newdata = dat_oobweights, toFDboost = FALSE), warning = h2), + w = oobwstand )}) ## oobwstand[oobweights[object$id] != 0 ] }else{ @@ -474,9 +475,10 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ } # compute risk with integration weights like in FDboost::validateFDboost - risk <- sapply(grid, function(g){riskfct( response_oobweights, - withCallingHandlers(predict(mod[g], newdata = dat_oobweights, toFDboost = FALSE), warning = h2), - w = oobwstand[oobweights != 0 ])}) + risk <- sapply(grid, function(g){riskfct( + response_oobweights, + withCallingHandlers(predict(mod[g], newdata = dat_oobweights, toFDboost = FALSE), warning = h2), + w = oobwstand[oobweights != 0 ])}) } diff --git a/man/bhistx.Rd b/man/bhistx.Rd index 67eca49..7d80fc8 100644 --- a/man/bhistx.Rd +++ b/man/bhistx.Rd @@ -125,8 +125,8 @@ X1h <- with(dataList, hmatrix(time = rep(tvals, each = n), id = rep(1:n, nygrid) dataList$X1h <- I(X1h) dataList$svals <- attr(data1, "xindex") ## add a factor variable -dataList$zlong <- factor(gl(n = 2, k = n/2, length = n*nygrid), levels = 1:3) -dataList$z <- factor(gl(n = 2, k = n/2, length = n), levels = 1:3) +dataList$zlong <- factor(gl(n = 2, k = n/2, length = n*nygrid), levels = 1:2) +dataList$z <- factor(gl(n = 2, k = n/2, length = n), levels = 1:2) ## do the model fit with main effect of bhistx() and interaction of bhistx() and bolsc() mod <- FDboost(Y ~ 1 + bhistx(x = X1h, df = 5, knots = 5) + @@ -142,6 +142,10 @@ mod <- FDboost(Y ~ 1 + bhistx(x = X1h, df = 5, knots = 5) \%X\% bols(zlong), cv <- cvrisk(mod, folds = cv(model.weights(mod), B = 5)) mstop(cv) mod[mstop(cv)] + + appl1 <- applyFolds(mod, folds = cv(rep(1, length(unique(mod$id))), type = "bootstrap", B = 5)) + + # plot(mod) } } From 7272361a54239cb5b0ed1e87057f280a8d3b2d87 Mon Sep 17 00:00:00 2001 From: davidruegamer Date: Fri, 4 Aug 2023 23:51:22 +0200 Subject: [PATCH 22/56] update docu for CRAN --- DESCRIPTION | 2 +- R/FDboost.R | 2 +- R/bootstrapCIs.R | 18 +++++------------- R/crossvalidation.R | 4 ++-- man/FDboost.Rd | 2 +- man/bootstrapCI.Rd | 18 +++++------------- man/validateFDboost.Rd | 4 ++-- 7 files changed, 17 insertions(+), 33 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e9172f8..46b1633 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -58,7 +58,7 @@ Collate: 'methods.R' 'stabsel.R' 'utilityFunctions.R' -RoxygenNote: 7.2.1 +RoxygenNote: 7.2.3 Encoding: UTF-8 BugReports: https://github.com/boost-R/FDboost/issues URL: https://github.com/boost-R/FDboost diff --git a/R/FDboost.R b/R/FDboost.R index aeed4ba..4b2c5df 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -106,7 +106,7 @@ #' With \code{FDboost} the following covariate effects can be estimated by specifying #' the following effects in the \code{formula} #' (similar to function \code{\link[refund]{pffr}} -#' in R-package \code{\link[refund:refund-package]{refund}}). +#' in R-package refund. #' The \code{timeformula} is used to expand the effects in \code{t}-direction. #' \itemize{ #' \item Linear functional effect of scalar (numeric or factor) covariate \eqn{z} that varies diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index ec1e574..7df5419 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -101,15 +101,10 @@ #' plot(bootCIs, ask = FALSE) #' } #' -#' ## now speed things up by defining the inner resampling -#' ## function with parallelization based on mclapply (does not work on Windows) -#' isWindows <- Sys.info()['sysname']=="Windows" -#' #' my_inner_fun <- function(object){ #' cvrisk(object, folds = cvLong(id = object$id, weights = -#' model.weights(object), -#' B = 10 # 10-fold for inner resampling -#' ), mc.cores = if(isWindows) 1 else 10) # use ten cores +#' model.weights(object), B = 2) # 10-fold for inner resampling +#' ) #' } #' #' \donttest{ @@ -121,8 +116,7 @@ #' ## function in the outer resampling #' #' \donttest{ -#' bootCIs <- bootstrapCI(m1, mc.cores = if(isWindows) 1 else 30, -#' B_inner = 5, B_outer = 3) +#' bootCIs <- bootstrapCI(m1, B_inner = 5, B_outer = 3) #' } #' #' ## Now let's parallelize the outer resampling and use @@ -132,16 +126,14 @@ #' cvrisk(object, folds = cvLong(id = object$id, weights = #' model.weights(object), type = "kfold", # use CV #' B = 5, # 5-fold for inner resampling -#' ), -#' mc.cores = if(isWindows) 1 else 5) # use five cores +#' )) # use five cores #' } #' #' # use applyFolds for outer function to avoid messing up weights #' my_outer_fun <- function(object, fun){ #' applyFolds(object = object, #' folds = cv(rep(1, length(unique(object$id))), -#' type = "bootstrap", B = 10), fun = fun, -#' mc.cores = if(isWindows) 1 else 10) # parallelize on 10 cores +#' type = "bootstrap", B = 10), fun = fun) # parallelize on 10 cores #' } #' #' \donttest{ diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 6d75e92..1782eeb 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -646,7 +646,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ #' mod <- mod[75] #' #' #### create folds for 3-fold bootstrap: one weight for each curve -#' set.seed(123) +#' set.seed(124) #' folds_bs <- cv(weights = rep(1, mod$ydim[1]), type = "bootstrap", B = 3) #' #' ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations @@ -670,7 +670,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ #' ## plot the estimated coefficients per fold #' ## more meaningful for higher number of folds, e.g., B = 100 #' par(mfrow = c(2,2)) -#' plotPredCoef(cvr2, terms = FALSE, which = 2) +#' plotPredCoef(cvr2, terms = FALSE, which = 1) #' plotPredCoef(cvr2, terms = FALSE, which = 3) #' #' ## compute out-of-bag risk and predictions for leaving-one-curve-out cross-validation diff --git a/man/FDboost.Rd b/man/FDboost.Rd index 0d5b8ca..aa8827f 100644 --- a/man/FDboost.Rd +++ b/man/FDboost.Rd @@ -158,7 +158,7 @@ see \code{\link[mboost]{Family}} for a list of implemented families. With \code{FDboost} the following covariate effects can be estimated by specifying the following effects in the \code{formula} (similar to function \code{\link[refund]{pffr}} -in R-package \code{\link[refund:refund-package]{refund}}). +in R-package refund. The \code{timeformula} is used to expand the effects in \code{t}-direction. \itemize{ \item Linear functional effect of scalar (numeric or factor) covariate \eqn{z} that varies diff --git a/man/bootstrapCI.Rd b/man/bootstrapCI.Rd index 6d89523..0c27324 100644 --- a/man/bootstrapCI.Rd +++ b/man/bootstrapCI.Rd @@ -128,15 +128,10 @@ bootCIs$mstops plot(bootCIs, ask = FALSE) } -## now speed things up by defining the inner resampling -## function with parallelization based on mclapply (does not work on Windows) -isWindows <- Sys.info()['sysname']=="Windows" - my_inner_fun <- function(object){ cvrisk(object, folds = cvLong(id = object$id, weights = -model.weights(object), -B = 10 # 10-fold for inner resampling -), mc.cores = if(isWindows) 1 else 10) # use ten cores +model.weights(object), B = 2) # 10-fold for inner resampling +) } \donttest{ @@ -148,8 +143,7 @@ bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, ## function in the outer resampling \donttest{ -bootCIs <- bootstrapCI(m1, mc.cores = if(isWindows) 1 else 30, - B_inner = 5, B_outer = 3) +bootCIs <- bootstrapCI(m1, B_inner = 5, B_outer = 3) } ## Now let's parallelize the outer resampling and use @@ -159,16 +153,14 @@ my_inner_fun <- function(object){ cvrisk(object, folds = cvLong(id = object$id, weights = model.weights(object), type = "kfold", # use CV B = 5, # 5-fold for inner resampling -), -mc.cores = if(isWindows) 1 else 5) # use five cores +)) # use five cores } # use applyFolds for outer function to avoid messing up weights my_outer_fun <- function(object, fun){ applyFolds(object = object, folds = cv(rep(1, length(unique(object$id))), -type = "bootstrap", B = 10), fun = fun, -mc.cores = if(isWindows) 1 else 10) # parallelize on 10 cores +type = "bootstrap", B = 10), fun = fun) # parallelize on 10 cores } \donttest{ diff --git a/man/validateFDboost.Rd b/man/validateFDboost.Rd index bbd390f..b022edf 100644 --- a/man/validateFDboost.Rd +++ b/man/validateFDboost.Rd @@ -121,7 +121,7 @@ mod <- FDboost(l10precip ~ 1 + bolsc(region, df = 4) + mod <- mod[75] #### create folds for 3-fold bootstrap: one weight for each curve - set.seed(123) + set.seed(124) folds_bs <- cv(weights = rep(1, mod$ydim[1]), type = "bootstrap", B = 3) ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations @@ -145,7 +145,7 @@ mod <- mod[75] ## plot the estimated coefficients per fold ## more meaningful for higher number of folds, e.g., B = 100 par(mfrow = c(2,2)) - plotPredCoef(cvr2, terms = FALSE, which = 2) + plotPredCoef(cvr2, terms = FALSE, which = 1) plotPredCoef(cvr2, terms = FALSE, which = 3) ## compute out-of-bag risk and predictions for leaving-one-curve-out cross-validation From 6c172c57d3a8f3dda6503a78b9a9a2f92334ee88 Mon Sep 17 00:00:00 2001 From: Almond-S Date: Wed, 1 May 2024 21:31:12 +0200 Subject: [PATCH 23/56] Bug fixed in X_olsc that corrupted centering in brandomc. --- R/baselearners.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/R/baselearners.R b/R/baselearners.R index a23bae5..f47fe00 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -2368,9 +2368,11 @@ X_olsc <- function(mf, vary, args) { args$contrasts.arg <- NULL } X <- model.matrix(as.formula(fm), data = mf, contrasts.arg = args$contrasts.arg) - if (DUMMY) + if (DUMMY) { attr(X, "contrasts") <- lapply(attr(X, "contrasts"), function(x) x <- "contr.dummy") + args$contrasts.arg <- "contr.dummy" + } contr <- attr(X, "contrasts") if (!args$intercept) X <- X[ , -1, drop = FALSE] From 652e99da236fe63505c89fdff542559344205005 Mon Sep 17 00:00:00 2001 From: Lucas Kook Date: Mon, 16 Dec 2024 21:38:56 +0100 Subject: [PATCH 24/56] fix Issue #27 with residuals() method --- R/methods.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/methods.R b/R/methods.R index 77043de..168ea7b 100644 --- a/R/methods.R +++ b/R/methods.R @@ -479,7 +479,8 @@ fitted.FDboost <- function(object, toFDboost = TRUE, ...) { residuals.FDboost <- function(object, ...){ if(!any(class(object)=="FDboostLong")){ - resid <- matrix(object$resid(), nrow=object$ydim[1]) + resid <- matrix(object$resid()) + resid <- matrix(resid, nrow = NROW(resid)) resid[is.na(object$response)] <- NA }else{ resid <- object$resid() From 380b022374cdadc738c043659225067428eb8800 Mon Sep 17 00:00:00 2001 From: Lucas Kook Date: Mon, 16 Dec 2024 21:45:34 +0100 Subject: [PATCH 25/56] fix Issue #27 with residuals() method --- R/methods.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/methods.R b/R/methods.R index 168ea7b..9e53d4d 100644 --- a/R/methods.R +++ b/R/methods.R @@ -480,7 +480,8 @@ residuals.FDboost <- function(object, ...){ if(!any(class(object)=="FDboostLong")){ resid <- matrix(object$resid()) - resid <- matrix(resid, nrow = NROW(resid)) + ydim <- ifelse(is.null(object$ydim[1]), NROW(resid), object$ydim[1]) + resid <- matrix(resid, nrow = ydim) resid[is.na(object$response)] <- NA }else{ resid <- object$resid() From 9dbf096deba09f42384ddf9b0207b112804bcb2b Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Wed, 19 Mar 2025 23:39:34 +0100 Subject: [PATCH 26/56] refactor: use `isTRUE(all.equal())` instead of `all.equal()` for checking boolean --- R/crossvalidation.R | 2 +- R/utilityFunctions.R | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 1782eeb..54c4f61 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -505,7 +505,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ OOBweights <- matrix(rep(sample_weights, ncol(folds)), ncol = ncol(folds)) OOBweights[folds > 0] <- 0 - if (all.equal(papply, mclapply) == TRUE) { + if (isTRUE(all.equal(papply, mclapply))) { oobrisk <- papply(1:ncol(folds), function(i) try(dummyfct(weights = folds[, i], oobweights = OOBweights[, i]), diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index f1a1e97..3fa7bf0 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -1107,7 +1107,7 @@ reweightData <- function(data, argvals, vars, ## check that all idvars are equal if(length(idvars)>1) - if(!all(sapply(data[idvars][-1],function(x)all.equal(data[idvars][[1]],x)=="TRUE"))) + if(!all(sapply(data[idvars][-1],function(x) isTRUE(all.equal(data[idvars][[1]], x))))) stop("All idvars must be identical.") idvars_new <- NULL @@ -1131,7 +1131,7 @@ reweightData <- function(data, argvals, vars, for(j in 1:length(nhm)){ ## check that idvars == idvars[[1]] and match id-variables in all hmatrix-objects - if(!is.null(idvars) && !(all.equal(c(getId(data[[nhm[j]]])), c(data[[idvars[1]]])) == "TRUE")) + if(!is.null(idvars) && !isTRUE(all.equal(c(getId(data[[nhm[j]]])), c(data[[idvars[1]]])))) stop("id variable in hmatrix object must be equal to idvars") ## subset hmatrix From 85e4e2be7d3549c3db0a6b8130804ec7186e34f5 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 09:46:45 +0100 Subject: [PATCH 27/56] perf: use faster `anyNA()` instead of `any(is.na())` --- R/FDboost.R | 6 +++--- R/baselearners.R | 4 ++-- R/factorize.R | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index 4b2c5df..10d6854 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -582,7 +582,7 @@ FDboost <- function(formula, ### response ~ xvars allCovs <- unique(c(nameid, all.vars(formula))) if(length(allCovs) > 1){ data <- data[allCovs[!allCovs %in% c(yname, nameyind)] ] - if( any(is.na(names(data))) ) data <- data[ !is.na(names(data)) ] + if( anyNA(names(data)) ) data <- data[ !is.na(names(data)) ] }else{ data <- list(NULL) # intercept-model without covariates } @@ -636,7 +636,7 @@ FDboost <- function(formula, ### response ~ xvars stopifnot(all(length(response) == sapply(time, length)) & length(response) == length(id)) else stopifnot(length(response) == length(time) & length(response) == length(id)) - if(any(is.na(response))) warning("For non-grid observations the response should not contain missing values.") + if(anyNA(response)) warning("For non-grid observations the response should not contain missing values.") if( !all(sort(unique(id)) == 1:length(unique(id))) ) stop("id has to be integers 1, 2, 3,..., N.") nr <- length(response) # total number of observations @@ -1045,7 +1045,7 @@ FDboost <- function(formula, ### response ~ xvars } # meanY <- sapply(1:nc, function(i) offsetFun(responseInter[,i], 1*!is.na(responseInter[,i]))) - if( is.null(meanY) || any(is.na(meanY)) ){ + if( is.null(meanY) || anyNA(meanY) ){ warning("Mean offset cannot be computed by family@offset(). Use a weighted mean instead.") meanY <- c() for(i in 1:nc){ diff --git a/R/baselearners.R b/R/baselearners.R index f47fe00..94510b4 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -124,11 +124,11 @@ integrationWeights <- function(X1, xind, id = NULL){ } # taking into account missing values - if(any(is.na(X1))){ + if(anyNA(X1)){ Lneu <- sapply(1:nrow(X1), function(i){ x <- X1[i,] - if(!any(is.na(x))){ + if(!anyNA(x)){ l <- L[i, ] # no missing values in curve i }else{ xindL <- xind # lower diff --git a/R/factorize.R b/R/factorize.R index 632c121..293264c 100644 --- a/R/factorize.R +++ b/R/factorize.R @@ -335,7 +335,7 @@ NULL #' predict.FDboost_fac <- function(object, newdata = NULL, which = NULL, ...) { w <- object$which(which) - if(any(is.na(w))) + if(anyNA(w)) stop("Don't know 'which' base-learner is meant.") names(w) <- names(object$baselearner)[w] drop(sapply(w, @@ -349,7 +349,7 @@ predict.FDboost_fac <- function(object, newdata = NULL, which = NULL, ...) { #' @rdname predict.FDboost_fac plot.FDboost_fac <- function(x, which = NULL, main = NULL, ...) { w <- x$which(which, usedonly = TRUE) - if(any(is.na(w))) + if(anyNA(w)) stop(paste("Don't know which base-learner is meant by:", which[which.min(is.na(w))])) if(is.null(main)) From c82889175c6d74b50675ccae78f7059ba1121b73 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 09:50:29 +0100 Subject: [PATCH 28/56] perf: use faster `anyDuplicated(x) > 0` instead of `any(duplicated(x))` --- R/hmatrix.R | 2 +- R/utilityFunctions.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/hmatrix.R b/R/hmatrix.R index bf4b99f..52f350d 100644 --- a/R/hmatrix.R +++ b/R/hmatrix.R @@ -82,7 +82,7 @@ hmatrix <- function(time, id, x, argvals=1:ncol(x), x <- matrix(x, ncol=ncol(x), nrow=nrow(x)) #### check argvals and x - if( any(duplicated(argvals)) ){ + if(anyDuplicated(argvals) > 0){ stop("argvals contains duplicates.") } if( is.unsorted(argvals) ){ diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index 3fa7bf0..af622cc 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -1178,7 +1178,7 @@ reweightData <- function(data, argvals, vars, my_temp_idvars <- temp_idvars i <- 1 ## add 0.1^1 to duplicates, 0.1^1 + 0.1^2 = 0.11 to triplicates, ... - while(any(duplicated(my_index_long))){ # loop until no more duplicates in the data + while(anyDuplicated(my_index_long) > 0){ # loop until no more duplicates in the data my_temp_idvars[duplicated(my_index_long)] <- my_temp_idvars[duplicated(my_index_long)] + 0.1^i my_index_long[duplicated(my_index_long)] <- my_index_long[duplicated(my_index_long)] + 0.1^i i <- i + 1 From e33300ed8b446f6c475fdbabb6ae1c7ee872c3e4 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 10:02:12 +0100 Subject: [PATCH 29/56] refactor: use more `seq_along(x)` instead of `1:length(x)` --- R/FDboost.R | 12 ++++++------ R/baselearners.R | 18 +++++++++--------- R/baselearnersX.R | 2 +- R/bootstrapCIs.R | 16 ++++++++-------- R/crossvalidation.R | 38 +++++++++++++++++++------------------- R/hmatrix.R | 6 +++--- R/methods.R | 40 ++++++++++++++++++++-------------------- R/stabsel.R | 4 ++-- R/utilityFunctions.R | 26 +++++++++++++------------- 9 files changed, 81 insertions(+), 81 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index 4b2c5df..34b40c9 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -463,7 +463,7 @@ FDboost <- function(formula, ### response ~ xvars ## insert id at end of each base-learner trmstrings2 <- paste(substr(trmstrings, 1 , nchar(trmstrings)-1), ", index=", id[2],")", sep = "") ## check if number of opening brackets is equal to number of closing brackets - equalBrackets <- sapply(1:length(trmstrings2), function(i) + equalBrackets <- sapply(seq_along(trmstrings2), function(i) { sapply(regmatches(trmstrings2[i], gregexpr("\\(", trmstrings2[i])), length) == sapply(regmatches(trmstrings2[i], gregexpr("\\)", trmstrings2[i])), length) @@ -485,7 +485,7 @@ FDboost <- function(formula, ### response ~ xvars ##equalBrackets <- NULL if(length(trmstrings) > 0){ ## insert index into the other base-learners of the tensor-product as well - for(i in 1:length(trmstrings)){ + for(i in seq_along(trmstrings)){ if(grepl( "%X", trmstrings2[i])){ temp <- unlist(strsplit(trmstrings2[i], "%X")) temp1 <- temp[-length(temp)] @@ -637,7 +637,7 @@ FDboost <- function(formula, ### response ~ xvars stopifnot(length(response) == length(time) & length(response) == length(id)) if(any(is.na(response))) warning("For non-grid observations the response should not contain missing values.") - if( !all(sort(unique(id)) == 1:length(unique(id))) ) stop("id has to be integers 1, 2, 3,..., N.") + if( !all(sort(unique(id)) == seq_along(unique(id))) ) stop("id has to be integers 1, 2, 3,..., N.") nr <- length(response) # total number of observations nc <- length(unique(id)) # number of trajectories @@ -683,7 +683,7 @@ FDboost <- function(formula, ### response ~ xvars ## check that the timevariable in timeformula and in the bhistx-base-learners have the same name if(any(grepl("bhistx", trmstrings))){ - for(j in 1:length(trmstrings)){ + for(j in seq_along(trmstrings)){ if(any(grepl("bhistx", trmstrings[j]))){ if(grepl("%X", trmstrings[j]) ){ temp <- strsplit(trmstrings[[j]], "%X.*%")[[1]] @@ -781,7 +781,7 @@ FDboost <- function(formula, ### response ~ xvars get_df <- function(bl){ split_bl <- unlist(strsplit(bl, split = "%.{1,3}%")) all_df <- c() - for(i in 1:length(split_bl)){ + for(i in seq_along(split_bl)){ parti <- parse(text = split_bl[i])[[1]] parti <- expand.call(definition = get(as.character(parti[[1]])), call = parti) dfi <- parti$df # df of part i in bl @@ -1166,7 +1166,7 @@ FDboost <- function(formula, ### response ~ xvars if(any( gsub(" ", "", strsplit(cfm[2], "\\+")[[1]]) == "1")){ effectsToCheck <- 2:length(ret$baselearner) }else{ - effectsToCheck <- 1:length(ret$baselearner) + effectsToCheck <- seq_along(ret$baselearner) } # predict each effect separately pred <- predict(ret, which = effectsToCheck) diff --git a/R/baselearners.R b/R/baselearners.R index f47fe00..39183f7 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -759,7 +759,7 @@ bsignal <- function(x, s, index = NULL, inS = c("smooth", "linear", "constant"), if(length(value) != names(mf[1])) stop(sQuote("value"), " must have same length as ", sQuote("names(mf[1])")) - for (i in 1:length(value)){ + for (i in seq_along(value)){ cll[[i+1]] <<- as.name(value[i]) } attr(mf, "names") <<- value @@ -1042,7 +1042,7 @@ bconcurrent <- function(x, s, time, index = NULL, #by = NULL, if(length(value) != names(mf[1])) stop(sQuote("value"), " must have same length as ", sQuote("names(mf[1])")) - for (i in 1:length(value)){ + for (i in seq_along(value)){ cll[[i+1]] <<- as.name(value[i]) } attr(mf, "names") <<- value @@ -1254,7 +1254,7 @@ X_hist <- function(mf, vary, args) { # tempj <- unlist(apply(!ind0, 1, which)) # in which columns are the values? # ## i: row numbers: one row number per observation of response, # # repeat the row number for each entry - # X1des <- sparseMatrix(i=rep(1:length(id), times=rowSums(!ind0)), j=tempj, + # X1des <- sparseMatrix(i=rep(seq_along(id), times=rowSums(!ind0)), j=tempj, # x=X1[cbind(rep(id, t=rowSums(!ind0)), tempj)], dims=dim(ind0)) # # object.size(X1des) # rm(tempj) @@ -1360,7 +1360,7 @@ X_hist <- function(mf, vary, args) { # stack design-matrix of response nobs times in wide format if(args$format == "wide"){ - Bt <- Bt[rep(1:length(yind), each=nobs), ] + Bt <- Bt[rep(seq_along(yind), each=nobs), ] } if(! mboost_intern(Bt, fun = "isMATRIX") ) Bt <- matrix(Bt, ncol=1) @@ -1574,7 +1574,7 @@ bhist <- function(x, s, time, index = NULL, #by = NULL, if(length(value) != names(mf[1])) stop(sQuote("value"), " must have same length as ", sQuote("names(mf[1])")) - for (i in 1:length(value)){ + for (i in seq_along(value)){ cll[[i+1]] <<- as.name(value[i]) } attr(mf, "names") <<- value @@ -1805,7 +1805,7 @@ bfpc <- function(x, s, index = NULL, df = 4, if(length(value) != names(mf[1])) stop(sQuote("value"), " must have same length as ", sQuote("names(mf[1])")) - for (i in 1:length(value)){ + for (i in seq_along(value)){ cll[[i+1]] <<- as.name(value[i]) } attr(mf, "names") <<- value @@ -1867,7 +1867,7 @@ X_bbsc <- function(mf, vary, args) { MATRIX <- MATRIX && options("mboost_useMatrix")$mboost_useMatrix if (MATRIX) { diag <- Diagonal - for (i in 1:length(mm)){ + for (i in seq_along(mm)){ tmp <- attributes(mm[[i]])[c("degree", "knots", "Boundary.knots")] mm[[i]] <- Matrix(mm[[i]]) attributes(mm[[i]])[c("degree", "knots", "Boundary.knots")] <- tmp @@ -2285,7 +2285,7 @@ bbsc <- function(..., by = NULL, index = NULL, knots = 10, boundary.knots = NULL if(length(value) != length(colnames(mf))) stop(sQuote("value"), " must have same length as ", sQuote("colnames(mf)")) - for (i in 1:length(value)){ + for (i in seq_along(value)){ cll[[i+1]] <<- as.name(value[i]) } attr(mf, "names") <<- value @@ -2559,7 +2559,7 @@ bolsc <- function(..., by = NULL, index = NULL, intercept = TRUE, df = NULL, if(length(value) != length(colnames(mf))) stop(sQuote("value"), " must have same length as ", sQuote("colnames(mf)")) - for (i in 1:length(value)){ + for (i in seq_along(value)){ cll[[i+1]] <<- as.name(value[i]) } attr(mf, "names") <<- value diff --git a/R/baselearnersX.R b/R/baselearnersX.R index 8ad90b2..c2648fb 100644 --- a/R/baselearnersX.R +++ b/R/baselearnersX.R @@ -522,7 +522,7 @@ bhistx <- function(x, if(length(value) != names(mf[1])) stop(sQuote("value"), " must have same length as ", sQuote("names(mf[1])")) - for (i in 1:length(value)){ + for (i in seq_along(value)){ cll[[i+1]] <<- as.name(value[i]) } attr(mf, "names") <<- value diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index 7df5419..20c0741 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -251,7 +251,7 @@ bootstrapCI <- function(object, which = NULL, ########## format coefficients ######### # number of baselearners - nrEffects <- max(sapply(1:length(coefs), + nrEffects <- max(sapply(seq_along(coefs), function(i) length(coefs[[i]]$smterms))) isFacSpecEffect <- sapply(1:nrEffects, @@ -272,10 +272,10 @@ bootstrapCI <- function(object, which = NULL, { if(isFacSpecEffect[i]){ # factor specific effect - lapply(1:length(coefs), function(j) lapply(1:(coefs[[1]]$smterms[[i]]$numberLevels), + lapply(seq_along(coefs), function(j) lapply(1:(coefs[[1]]$smterms[[i]]$numberLevels), function(k) coefs[[j]]$smterms[[i]][[k]]$value)) }else{ - lapply(1:length(coefs), function(j) coefs[[j]]$smterms[[i]]$value) + lapply(seq_along(coefs), function(j) coefs[[j]]$smterms[[i]]$value) } }) @@ -299,7 +299,7 @@ bootstrapCI <- function(object, which = NULL, # add information about the values of the covariate # and change format - for(i in 1:length(listOfCoefs)){ + for(i in seq_along(listOfCoefs)){ if(isFacSpecEffect[i]){ @@ -319,7 +319,7 @@ bootstrapCI <- function(object, which = NULL, if(is.list(listOfCoefs[[i]]) & is.factor(atx)){ # combine each factor level - listOfCoefs[[i]] <- lapply(1:length(levels(droplevels(atx))), + listOfCoefs[[i]] <- lapply(seq_along(levels(droplevels(atx))), function(faclevnr) t(sapply(listOfCoefs[[i]], function(x) x[faclevnr,]))) isSurface[i] <- FALSE @@ -375,7 +375,7 @@ bootstrapCI <- function(object, which = NULL, listOfQuantiles <- vector("list", length(listOfCoefs)) # calculate quantiles - for(i in 1:length(listOfCoefs)){ + for(i in seq_along(listOfCoefs)){ # for matrix object if(is.matrix(listOfCoefs[[i]]) & !is.list(listOfCoefs[[i]])){ @@ -418,7 +418,7 @@ bootstrapCI <- function(object, which = NULL, if(is.list(x)){ - for(j in 1:length(x)){ + for(j in seq_along(x)){ if(!is.null(dim(x[[j]]))){ rownames(x[[j]]) <- levels @@ -512,7 +512,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, } - if(is.null(which)) which <- 1:length(x$raw_results) + if(is.null(which)) which <- seq_along(x$raw_results) oldpar <- par(no.readonly = TRUE) on.exit(par(oldpar)) diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 54c4f61..400341a 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -248,7 +248,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ ## problem with index for bl containing index, and you do not get s for bsignal/bhist if(FALSE){ dathelp2 <- list() - for(j in 1:length(object$baselearner)){ + for(j in seq_along(object$baselearner)){ dat_bl_j <- object$baselearner[[j]]$get_data() ## object$baselearner[[j]]$model.frame() # if the variable is already present, do not add it again dathelp2 <- c(dathelp2, dat_bl_j[!names(dat_bl_j) %in% names(dathelp2)]) @@ -317,7 +317,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ # for each missing variable get the first baselearner, which contains the variable blWithMissVars <- lapply(names_variables[whMiss], function(w) - unlist(lapply(1:length(object$baselearner), function(i) if( + unlist(lapply(seq_along(object$baselearner), function(i) if( any( grepl(w, object$baselearner[[i]]$get_names() ) )) return(i)) )[1]) @@ -352,7 +352,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ if(any(isFac)){ namesFac <- names(isFac)[isFac] - for(i in 1:length(namesFac)){ + for(i in seq_along(namesFac)){ if(length(levels(droplevels(dathelp[[namesFac[i]]]))) != length(levels(droplevels(dat_weights[[namesFac[i]]])))) @@ -963,11 +963,11 @@ validateFDboost <- function(object, response = NULL, oobpreds <- matrix(nrow = nrow(oobpreds0[[1]]), ncol = ncol(oobpreds0[[1]])) if(any(class(object) == "FDboostLong")){ - for(i in 1:length(oobpreds0)){ # i runs over observed trajectories, i.e. over id + for(i in seq_along(oobpreds0)){ # i runs over observed trajectories, i.e. over id oobpreds[id == i, ] <- oobpreds0[[i]][id == i, ] } }else{ - for(j in 1:length(oobpreds0)){ + for(j in seq_along(oobpreds0)){ oobpreds[folds[ , j] == 0] <- oobpreds0[[j]][folds[ , j] == 0] } } @@ -1008,7 +1008,7 @@ validateFDboost <- function(object, response = NULL, ### estimates of coefficients timeHelp <- seq(min(modRisk[[1]]$mod$yind), max(modRisk[[1]]$mod$yind), l = 40) - for(l in 1:length(modRisk[[1]]$mod$baselearner)){ + for(l in seq_along(modRisk[[1]]$mod$baselearner)){ # estimate the coefficients for the model of the first fold my_coef <- coef(modRisk[[1]]$mod[optimalMstop], which = l, n1 = 40, n2 = 20, n3 = 15, n4 = 10)$smterms[[1]] @@ -1023,7 +1023,7 @@ validateFDboost <- function(object, response = NULL, attr(coefCV[[l]]$value, "offset") <- NULL # as offset is the same within one model # add estimates for the models of the other folds - coefCV[[l]]$value <- lapply(1:length(modRisk), function(g){ + coefCV[[l]]$value <- lapply(seq_along(modRisk), function(g){ ret <- coef(modRisk[[g]]$mod[optimalMstop], which = l, n1 = 40, n2 = 20, n3 = 15, n4 = 10)$smterms[[1]]$value # if(l==1){ @@ -1036,7 +1036,7 @@ validateFDboost <- function(object, response = NULL, ## %X% with numberLevels coefficient values in a list ## lapply(1:coefCV[[l]]$numberLevels, function(x) coefCV[[l]][[x]]$value) for(j in 1:coefCV[[l]]$numberLevels){ - coefCV[[l]][[j]]$value <- lapply(1:length(modRisk), function(g){ + coefCV[[l]][[j]]$value <- lapply(seq_along(modRisk), function(g){ ret <- coef(modRisk[[g]]$mod[optimalMstop], which = l, n1 = 40, n2 = 20, n3 = 15, n4 = 10)$smterms[[1]][[j]]$value attr(ret, "offset") <- NULL # as offset is the same within one model @@ -1048,7 +1048,7 @@ validateFDboost <- function(object, response = NULL, } ## predict offset - offset <- sapply(1:length(modRisk), function(g){ + offset <- sapply(seq_along(modRisk), function(g){ # offset is vector of length yind or numeric of length 1 for constant offset ret <- modRisk[[g]]$mod$predictOffset(time = timeHelp) if( length(ret) == 1 & length(object$yind) > 1 ) ret <- rep(ret, length(timeHelp)) @@ -1063,7 +1063,7 @@ validateFDboost <- function(object, response = NULL, # only makes sense for type="curves" with leaving-out one curve per fold!! if(grepl("curves", type)){ for(l in 1:(length(modRisk[[1]]$mod$baselearner)+1)){ - predCV[[l]] <- t(sapply(1:length(modRisk), function(g){ + predCV[[l]] <- t(sapply(seq_along(modRisk), function(g){ if(l == 1){ # save offset of model # offset is vector of length yind or numeric of length 1 for constant offset ret <- modRisk[[g]]$mod[optimalMstop]$predictOffset(object$yind) @@ -1356,7 +1356,7 @@ plotPredCoef <- function(x, which = NULL, pers = TRUE, stopifnot(any(class(x) == "validateFDboost")) - if(is.null(which)) which <- 1:length(x$coefCV) + if(is.null(which)) which <- seq_along(x$coefCV) oldpar <- par(no.readonly = TRUE) on.exit(par(oldpar)) @@ -1365,7 +1365,7 @@ plotPredCoef <- function(x, which = NULL, pers = TRUE, if(terms){ - if(all(which == 1:length(x$coefCV))){ + if(all(which == seq_along(x$coefCV))){ which <- 1:(length(x$coefCV)+1) }else{ which <- which + 1 @@ -1387,7 +1387,7 @@ plotPredCoef <- function(x, which = NULL, pers = TRUE, funplot(x$yind, unlist(x$predCV[[l]]), id=x$id, col="white", main=names(x$predCV)[l], xlab=attr(x$yind, "nameyind"), ylab="coef", ylim=ylim, ...) - for(i in 1:length(x$predCV[[l]])){ + for(i in seq_along(x$predCV[[l]])){ lines(x$yind[x$id==i], x$predCV[[l]][[i]], lwd=1, col=i) if(showNumbers){ points(x$yind[x$id==i], x$predCV[[l]][[i]], type="p", pch=paste0(i)) @@ -1562,7 +1562,7 @@ plot_bootstrapped_coef <- function(temp, l, # set lower triangular matrix to NA for historic effect if(grepl("bhist", temp$main)){ - for(k in 1:length(temp$value)){ + for(k in seq_along(temp$value)){ temp$value[[k]][temp$value[[k]]==0] <- NA } } @@ -1575,7 +1575,7 @@ plot_bootstrapped_coef <- function(temp, l, # plot coefficient surfaces at different pointwise quantiles if(pers){ matvec <- sapply(temp$value, c) - for(k in 1:length(probs)){ + for(k in seq_along(probs)){ tempZ <- matrix(apply(matvec, 1, quantile, probs=probs[k], na.rm=TRUE), ncol=length(temp$x)) @@ -1592,7 +1592,7 @@ plot_bootstrapped_coef <- function(temp, l, }else{ # do 2-dim plots - # for(j in 1:length(quanty)){ + # for(j in seq_along(quanty)){ # # myCol <- sapply(temp$value, function(x) x[, quanty[j]==temp$y]) # first column # @@ -1602,7 +1602,7 @@ plot_bootstrapped_coef <- function(temp, l, # # } # end loop over quanty # - # for(j in 1:length(quantx)){ + # for(j in seq_along(quantx)){ # myRow <- sapply(temp$value, function(x) x[quantx[j]==temp$x, ]) # first column # # plot_curves(x_i = temp$x, y_i = myRow, xlab_i = temp$xlab, @@ -1612,7 +1612,7 @@ plot_bootstrapped_coef <- function(temp, l, # } matvec <- sapply(temp$value, c) - for(k in 1:length(probs)){ + for(k in seq_along(probs)){ tempZ <- matrix(apply(matvec, 1, quantile, probs=probs[k], na.rm=TRUE), ncol=length(temp$x)) @@ -1633,7 +1633,7 @@ plot_bootstrapped_coef <- function(temp, l, }else{ # temp$x is factor - for(j in 1:length(quantx)){ + for(j in seq_along(quantx)){ # impute matrix of 0 if effect was never chosen temp$value[sapply(temp$value, function(x) is.null(dim(x)))] <- list(matrix(0, ncol=20, nrow=length(quantx))) diff --git a/R/hmatrix.R b/R/hmatrix.R index bf4b99f..e75b905 100644 --- a/R/hmatrix.R +++ b/R/hmatrix.R @@ -258,7 +258,7 @@ is.hmatrix <- function(object){ if(missing(j) || is.symbol(j)){ tempId <- r[ ,2] # get the id of the corresponding rows - tempId <- (1:length(unique(tempId)))[factor(tempId)] # transform the id to 1, 2, 3, ... + tempId <- (seq_along(unique(tempId)))[factor(tempId)] # transform the id to 1, 2, 3, ... return( hmatrix(time=r[ ,1], id=tempId, x=xAttr$x[unique(r[ ,2]), , drop=FALSE], argvals = xAttr$argvals, @@ -332,7 +332,7 @@ subset_hmatrix <- function(x, index, compress = TRUE) resMat <- rbind(resMat, matrix(c(rep(t, sum(idInT)), # for time points in hmatrix index[idInT], # for id in hmatrix - (1:length(index))[idInT]), # for idvars + (seq_along(index))[idInT]), # for idvars ncol=3)) } @@ -345,7 +345,7 @@ subset_hmatrix <- function(x, index, compress = TRUE) # id with duplicates idvars <- c(factor(resMat[,2])) # correct ordering - idvars <- (1:length(unique(idvars)))[factor(idvars)] + idvars <- (seq_along(unique(idvars)))[factor(idvars)] # rewrite index for actual matrix index <- unique(index) diff --git a/R/methods.R b/R/methods.R index 9e53d4d..0259641 100644 --- a/R/methods.R +++ b/R/methods.R @@ -150,7 +150,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR classes <- lapply(newdata, class) alln <- c() alllengthYind <- c() - for(i in 1:length(classes)){ + for(i in seq_along(classes)){ if( any(classes[[i]] == "hmatrix" ) ){ # number of trajectories n <- length(unique(newdata[[i]][,2]) ) @@ -188,7 +188,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR if(is.list(newdata) | is.data.frame(newdata)){ classes <- lapply(newdata, class) alllengthYind <- c(lengthYind) - for(i in 1:length(classes)){ + for(i in seq_along(classes)){ if( any(classes[[i]] == "hmatrix" ) ){ # total number of observation points lengthYind <- length(newdata[[i]][,1]) @@ -220,7 +220,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR posBconc <- grep("bconcurrent(", names(object$baselearner), fixed = TRUE) posBhist <- grep("bhist(", names(object$baselearner), fixed = TRUE) whichHelp <- which - if(is.null(which)) whichHelp <- 1:length(object$baselearner) + if(is.null(which)) whichHelp <- seq_along(object$baselearner) posBsignal <- whichHelp[whichHelp %in% posBsignal] posBconc <- whichHelp[whichHelp %in% posBconc] posBhist <- whichHelp[whichHelp %in% posBhist] @@ -253,7 +253,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR indnameY <- NULL } - for(j in 1:length(xname)){ + for(j in seq_along(xname)){ attr(newdata[[xname[j]]], "indname") <- indname[j] attr(newdata[[xname[j]]], "xname") <- xname[j] attr(newdata[[xname[j]]], "signalIndex") <- if(indname[j]!="xindDefault") newdata[[indname[j]]] else seq(0,1,l=ncol(newdata[[xname[j]]])) @@ -504,7 +504,7 @@ residuals.FDboost <- function(object, ...){ #' If \code{raw = TRUE} the coefficients of the model are returned. #' @param which a subset of base-learners for which the coefficients #' should be computed (numeric vector), -#' defaults to NULL which is the same as \code{which=1:length(object$baselearner)}. +#' defaults to NULL which is the same as \code{which=seq_along(object$baselearner)}. #' In the special case of \code{which=0}, only the coefficients of the offset are returned. #' @param computeCoef defaults to \code{TRUE}, if \code{FALSE} only the names of the terms are returned #' @param returnData return the dataset which is used to get the coefficient estimates as @@ -572,7 +572,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, } } - if(is.null(which)) which <- 1:length(object$baselearner) + if(is.null(which)) which <- seq_along(object$baselearner) ## special case of ~1 intercept specification with scalar response if( inherits(object, "FDboostScalar") && @@ -722,9 +722,9 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, }else{ # two %X% z1levels <- sort(unique(z1)) temp_d <- 1 - for(j in 1:length(zlevels)){ # loop over z + for(j in seq_along(zlevels)){ # loop over z d[[ trm$get_names()[position_z] ]] <- zlevels[j] # use j-th factor level of z - for(k in 1:length(z1levels)){ # loop over z1 + for(k in seq_along(z1levels)){ # loop over z d[[ trm$get_names()[position_z1] ]] <- z1levels[k] # use k-th factor level of z1 attr(d, "add_main") <- paste0(trm$get_names()[position_z], "=", zlevels[j], ", ", trm$get_names()[position_z1], "=", z1levels[k]) @@ -986,9 +986,9 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, dlist <- vector("list", numberLevels) temp_d <- 1 - for(j in 1:length(xlevels)){ # loop over x + for(j in seq_along(xlevels)){ # loop over x d[[1]] <- xlevels[j] # use j-th factor level of x - for(k in 1:length(zlevels)){ # loop over z + for(k in seq_along(zlevels)){ # loop over z d[[3]] <- zlevels[k] # use k-th factor level of z attr(d, "xm") <- d[[1]] attr(d, "zm") <- d[[3]] @@ -1003,7 +1003,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, numberLevels <- nlevels(z) zlevels <- sort(unique(z)) dlist <- vector("list", numberLevels) - for(j in 1:length(zlevels)){ # loop over z + for(j in seq_along(zlevels)){ # loop over z d[[3]] <- rep(zlevels[j], length(d[[1]])) # use j-th factor level of z attr(d, "zm") <- d[[3]] attr(d, "add_main") <- paste0(names(d)[3], "=", zlevels[j]) @@ -1014,7 +1014,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, numberLevels <- nlevels(x) xlevels <- sort(unique(x)) dlist <- vector("list", numberLevels) - for(j in 1:length(xlevels)){ # loop over x + for(j in seq_along(xlevels)){ # loop over x d[[1]] <- rep(xlevels[j], length(d[[3]])) # use j-th factor level of x attr(d, "xm") <- d[[1]] attr(d, "add_main") <- paste0(names(d)[1], "=", xlevels[j]) @@ -1026,7 +1026,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, numberLevels <- n4 zlevels <- seq(min(z), max(z), l = n4) dlist <- vector("list", numberLevels) - for(j in 1:length(zlevels)){ # loop over x + for(j in seq_along(zlevels)){ # loop over x d[[3]] <- rep(zlevels[j], length(d[[1]])) # use j-th quantile of x attr(d, "zm") <- d[[1]] attr(d, "add_main") <- paste0(names(d)[3], "=", round(zlevels[j], 2)) @@ -1243,10 +1243,10 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, xpart <- unlist(strsplit(x, split = "%.{1,3}%")) ## find the expressions at which the split is done operator <- gregexpr(pattern = "%.{1,3}%", text = x)[[1]] - operator <- sapply(1:length(operator), + operator <- sapply(seq_along(operator), function(i) substr(x, operator[i], operator[i] + attr(operator, "match.length")[i] -1 ) ) - for(i in 1:length(xpart)){ + for(i in seq_along(xpart)){ xpart[i] <- gsub(pattern = "\\\"", replacement = "", x = xpart[i], fixed=TRUE) xpart[i] <- gsub(pattern = "\\", replacement = "", x = xpart[i], fixed=TRUE) nvar <- length(all.vars(formula(paste("Y~", xpart[i])))[-1]) @@ -1417,7 +1417,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, ### get the effects to be plotted whichSpecified <- which - if(is.null(which)) which <- 1:length(x$baselearner) + if(is.null(which)) which <- seq_along(x$baselearner) if(onlySelected){ which <- intersect(which, c(0, selected(x))) @@ -1635,7 +1635,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, ### 3 dim plots # persp-plot for 3-dim effects if(trm$dim == 3 & pers){ - for(j in 1:length(trm$z)){ + for(j in seq_along(trm$z)){ plotWithArgs(persp, args=argsPersp, myargs=list(x=trm$x, y=trm$y, z=trm$value[[j]], xlab=paste("\n", trm$xlab), ylab=paste("\n", trm$ylab), zlab=paste("\n", "coef"), @@ -1647,7 +1647,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } # image for 3-dim effects if(trm$dim == 3 & !pers){ - for(j in 1:length(trm$z)){ + for(j in seq_along(trm$z)){ plotWithArgs(image, args=argsImage, myargs=list(x=trm$x, y=trm$y, z=trm$value[[j]], xlab=trm$xlab, ylab=trm$ylab, col = heat.colors(length(trm$x)^2), zlim=range(trm$value), @@ -1662,7 +1662,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } ## end function myplot() - for(i in 1:length(terms)){ + for(i in seq_along(terms)){ trm <- terms[[i]] @@ -1728,7 +1728,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, if(!is.null(dots$ylim)) range <- dots$ylim - for(i in 1:length(terms)){ + for(i in seq_along(terms)){ # set values of predicted effect to missing if response is missing if(sum(is.na(x$response)) > 0) terms[[i]][is.na(x$response)] <- NA diff --git a/R/stabsel.R b/R/stabsel.R index a42229d..904a242 100644 --- a/R/stabsel.R +++ b/R/stabsel.R @@ -138,7 +138,7 @@ stabsel.FDboost <- function(x, refitSmoothOffset = TRUE, fun <- function(model) { xs <- selected(model) - qq <- sapply(1:length(xs), function(x) length(unique(xs[1:x]))) + qq <- sapply(seq_along(xs), function(x) length(unique(xs[1:x]))) xs[qq > q] <- xs[1] xs } @@ -184,7 +184,7 @@ stabsel.FDboost <- function(x, refitSmoothOffset = TRUE, m <- mstop(x) } ret <- matrix(0, nrow = length(ibase), ncol = m) - for (i in 1:length(ss)) { + for (i in seq_along(ss)) { tmp <- sapply(ibase, function(x) ifelse(x %in% ss[[i]], which(ss[[i]] == x)[1], m + 1)) ret <- ret + t(sapply(tmp, function(x) c(rep(0, x - 1), rep(1, m - x + 1)))) diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index 3fa7bf0..c600216 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -54,7 +54,7 @@ truncateTime <- function(funVar, time, newtime, data){ ret <- data ret[[time]] <- newtime - for(i in 1:length(funVar)){ + for(i in seq_along(funVar)){ ret[[funVar[i]]] <- ret[[funVar[i]]][ , data[[time]] %in% newtime] } rm(data) @@ -153,7 +153,7 @@ funplot <- function(x, y, id=NULL, rug=TRUE, ...){ stopifnot(length(x)==length(y) & length(y)==length(id)) idOrig <- id - for(i in 1:length(unique(idOrig))){ + for(i in seq_along(unique(idOrig))){ id[idOrig==unique(idOrig)[i]] <- i } @@ -228,7 +228,7 @@ plotPredicted <- function(x, subset=NULL, posLegend="topleft", lwdObs=1, lwdPred if(any(class(x) == "FDboostScalar")){ - if(is.null(subset)) subset <- 1:length(x$response) + if(is.null(subset)) subset <- seq_along(x$response) response <- x$response[subset, drop=FALSE] pred <- fitted(x)[subset, drop=FALSE] pred[is.na(response)] <- NA @@ -296,7 +296,7 @@ plotResiduals <- function(x, subset=NULL, posLegend="topleft", ...){ if(any(class(x) == "FDboostScalar")){ - if(is.null(subset)) subset <- 1:length(x$response) + if(is.null(subset)) subset <- seq_along(x$response) response <- x$response[subset, drop=FALSE] resid <- x$resid()[subset, drop=FALSE] @@ -349,7 +349,7 @@ getYYhatTime <- function(object, breaks=object$yind){ yInter <- t(apply(y, 1, function(x) approx(object$yind, x, xout=time)$y)) # Get dataframe to predict values at time newdata <- list() - for(j in 1:length(object$baselearner)){ + for(j in seq_along(object$baselearner)){ datVarj <- object$baselearner[[j]]$get_data() if(grepl("bconcurrent", names(object$baselearner)[j])){ datVarj <- t(apply(datVarj[[1]], 1, function(x) approx(object$yind, x, xout=time)$y)) @@ -415,7 +415,7 @@ funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, yhat <- object$fitted() time <- object$yind id <- object$id - if(is.null(id)) id <- 1:length(y) + if(is.null(id)) id <- seq_along(y) if(overTime & !global) { overTime <- FALSE message("For scalar or irregualr response the functional R-squared cannot be computed over time.") @@ -532,7 +532,7 @@ funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, yhat <- object$fitted() time <- object$yind id <- object$id - if(is.null(id)) id <- 1:length(y) + if(is.null(id)) id <- seq_along(y) if(overTime & !global) { overTime <- FALSE message("For scalar or irregualr response the functional MSE cannot be computed over time.") @@ -619,7 +619,7 @@ funMRD <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ... yhat <- object$fitted() time <- object$yind id <- object$id - if(is.null(id)) id <- 1:length(y) + if(is.null(id)) id <- seq_along(y) if(overTime & !global) { overTime <- FALSE message("For scalar or irregualr response the functional MRD cannot be computed over time.") @@ -734,7 +734,7 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, if( length(yind) < nrow(X1des) | all(table(yind) / max(id) > 0.8) ){ if(is.null(t_unique)) t_unique <- sort(unique(yind)) logCondDs_hist <- rep(NA, length=length(t_unique)) - for(k in 1:length(t_unique)){ + for(k in seq_along(t_unique)){ Ds_t <- X1des[yind==t_unique[k], ] # get rows of Ds corresponding to yind ind0Bs_t <- ind0Bs[yind==t_unique[k], ] # get rows of ind0Bs corresponding to yind # only keep columns that are not completely 0, otherwise matrix is always rank deficient @@ -829,7 +829,7 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, if(!is.null(limits)){ subs <- list() - for(k in 1:length(t_unique)){ + for(k in seq_along(t_unique)){ subs[[k]] <- which(limits(s=xind, t=t_unique[k])) } cumOverlapKe <- sapply(subs, getOverlap, X1=X1, L=L, Bs=Bs, K=K) @@ -1128,7 +1128,7 @@ reweightData <- function(data, argvals, vars, newHmats <- vector("list", length(nhm)) ## construct the new hmatrices - for(j in 1:length(nhm)){ + for(j in seq_along(nhm)){ ## check that idvars == idvars[[1]] and match id-variables in all hmatrix-objects if(!is.null(idvars) && !isTRUE(all.equal(c(getId(data[[nhm[j]]])), c(data[[idvars[1]]])))) @@ -1157,7 +1157,7 @@ reweightData <- function(data, argvals, vars, if(any(idvars %in% longvars)) longvars <- longvars[!longvars %in% idvars] ## create weights and index in long format weights_long <- weights[data[[idvars[1]]]] - index_long <- rep(1:length(weights_long), weights_long) + index_long <- rep(seq_along(weights_long), weights_long) ## indexing variables in long format temp_long <- lapply(longvars, function(nameWithoutDim) data[[nameWithoutDim]][index_long]) @@ -1200,7 +1200,7 @@ reweightData <- function(data, argvals, vars, if(!is.null(idvars)){ ## only works for common observation grid of response - ## idvars_new <- rep(1:length(index), nc) # index = c(1, 1, 2) -> 1, 2, 3 + ## idvars_new <- rep(seq_along(index), nc) # index = c(1, 1, 2) -> 1, 2, 3 for(ifr in idvars){ data[[ifr]] <- idvars_new From 9e9b57a05f44cccbce0ba28f7c2e11a7f8947252 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 10:02:17 +0100 Subject: [PATCH 30/56] refactor: use more `seq_along(x)` instead of `1:length(x)` --- tests/factorize_test_irregular.R | 4 ++-- tests/factorize_test_regular.R | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/factorize_test_irregular.R b/tests/factorize_test_irregular.R index 2e62a45..2d9e089 100644 --- a/tests/factorize_test_irregular.R +++ b/tests/factorize_test_irregular.R @@ -93,7 +93,7 @@ x_plot <- list(x, x, fx[[3]]) cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) -for(w in 1:length(wch)) { +for(w in seq_along(wch)) { plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) @@ -158,7 +158,7 @@ ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, wh opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) -for(w in 1:length(wch)) { +for(w in seq_along(wch)) { plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) diff --git a/tests/factorize_test_regular.R b/tests/factorize_test_regular.R index 2945c09..5f05e75 100644 --- a/tests/factorize_test_regular.R +++ b/tests/factorize_test_regular.R @@ -76,7 +76,7 @@ x_plot <- list(x, x, fx[[3]]) cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) -for(w in 1:length(wch)) { +for(w in seq_along(wch)) { plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) From 2595cbc49f536dda80d4731c2f3b35e6ee654b8f Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 12:27:50 +0100 Subject: [PATCH 31/56] refactor: replace `1:ncol(x)` with safer `seq_len(ncol(x))` --- R/baselearners.R | 36 +++++++++++++++++----------------- R/baselearnersX.R | 6 +++--- R/crossvalidation.R | 8 ++++---- R/hmatrix.R | 4 ++-- R/methods.R | 2 +- R/utilityFunctions.R | 6 +++--- tests/factorize_test_regular.R | 2 +- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/R/baselearners.R b/R/baselearners.R index 641cef0..a9410d4 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -273,7 +273,7 @@ X_bsignal <- function(mf, vary, args) { "linear" = matrix(c(rep(1, length(xind)), xind), ncol=2), "constant"= matrix(c(rep(1, length(xind))), ncol=1)) - colnames(Bs) <- paste(xname, 1:ncol(Bs), sep="") + colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") # use cyclic splines @@ -288,7 +288,7 @@ X_bsignal <- function(mf, vary, args) { fun = "cbs") } - colnames(Bs) <- paste(xname, 1:ncol(Bs), sep="") + colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") ### Penalty matrix: product differences matrix if (args$differences > 0){ @@ -343,7 +343,7 @@ X_bsignal <- function(mf, vary, args) { # Design matrix is product of weighted X1 and basis expansion over xind X <- (L*X1) %*% Bs - colnames(X) <- paste0(xname, 1:ncol(X)) + colnames(X) <- paste0(xname, seq_len(ncol(X))) ## see Scheipl and Greven (2016): ## Identifiability in penalized function-on-function regression models @@ -680,14 +680,14 @@ bsignal <- function(x, s, index = NULL, inS = c("smooth", "linear", "constant"), varnames <- all.vars(cll) # if(length(mfL)==1){ - # mfL[[2]] <- 1:ncol(mfL[[1]]); cll[[3]] <- "xind" + # mfL[[2]] <- seq_len(ncol(mfL[[1]])); cll[[3]] <- "xind" # varnames <- c(all.vars(cll), "xindDefault") # } # Reshape mfL so that it is the dataframe of the signal with the index as attribute xname <- varnames[1] indname <- varnames[2] - if(is.null(colnames(x))) colnames(x) <- paste(xname, 1:ncol(x), sep="_") + if(is.null(colnames(x))) colnames(x) <- paste(xname, seq_len(ncol(x)), sep="_") attr(x, "signalIndex") <- s attr(x, "xname") <- xname attr(x, "indname") <- indname @@ -870,12 +870,12 @@ X_conc <- function(mf, vary, args) { fun = "cbs") } - colnames(Bs) <- paste(xname, 1:ncol(Bs), sep="") + colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") # set up design matrix for concurrent model if(args$format=="wide"){ listCol <- list() - for(i in 1:ncol(X1)){ + for(i in seq_len(ncol(X1))){ listCol[[i]] <- X1[,i] } X1des <- as.matrix(bdiag(listCol)) @@ -958,7 +958,7 @@ bconcurrent <- function(x, s, time, index = NULL, #by = NULL, attr(x, "id") <- index if(mboost_intern(x, fun = "isMATRIX") && - is.null(colnames(x))) colnames(x) <- paste(xname, 1:ncol(x), sep="_") + is.null(colnames(x))) colnames(x) <- paste(xname, seq_len(ncol(x)), sep="_") attr(x, "signalIndex") <- s attr(x, "xname") <- xname attr(x, "indname") <- indname @@ -1176,7 +1176,7 @@ X_hist <- function(mf, vary, args) { "linear" = matrix(c(rep(1, length(xind)), xind), ncol = 2), "constant"= matrix(c(rep(1, length(xind))), ncol = 1)) - colnames(Bs) <- paste(xname, 1:ncol(Bs), sep="") + colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") # integration weights L <- args$intFun(X1=X1, xind=xind) @@ -1188,7 +1188,7 @@ X_hist <- function(mf, vary, args) { # # set up design matrix for historical model and s<=t with s and t equal to xind # # expand matrix of original observations to lower triangular matrix # X1des0 <- matrix(0, ncol=ncol(X1), nrow=ncol(X1)*nrow(X1)) - # for(i in 1:ncol(X1des0)){ + # for(i in seq_len(ncol(X1des0))){ # #print(nrow(X1)*(i-1)+1) # X1des0[(nrow(X1)*(i-1)+1):nrow(X1des0) ,i] <- X1[,i] # use fun. variable * integration weights # } @@ -1368,11 +1368,11 @@ X_hist <- function(mf, vary, args) { # calculate row-tensor # X <- (X1 %x% t(rep(1, ncol(X2))) ) * ( t(rep(1, ncol(X1))) %x% X2 ) dimnames(Bt) <- NULL # otherwise warning "dimnames [2] mismatch..." - X <- X1des[,rep(1:ncol(Bs), each=ncol(Bt))] * Bt[,rep(1:ncol(Bt), times=ncol(Bs))] + X <- X1des[, rep(seq_len(ncol(Bs)), each=ncol(Bt))] * Bt[, rep(seq_len(ncol(Bt)), times=ncol(Bs))] if(! mboost_intern(X, fun = "isMATRIX") ) X <- matrix(X, ncol=1) - colnames(X) <- paste0(xname, 1:ncol(X)) + colnames(X) <- paste0(xname, seq_len(ncol(X))) ### Penalty matrix: product differences matrix for smooth effect if(args$inS == "smooth"){ @@ -1483,7 +1483,7 @@ bhist <- function(x, s, time, index = NULL, #by = NULL, indname <- varnames[2] indnameY <- varnames[3] if(length(varnames)==2) indnameY <- varnames[2] - if(is.null(colnames(x))) colnames(x) <- paste(xname, 1:ncol(x), sep="_") + if(is.null(colnames(x))) colnames(x) <- paste(xname, seq_len(ncol(x)), sep="_") attr(x, "signalIndex") <- s attr(x, "xname") <- xname attr(x, "indname") <- indname @@ -1689,7 +1689,7 @@ X_fpc <- function(mf, vary, args) { ##stop("In bfpc the grid for the functional covariate has to be the same as in the model fit!") ## linear interpolation of the basis functions approxEfunctions <- matrix(NA, nrow=length(xind), ncol=length(args$subset)) - for(i in 1:ncol(klX$efunctions[ , args$subset, drop = FALSE])){ + for(i in seq_len(ncol(klX$efunctions[, args$subset, drop = FALSE]))){ approxEfunctions[,i] <- approx(x=args$klX$xind, y=klX$efunctions[,i], xout=xind)$y } approxMu <- approx(x=args$klX$xind, y=klX$mu, xout=xind)$y @@ -1700,7 +1700,7 @@ X_fpc <- function(mf, vary, args) { } - colnames(X) <- paste(xname, ".PC", 1:ncol(X), sep = "") + colnames(X) <- paste(xname, ".PC", seq_len(ncol(X)), sep = "") ## set up the penalty matrix K <- switch(args$penalty, @@ -1747,7 +1747,7 @@ bfpc <- function(x, s, index = NULL, df = 4, # Reshape mfL so that it is the dataframe of the signal with the index as attribute xname <- varnames[1] indname <- varnames[2] - if(is.null(colnames(x))) colnames(x) <- paste(xname, 1:ncol(x), sep="_") + if(is.null(colnames(x))) colnames(x) <- paste(xname, seq_len(ncol(x)), sep="_") attr(x, "signalIndex") <- s attr(x, "xname") <- xname attr(x, "indname") <- indname @@ -1879,7 +1879,7 @@ X_bbsc <- function(mf, vary, args) { if (vary != "") { by <- model.matrix(as.formula(paste("~", vary, collapse = "")), data = mf)[ , -1, drop = FALSE] # drop intercept - DM <- lapply(1:ncol(by), function(i) { + DM <- lapply(seq_len(ncol(by)), function(i) { ret <- X * by[, i] colnames(ret) <- paste(colnames(ret), colnames(by)[i], sep = ":") ret @@ -2386,7 +2386,7 @@ X_olsc <- function(mf, vary, args) { if (vary != "") { by <- model.matrix(as.formula(paste("~", vary, collapse = "")), data = mf)[ , -1, drop = FALSE] # drop intercept - DM <- lapply(1:ncol(by), function(i) { + DM <- lapply(seq_len(ncol(by)), function(i) { ret <- X * by[, i] colnames(ret) <- paste(colnames(ret), colnames(by)[i], sep = ":") ret diff --git a/R/baselearnersX.R b/R/baselearnersX.R index c2648fb..f039832 100644 --- a/R/baselearnersX.R +++ b/R/baselearnersX.R @@ -92,7 +92,7 @@ X_histx <- function(mf, vary, args) { "linear" = matrix(c(rep(1, length(xind)), xind), ncol = 2), "constant"= matrix(c(rep(1, length(xind))), ncol = 1)) - colnames(Bs) <- paste(xname, 1:ncol(Bs), sep="") + colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") # integration weights L <- args$intFun(X1=X1, xind=xind) @@ -234,11 +234,11 @@ X_histx <- function(mf, vary, args) { # calculate row-tensor # X <- (X1 %x% t(rep(1, ncol(X2))) ) * ( t(rep(1, ncol(X1))) %x% X2 ) dimnames(Bt) <- NULL # otherwise warning "dimnames [2] mismatch..." - X <- X1des[,rep(1:ncol(Bs), each=ncol(Bt))] * Bt[,rep(1:ncol(Bt), times=ncol(Bs))] + X <- X1des[, rep(seq_len(ncol(Bs)), each=ncol(Bt))] * Bt[, rep(seq_len(ncol(Bt)), times=ncol(Bs))] if(! mboost_intern(X, fun = "isMATRIX") ) X <- matrix(X, ncol=1) - colnames(X) <- paste0(xname, 1:ncol(X)) + colnames(X) <- paste0(xname, seq_len(ncol(X))) ### Penalty matrix: product differences matrix for smooth effect if(args$inS == "smooth"){ diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 400341a..e956817 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -506,14 +506,14 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ OOBweights[folds > 0] <- 0 if (isTRUE(all.equal(papply, mclapply))) { - oobrisk <- papply(1:ncol(folds), + oobrisk <- papply(seq_len(ncol(folds)), function(i) try(dummyfct(weights = folds[, i], oobweights = OOBweights[, i]), silent = TRUE), mc.preschedule = mc.preschedule, ...) } else { - oobrisk <- papply(1:ncol(folds), + oobrisk <- papply(seq_len(ncol(folds)), function(i) try(dummyfct(weights = folds[, i], oobweights = OOBweights[, i]), silent = TRUE), @@ -895,11 +895,11 @@ validateFDboost <- function(object, response = NULL, ### computation of models on partitions of data if(Sys.info()["sysname"]=="Linux"){ - modRisk <- mclapply(1:ncol(folds), + modRisk <- mclapply(seq_len(ncol(folds)), function(i) dummyfct(weights = folds[, i], oobweights = OOBweights[, i]), ...) }else{ - modRisk <- mclapply(1:ncol(folds), + modRisk <- mclapply(seq_len(ncol(folds)), function(i) dummyfct(weights = folds[, i], oobweights = OOBweights[, i]), mc.cores = 1) } diff --git a/R/hmatrix.R b/R/hmatrix.R index b65a5db..0b537cf 100644 --- a/R/hmatrix.R +++ b/R/hmatrix.R @@ -15,7 +15,7 @@ #' @param id specify to which curve the point belongs to, id from 1, 2, ..., n. #' @param x matrix of functional covariate, each trajectory is in one row #' @param argvals set of argument values, i.e., the common gird at which the functional covariate -#' is observed, by default \code{1:ncol(x)} +#' is observed, by default \code{seq_len(ncol(x))} #' @param timeLab name of the time axis, by default \code{t} #' @param idLab name of the id variable, by default \code{wideIndex} #' @param xLab name of the functional variable, by default NULL @@ -70,7 +70,7 @@ #' @return An matrix object of type \code{"hmatrix"} #' #' @export -hmatrix <- function(time, id, x, argvals=1:ncol(x), +hmatrix <- function(time, id, x, argvals=seq_len(ncol(x)), timeLab="t", idLab="wideIndex", xLab="x", argvalsLab="s"){ ## check that id is integer valued containing 1, 2, 3, ..., n diff --git a/R/methods.R b/R/methods.R index 0259641..d045bd0 100644 --- a/R/methods.R +++ b/R/methods.R @@ -1691,7 +1691,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, # convert matrix into a list, each list entry for one effect if(is.null(x$ydim) & !is.null(dim(terms))){ temp <- list() - for(i in 1:ncol(terms)){ + for(i in seq_len(ncol(terms))){ temp[[i]] <- terms[,i] } names(temp) <- colnames(terms) diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index 379720b..60175da 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -752,7 +752,7 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, logCondDs_hist[k] <- log10(max(evDs)) - log10(min(evDs)) } ## matplot(xind, Bs, type="l", lwd=2, ylim=c(-2,2)); rug(xind); rug(yind, col=2, lwd=2) - ## matplot(knots[1:ncol(Ds_t)], t(Ds_t), type="l", lwd=1, add=TRUE) + ## matplot(knots[seq_len(ncol(Ds_t))], t(Ds_t), type="l", lwd=1, add=TRUE) ## lines(t_unique, logCondDs_hist-6, col=2, lwd=4) } names(logCondDs_hist) <- round(t_unique,2) @@ -836,11 +836,11 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, overlapKe <- max(cumOverlapKe, na.rm = TRUE) #cumOverlapKe[[length(cumOverlapKe)]] }else{ # overlap between whole matrix X and penalty - overlapKe <- getOverlap(subset=1:ncol(X1), X1=X1, L=L, Bs=Bs, K=K) + overlapKe <- getOverlap(subset=seq_len(ncol(X1)), X1=X1, L=L, Bs=Bs, K=K) } # look at overlap with whole functional covariate - overlapKeComplete <- getOverlap(subset=1:ncol(X1), X1=X1, L=L, Bs=Bs, K=K) + overlapKeComplete <- getOverlap(subset=seq_len(ncol(X1)), X1=X1, L=L, Bs=Bs, K=K) if(giveWarnings & overlapKe >= 1){ warning("Kernel overlap for <", xname, "> and the specified basis and penalty detected. ", diff --git a/tests/factorize_test_regular.R b/tests/factorize_test_regular.R index 5f05e75..a7bf644 100644 --- a/tests/factorize_test_regular.R +++ b/tests/factorize_test_regular.R @@ -89,7 +89,7 @@ par(opar) # re-compose prediction preds <- lapply(fac, predict) PREDSf <- array(0, dim = c(nrow(preds$resp),nrow(preds$cov))) -for(i in 1:ncol(preds$resp)) +for(i in seq_len(ncol(preds$resp))) PREDSf <- PREDSf + preds$resp[,i] %*% t(preds$cov[,i]) opar <- par(mfrow = c(1,2)) From 9bdf70bce1138765032f881e07c8a5bf2a77f9c9 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 12:40:42 +0100 Subject: [PATCH 32/56] dosc: missing document --- DESCRIPTION | 2 +- man/FDboost-package.Rd | 1 - man/coef.FDboost.Rd | 2 +- man/factorize.Rd | 8 ++++---- man/hmatrix.Rd | 4 ++-- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 46b1633..defcfcd 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -58,7 +58,7 @@ Collate: 'methods.R' 'stabsel.R' 'utilityFunctions.R' -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.2 Encoding: UTF-8 BugReports: https://github.com/boost-R/FDboost/issues URL: https://github.com/boost-R/FDboost diff --git a/man/FDboost-package.Rd b/man/FDboost-package.Rd index 65ad3c8..9b9c520 100644 --- a/man/FDboost-package.Rd +++ b/man/FDboost-package.Rd @@ -3,7 +3,6 @@ \docType{package} \name{FDboost-package} \alias{FDboost-package} -\alias{_PACKAGE} \alias{FDboost_package} \alias{package-FDboost} \title{FDboost: Boosting Functional Regression Models} diff --git a/man/coef.FDboost.Rd b/man/coef.FDboost.Rd index 0db6969..ba39ff8 100644 --- a/man/coef.FDboost.Rd +++ b/man/coef.FDboost.Rd @@ -26,7 +26,7 @@ If \code{raw = TRUE} the coefficients of the model are returned.} \item{which}{a subset of base-learners for which the coefficients should be computed (numeric vector), -defaults to NULL which is the same as \code{which=1:length(object$baselearner)}. +defaults to NULL which is the same as \code{which=seq_along(object$baselearner)}. In the special case of \code{which=0}, only the coefficients of the offset are returned.} \item{computeCoef}{defaults to \code{TRUE}, if \code{FALSE} only the names of the terms are returned} diff --git a/man/factorize.Rd b/man/factorize.Rd index 5175295..b49c9da 100644 --- a/man/factorize.Rd +++ b/man/factorize.Rd @@ -140,7 +140,7 @@ x_plot <- list(x, x, fx[[3]]) cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) -for(w in 1:length(wch)) { +for(w in seq_along(wch)) { plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) @@ -205,7 +205,7 @@ ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, wh opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) -for(w in 1:length(wch)) { +for(w in seq_along(wch)) { plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) @@ -300,7 +300,7 @@ x_plot <- list(x, x, fx[[3]]) cols <- c("cornflowerblue", "darkseagreen", "darkred") opar <- par(mfrow = c(3,2)) wch <- c(1,2,10) -for(w in 1:length(wch)) { +for(w in seq_along(wch)) { plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, main = names(fac$resp$baselearner[wch[w]])) lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) @@ -313,7 +313,7 @@ par(opar) # re-compose prediction preds <- lapply(fac, predict) PREDSf <- array(0, dim = c(nrow(preds$resp),nrow(preds$cov))) -for(i in 1:ncol(preds$resp)) +for(i in seq_len(ncol(preds$resp))) PREDSf <- PREDSf + preds$resp[,i] \%*\% t(preds$cov[,i]) opar <- par(mfrow = c(1,2)) diff --git a/man/hmatrix.Rd b/man/hmatrix.Rd index 9d273fa..a6e4bb1 100644 --- a/man/hmatrix.Rd +++ b/man/hmatrix.Rd @@ -8,7 +8,7 @@ hmatrix( time, id, x, - argvals = 1:ncol(x), + argvals = seq_len(ncol(x)), timeLab = "t", idLab = "wideIndex", xLab = "x", @@ -24,7 +24,7 @@ i.e. at which \code{t} the response curve is observed} \item{x}{matrix of functional covariate, each trajectory is in one row} \item{argvals}{set of argument values, i.e., the common gird at which the functional covariate -is observed, by default \code{1:ncol(x)}} +is observed, by default \code{seq_len(ncol(x))}} \item{timeLab}{name of the time axis, by default \code{t}} From e2d3d1b7d690978d0ff1971b0a01a0c0d61c58e4 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 23:04:30 +0100 Subject: [PATCH 33/56] refactor: replace `1:nrow(x)` with safer `seq_len(nrow(x))` --- R/FDboost.R | 2 +- R/baselearners.R | 14 +++++++------- R/bootstrapCIs.R | 2 +- R/constrainedX.R | 16 ++++++++-------- R/crossvalidation.R | 8 ++++---- R/hmatrix.R | 4 ++-- R/methods.R | 6 +++--- man/applyFolds.Rd | 2 +- man/hmatrix.Rd | 2 +- man/validateFDboost.Rd | 2 +- tests/general_tests.R | 2 +- 11 files changed, 30 insertions(+), 30 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index 2df835b..5aa0ad9 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -1188,7 +1188,7 @@ FDboost <- function(formula, ### response ~ xvars ## generate an id-variable for a regular response if(is.null(id)){ if(scalarResponse){ - id <- 1:NROW(response) + id <- seq_len(NROW(response)) }else{ id <- rep(1:ydim[1], times = ydim[2]) } diff --git a/R/baselearners.R b/R/baselearners.R index a9410d4..6187c3b 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -125,7 +125,7 @@ integrationWeights <- function(X1, xind, id = NULL){ # taking into account missing values if(anyNA(X1)){ - Lneu <- sapply(1:nrow(X1), function(i){ + Lneu <- sapply(seq_len(nrow(X1)), function(i){ x <- X1[i,] if(!anyNA(x)){ @@ -840,7 +840,7 @@ X_conc <- function(mf, vary, args) { ## is that line still necessary? ## important for prediction, otherwise id=NULL and yind is multiplied accordingly - if(is.null(id)) id <- 1:nrow(X1) + if(is.null(id)) id <- seq_len(nrow(X1)) ## check yind if(args$format=="long" && length(yind)!=length(id)) stop(xname, ": Index of response and id do not have the same length") @@ -1156,7 +1156,7 @@ X_hist <- function(mf, vary, args) { ## is that line still necessary? should it be there in long and wide format? ###### EXTRA LINE in comparison to X_hist ## important for prediction, otherwise id=NULL and yind is multiplied accordingly - if(is.null(id)) id <- 1:nrow(X1) + if(is.null(id)) id <- seq_len(nrow(X1)) ## check yind if(args$format=="long" && length(yind)!=length(id)) stop(xname, ": Index of response and id do not have the same length") @@ -2519,9 +2519,9 @@ bolsc <- function(..., by = NULL, index = NULL, intercept = TRUE, df = NULL, if(is.null(index)){ if(is.null(weights)){ ## use weights - w <- 1:nrow(mf) + w <- seq_len(nrow(mf)) }else{ - w <- rep(1:nrow(mf), weights) + w <- rep(seq_len(nrow(mf)), weights) } temp <- X_olsc(mf[w, , drop = FALSE], vary, @@ -2531,9 +2531,9 @@ bolsc <- function(..., by = NULL, index = NULL, intercept = TRUE, df = NULL, }else{ if(is.null(weights)){ ## use weights - w <- 1:nrow(mf[index, , drop = FALSE]) + w <- seq_len(nrow(mf[index, , drop = FALSE])) }else{ - w <- rep(1:nrow(mf[index, , drop = FALSE]), weights) + w <- rep(seq_len(nrow(mf[index, , drop = FALSE])), weights) } temp <- X_olsc(mf = (mf[index, , drop = FALSE])[w, , drop = FALSE], vary = vary, diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index 20c0741..96a372a 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -404,7 +404,7 @@ bootstrapCI <- function(object, which = NULL, lapply(listOfQuantiles[isSurface], function(x){ - retL <- lapply(1:nrow(x), function(i) + retL <- lapply(seq_len(nrow(x)), function(i) matrix(x[i,], nrow = length(attr(x, "y")))) names(retL) <- levels return(retL) diff --git a/R/constrainedX.R b/R/constrainedX.R index 27bf9fc..d050010 100644 --- a/R/constrainedX.R +++ b/R/constrainedX.R @@ -104,8 +104,8 @@ mboost_intern(bl2, fun = "model.frame.blg") ) index1 <- bl1$get_index() index2 <- bl2$get_index() - if (is.null(index1)) index1 <- 1:nrow(mf) - if (is.null(index2)) index2 <- 1:nrow(mf) + if (is.null(index1)) index1 <- seq_len(nrow(mf)) + if (is.null(index2)) index2 <- seq_len(nrow(mf)) mfindex <- cbind(index1, index2) index <- NULL @@ -312,8 +312,8 @@ bl_lin_matrix_a <- function(blg, Xfun, args) { # K2 <- args$K2 # ## per default do not expand the marginal design matrices - # expand_index1 <- 1:nrow(X$X1) - # expand_index2 <- 1:nrow(X$X2) + # expand_index1 <- seq_len(nrow(X$X1)) + # expand_index2 <- seq_len(nrow(X$X2)) ## weights-matrix W: weights are for single observations in the matrix Y ## but the marginal bl work either on columns or rows of Y @@ -375,8 +375,8 @@ bl_lin_matrix_a <- function(blg, Xfun, args) { ### but: this does not work correctly: problem with factor remains # ## W cannot be computed from w1 and w2, # ## -> blow up the marginal design matrices and use W with them, - # expand_index1 <- rep(1:nrow(X$X1), times = nrow(X$X2)) - # expand_index2 <- rep(1:nrow(X$X2), each = nrow(X$X1)) + # expand_index1 <- rep(seq_len(nrow(X$X1)), times = nrow(X$X2)) + # expand_index2 <- rep(seq_len(nrow(X$X2)), each = nrow(X$X1)) # ## all( c(W) == weights) is TRUE, ordering of weights must match to blown-up marginal design matrices # ## standardize weights to compensate for the blow-up of the marginal design-matrices # #w1 <- c(W) / mean(rowSums(W)) ## for some special cases (e.g. BS on rows): mean(rowSums(W)) == nrow(X$X2) @@ -986,8 +986,8 @@ NULL index1 <- bl1$get_index() index2 <- bl2$get_index() - if (is.null(index1)) index1 <- 1:nrow(mf) - if (is.null(index2)) index2 <- 1:nrow(mf) + if (is.null(index1)) index1 <- seq_len(nrow(mf)) + if (is.null(index2)) index2 <- seq_len(nrow(mf)) mfindex <- cbind(index1, index2) index <- NULL diff --git a/R/crossvalidation.R b/R/crossvalidation.R index e956817..140d0b0 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -135,7 +135,7 @@ #' cvr <- applyFolds(mod, folds = folds_bs, grid = 1:75) #' #' ## weights per observation point -#' folds_bs_long <- folds_bs[rep(1:nrow(folds_bs), times = mod$ydim[2]), ] +#' folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] #' attr(folds_bs_long, "type") <- "3-fold bootstrap" #' ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations #' cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) @@ -541,7 +541,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ oobrisk <- t(as.data.frame(oobrisk)) ## oobrisk <- oobrisk / colSums(OOBweights[object$id, ]) # is done in dummyfct() colnames(oobrisk) <- grid - rownames(oobrisk) <- 1:nrow(oobrisk) + rownames(oobrisk) <- seq_len(nrow(oobrisk)) attr(oobrisk, "risk") <- fam_name attr(oobrisk, "call") <- call attr(oobrisk, "mstop") <- grid @@ -656,7 +656,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ #' cvr2 <- validateFDboost(mod, folds = folds_bs, grid = 1:75) #' #' ## weights per observation point -#' folds_bs_long <- folds_bs[rep(1:nrow(folds_bs), times = mod$ydim[2]), ] +#' folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] #' attr(folds_bs_long, "type") <- "3-fold bootstrap" #' ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations #' cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) @@ -1739,7 +1739,7 @@ cvMa <- function(ydim, weights = rep(1, l = ydim[1] * ydim[2]), if ( (nrowY * ncolY) != n) stop("The arguments weights and ydim do not match.") ## cvMa is only a wrapper for cvLong - foldsMa <- cvLong(id = rep(1:nrowY, times = ncolY), weights = weights, + foldsMa <- cvLong(id = rep(seq_len(nrowY), times = ncolY), weights = weights, type = type, B=B, prob = 0.5, strata = NULL) return(foldsMa) } diff --git a/R/hmatrix.R b/R/hmatrix.R index 0b537cf..fef32bd 100644 --- a/R/hmatrix.R +++ b/R/hmatrix.R @@ -57,7 +57,7 @@ #' # ids and times in the time id matrix #' # for bhistx baselearner, there may be an additional id variable for the tensor product #' newdat <- reweightData(data = list(hmat = myhmatrix, -#' repIDx = rep(1:nrow(attr(myhmatrix,'x')), length(attr(myhmatrix,"argvals")))), +#' repIDx = rep(seq_len(nrow(attr(myhmatrix,'x'))), length(attr(myhmatrix,"argvals")))), #' vars = "hmat", index = c(1,1,2), idvars="repIDx") #' length(newdat$repIDx) #' @@ -75,7 +75,7 @@ hmatrix <- function(time, id, x, argvals=seq_len(ncol(x)), ## check that id is integer valued containing 1, 2, 3, ..., n ## and that x has n rows - stopifnot( all(sort(unique(id)) == 1:nrow(x)) ) + stopifnot( all(sort(unique(id)) == seq_len(nrow(x))) ) stopifnot(length(time)==length(id)) # convert x to a matrix, especially if x is of class AsIs diff --git a/R/methods.R b/R/methods.R index d045bd0..e388163 100644 --- a/R/methods.R +++ b/R/methods.R @@ -1189,7 +1189,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, #print(attr(d, "varnms")) vari <- names(d)[1] if(is.factor(d[[vari]])){ - d[[vari]] <- d[[vari]][ rep(1:NROW(d[[vari]]), times=length(d[[attr(object$yind ,"nameyind")]]) ) ] + d[[vari]] <- d[[vari]][ rep(seq_len(NROW(d[[vari]])), times=length(d[[attr(object$yind ,"nameyind")]]) ) ] if(trm$dim>1) d[[attr(object$yind ,"nameyind")]] <- rep(d[[attr(object$yind ,"nameyind")]], each=length(unique(d[[vari]])) ) }else{ @@ -1197,11 +1197,11 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, if( grepl("bhist(", trm$get_call(), fixed = TRUE) | grepl("bsignal", trm$get_call()) | grepl("bfpc", trm$get_call()) ){ vari <- names(d)[!names(d) %in% attr(d, "varnms")] - d[[vari]] <- d[[vari]][ rep(1:NROW(d[[vari]]), times=NROW(d[[vari]])), ] + d[[vari]] <- d[[vari]][ rep(seq_len(NROW(d[[vari]])), times=NROW(d[[vari]])), ] }else{ # expand scalar variable vari <- names(d)[1] - if(vari!=attr(object$yind ,"nameyind")) d[[vari]] <- d[[vari]][ rep(1:NROW(d[[vari]]), times=NROW(d[[vari]])) ] + if(vari!=attr(object$yind ,"nameyind")) d[[vari]] <- d[[vari]][ rep(seq_len(NROW(d[[vari]])), times=NROW(d[[vari]])) ] } # expand yind if(trm$dim>1) d[[attr(object$yind ,"nameyind")]] <- rep(d[[attr(object$yind ,"nameyind")]], diff --git a/man/applyFolds.Rd b/man/applyFolds.Rd index 79a4b3d..b11e719 100644 --- a/man/applyFolds.Rd +++ b/man/applyFolds.Rd @@ -202,7 +202,7 @@ mod <- mod[75] cvr <- applyFolds(mod, folds = folds_bs, grid = 1:75) ## weights per observation point - folds_bs_long <- folds_bs[rep(1:nrow(folds_bs), times = mod$ydim[2]), ] + folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] attr(folds_bs_long, "type") <- "3-fold bootstrap" ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) diff --git a/man/hmatrix.Rd b/man/hmatrix.Rd index a6e4bb1..1400a15 100644 --- a/man/hmatrix.Rd +++ b/man/hmatrix.Rd @@ -76,7 +76,7 @@ reweightData(data = list(hmat = myhmatrix), vars = "hmat", index = c(1, 1, 2)) # ids and times in the time id matrix # for bhistx baselearner, there may be an additional id variable for the tensor product newdat <- reweightData(data = list(hmat = myhmatrix, - repIDx = rep(1:nrow(attr(myhmatrix,'x')), length(attr(myhmatrix,"argvals")))), + repIDx = rep(seq_len(nrow(attr(myhmatrix,'x'))), length(attr(myhmatrix,"argvals")))), vars = "hmat", index = c(1,1,2), idvars="repIDx") length(newdat$repIDx) diff --git a/man/validateFDboost.Rd b/man/validateFDboost.Rd index b022edf..2eaa37f 100644 --- a/man/validateFDboost.Rd +++ b/man/validateFDboost.Rd @@ -131,7 +131,7 @@ mod <- mod[75] cvr2 <- validateFDboost(mod, folds = folds_bs, grid = 1:75) ## weights per observation point - folds_bs_long <- folds_bs[rep(1:nrow(folds_bs), times = mod$ydim[2]), ] + folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] attr(folds_bs_long, "type") <- "3-fold bootstrap" ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) diff --git a/tests/general_tests.R b/tests/general_tests.R index 1080a1d..ff3e70a 100644 --- a/tests/general_tests.R +++ b/tests/general_tests.R @@ -24,7 +24,7 @@ if(require(refund)){ dat$Y_long <- c(dat$Y) dat$tvals_long <- rep(dat$tvals, each = nrow(dat$Y)) - dat$id_long <- rep(1:nrow(dat$Y), ncol(dat$Y)) + dat$id_long <- rep(seq_len(nrow(dat$Y)), ncol(dat$Y)) # second functional covariate dat$s2 <- seq(0, 1, l = 15) From 02ee30ee5172052dfe5ae021859f29431f8b4273 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 20 Mar 2025 23:46:18 +0100 Subject: [PATCH 34/56] refactor: enforce && and || in conditional expressions --- R/FDboost.R | 10 +++---- R/baselearners.R | 6 ++--- R/baselearnersX.R | 2 +- R/bootstrapCIs.R | 18 ++++++------- R/constrainedX.R | 40 +++++++++++++-------------- R/crossvalidation.R | 10 +++---- R/methods.R | 64 ++++++++++++++++++++++---------------------- R/utilityFunctions.R | 38 +++++++++++++------------- 8 files changed, 94 insertions(+), 94 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index 2df835b..edc9c7a 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -538,7 +538,7 @@ FDboost <- function(formula, ### response ~ xvars scalarResponse <- TRUE if(is.null(timeformula)) scalarNoFLAM <- TRUE - if(grepl("df", formula[3]) | !grepl("lambda", formula[3]) ){ + if(grepl("df", formula[3]) || !grepl("lambda", formula[3]) ){ timeformula <- ~bols(ONEtime, intercept = FALSE, df = 1) }else{ timeformula <- ~bols(ONEtime, intercept = FALSE) @@ -555,7 +555,7 @@ FDboost <- function(formula, ### response ~ xvars } - if(scalarResponse & !identical(numInt,"equal")) + if(scalarResponse && !identical(numInt,"equal")) stop("Integration weights numInt must be set to 'equal' for scalar response.") ## extract time(s) from timeformula @@ -713,7 +713,7 @@ FDboost <- function(formula, ### response ~ xvars if(length(where.c) > 0){ # set c_df to the df/lambda in timeformula if( grepl("lambda", tfm) || - ( grepl("bols", tfm) & !grepl("df", tfm)) ){ + ( grepl("bols", tfm) && !grepl("df", tfm)) ){ c_lambda <- eval(parse(text = paste(tfm, "$dpp(rep(1.0,", length(time), "))$df()", sep = "")))["lambda"] cfm <- paste("bols(ONEtime, intercept = FALSE, lambda = ", c_lambda ,")") } else{ @@ -973,7 +973,7 @@ FDboost <- function(formula, ### response ~ xvars ### -> use one scalar/user-specified offset like in mboost ### in case of factor or multiple time variables set offset to 0 and give a warning - if(is.list(time) | !is.numeric(time)) { + if(is.list(time) || !is.numeric(time)) { .offsetwarning <- is.null(offset) if(!.offsetwarning) { .offsetwarning <- (offset == "scalar") @@ -1081,7 +1081,7 @@ FDboost <- function(formula, ### response ~ xvars offset <- as.vector(matrix(offsetVec, ncol = ncol(response), nrow = nrow(response), byrow = TRUE)) }else{ ### scalar response or mean-centered response -> one constant offset value is used - if(dim(response)[2] == 1 | all(colMeans(response, na.rm = TRUE) < .Machine$double.eps *10^10)){ + if(dim(response)[2] == 1 || all(colMeans(response, na.rm = TRUE) < .Machine$double.eps *10^10)){ offsetVec <- offset predictOffset <- offset }else{ diff --git a/R/baselearners.R b/R/baselearners.R index a9410d4..b987a2d 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -236,7 +236,7 @@ hyper_signal <- function(mf, vary, inS="smooth", knots = 10, boundary.knots = NU ret <- knotf(s, knots, boundary.knots) - if (cyclic & constraint != "none") + if (cyclic && constraint != "none") stop("constraints not implemented for cyclic B-splines") stopifnot(is.numeric(deriv) & length(deriv) == 1) @@ -1116,7 +1116,7 @@ hyper_hist <- function(mf, vary, knots = 10, boundary.knots = NULL, degree = 3, boundary.knots[[n]] else boundary.knots) - if (cyclic & constraint != "none") + if (cyclic && constraint != "none") stop("constraints not implemented for cyclic B-splines") stopifnot(is.numeric(deriv) & length(deriv) == 1) @@ -1474,7 +1474,7 @@ bhist <- function(x, s, time, index = NULL, #by = NULL, # compare range of index signal and index response # minimal value of the signal-index has to be smaller than the response-index if(!is.function(limits)){ - if(limits=="s<=t" & min(s) > min(time) ) stop("Index of response has values before index of signal.") + if(limits=="s<=t" && min(s) > min(time) ) stop("Index of response has values before index of signal.") } # Reshape mfL so that it is the dataframe of the signal with diff --git a/R/baselearnersX.R b/R/baselearnersX.R index f039832..fc49418 100644 --- a/R/baselearnersX.R +++ b/R/baselearnersX.R @@ -40,7 +40,7 @@ hyper_histx <- function(mf, vary, knots = 10, boundary.knots = NULL, degree = 3, ret[[n]] <- knotf(getTime(mf[[n]]), knots=if(is.list(knots)) knots[[n]] else knots, boundary.knots = if(is.list(boundary.knots)) boundary.knots[[n]] else boundary.knots) - if (cyclic & constraint != "none") + if (cyclic && constraint != "none") stop("constraints not implemented for cyclic B-splines") stopifnot(is.numeric(deriv) & length(deriv) == 1) diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index 20c0741..df46b3f 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -227,7 +227,7 @@ bootstrapCI <- function(object, which = NULL, } # 'catch' error caused by using the cvrisk function for inner and outer resampling - if(identical(resampling_fun_outer, cvrisk) & + if(identical(resampling_fun_outer, cvrisk) && identical(resampling_fun_inner, cvrisk)) stop("Please specify a different outer resampling function.") @@ -312,18 +312,18 @@ bootstrapCI <- function(object, which = NULL, } aty <- NA - if(isSurface[i] | isFacEffect[i]) aty <- coefs[[1]]$smterms[[i]]$y + if(isSurface[i] || isFacEffect[i]) aty <- coefs[[1]]$smterms[[i]]$y if(isFacSpecEffect[i]) aty <- coefs[[1]]$smterms[[i]][[1]]$y # format functional factors - if(is.list(listOfCoefs[[i]]) & is.factor(atx)){ + if(is.list(listOfCoefs[[i]]) && is.factor(atx)){ # combine each factor level listOfCoefs[[i]] <- lapply(seq_along(levels(droplevels(atx))), function(faclevnr) t(sapply(listOfCoefs[[i]], function(x) x[faclevnr,]))) isSurface[i] <- FALSE - }else if(is.list(listOfCoefs[[i]]) & !isFacSpecEffect[i]){ # effect surfaces + }else if(is.list(listOfCoefs[[i]]) && !isFacSpecEffect[i]){ # effect surfaces listOfCoefs[[i]] <- do.call("rbind", lapply(listOfCoefs[[i]],c)) @@ -378,7 +378,7 @@ bootstrapCI <- function(object, which = NULL, for(i in seq_along(listOfCoefs)){ # for matrix object - if(is.matrix(listOfCoefs[[i]]) & !is.list(listOfCoefs[[i]])){ + if(is.matrix(listOfCoefs[[i]]) && !is.list(listOfCoefs[[i]])){ listOfQuantiles[[i]] <- apply(listOfCoefs[[i]], 2, quantile, probs = levels) attr(listOfQuantiles[[i]], "x") <- attr(listOfCoefs[[i]], "x") @@ -520,7 +520,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, if(length(which)>1) par(ask=ask) # find common range for all effects - if(commonRange & is.null(ylim)){ + if(commonRange && is.null(ylim)){ ylim <- range(x$raw_results) if(any(is.infinite(ylim))) ylim <- NULL } @@ -548,7 +548,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, }else{ ## temp$dim == 1 like in scalar response with bsignal() ## put each fold into one list entry - if(length(x$yind) <= 1 & x$family != "Binomial Distribution (similar to glm)"){ + if(length(x$yind) <= 1 && x$family != "Binomial Distribution (similar to glm)"){ # scalar response and not Binomial temp$value <- split(temp_CI, rep(1:x$B_outer, each = length(temp_CI)/x$B_outer)) }else{ @@ -559,7 +559,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, }else{ - if(is.null(temp$numberLevels) & is.factor(temp$x)){ + if(is.null(temp$numberLevels) && is.factor(temp$x)){ ## for time-varying factor effects temp$value <- temp_CI @@ -573,7 +573,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, } } - if(!is.null(temp$dim) && temp$dim == 2 & !is.factor(temp$x)){ + if(!is.null(temp$dim) && temp$dim == 2 && !is.factor(temp$x)){ temp$value <- lapply(temp$value, function(xx) matrix(xx, ncol = sqrt(length(xx)), nrow = sqrt(length(xx)), byrow = FALSE) ) } diff --git a/R/constrainedX.R b/R/constrainedX.R index 27bf9fc..501351e 100644 --- a/R/constrainedX.R +++ b/R/constrainedX.R @@ -89,7 +89,7 @@ if(any(used_bl == "bolsc")) stop("Use bols instead of bolsc with %Xc%.") if(any(used_bl == "brandomc")) stop("Use brandom instead of brandomc with %Xc%.") if(any(used_bl == "bbsc")) stop("Use bbs instead of bbsc with %Xc%.") - if( (!is.null(match.call()$bl1$intercept) && match.call()$bl1$intercept != TRUE) | + if( (!is.null(match.call()$bl1$intercept) && match.call()$bl1$intercept != TRUE) || (!is.null(match.call()$bl2$intercept) && match.call()$bl2$intercept != TRUE) ){ stop("Set intercept = TRUE in base-learners used with %Xc%.") } @@ -172,9 +172,9 @@ X1 <- X1$X if (!is.null(l1)) K1 <- l1 * K1 MATRIX <- options("mboost_useMatrix")$mboost_useMatrix - if (MATRIX & !is(X1, "Matrix")) + if (MATRIX && !is(X1, "Matrix")) X1 <- Matrix(X1) - if (MATRIX & !is(K1, "Matrix")) + if (MATRIX && !is(K1, "Matrix")) K1 <- Matrix(K1) X2 <- newX2(mf[, bl2$get_names(), drop = FALSE], @@ -182,9 +182,9 @@ K2 <- X2$K X2 <- X2$X if (!is.null(l2)) K2 <- l2 * K2 - if (MATRIX & !is(X2, "Matrix")) + if (MATRIX && !is(X2, "Matrix")) X2 <- Matrix(X2) - if (MATRIX & !is(K2, "Matrix")) + if (MATRIX && !is(K2, "Matrix")) K2 <- Matrix(K2) suppressMessages( X <- kronecker(X1, Matrix(1, ncol = ncol(X2), @@ -344,7 +344,7 @@ bl_lin_matrix_a <- function(blg, Xfun, args) { if( all(abs(multFactor - multFactor[1] ) < .Machine$double.eps*10^10) ) multFactor <- multFactor[1] ## case that W and w1w2 just differ by a factor - if( all((W == w1w2)[w1w2 == 0]) & all((W == w1w2)[W == 0]) & ## check positions of zeros + if( all((W == w1w2)[w1w2 == 0]) && all((W == w1w2)[W == 0]) && ## check positions of zeros length(multFactor) == 1 ){ # check that only 1 multiplicative factor ## it is impossible to know whether multFactor is multiplied to w1 or w2! @@ -783,9 +783,9 @@ NULL X1 <- X1$X if (!is.null(l1)) K1 <- l1 * K1 MATRIX <- options("mboost_useMatrix")$mboost_useMatrix - if (MATRIX & !is(X1, "Matrix")) + if (MATRIX && !is(X1, "Matrix")) X1 <- Matrix(X1) - if (MATRIX & !is(K1, "Matrix")) + if (MATRIX && !is(K1, "Matrix")) K1 <- Matrix(K1) X2 <- newX2(as.data.frame(mf[bl2$get_names()]), @@ -793,9 +793,9 @@ NULL K2 <- X2$K X2 <- X2$X if (!is.null(l2)) K2 <- l2 * K2 - if (MATRIX & !is(X2, "Matrix")) + if (MATRIX && !is(X2, "Matrix")) X2 <- Matrix(X2) - if (MATRIX & !is(K2, "Matrix")) + if (MATRIX && !is(K2, "Matrix")) K2 <- Matrix(K2) suppressMessages( K <- kronecker(K2, diag(ncol(X1))) + @@ -912,7 +912,7 @@ NULL } } - if(args$lambda1 != 0 & args$lambda2 != 0) + if(args$lambda1 != 0 && args$lambda2 != 0) stop("%A0% can only be used when smoothing parameter is zero for one direction.") l1 <- args$lambda1 @@ -931,9 +931,9 @@ NULL X1 <- X1$X if (!is.null(l1)) K1 <- l1 * K1 MATRIX <- options("mboost_useMatrix")$mboost_useMatrix - if (MATRIX & !is(X1, "Matrix")) + if (MATRIX && !is(X1, "Matrix")) X1 <- Matrix(X1) - if (MATRIX & !is(K1, "Matrix")) + if (MATRIX && !is(K1, "Matrix")) K1 <- Matrix(K1) X2 <- newX2(as.data.frame(mf[bl2$get_names()]), @@ -941,9 +941,9 @@ NULL K2 <- X2$K X2 <- X2$X if (!is.null(l2)) K2 <- l2 * K2 - if (MATRIX & !is(X2, "Matrix")) + if (MATRIX && !is(X2, "Matrix")) X2 <- Matrix(X2) - if (MATRIX & !is(K2, "Matrix")) + if (MATRIX && !is(K2, "Matrix")) K2 <- Matrix(K2) suppressMessages( K <- kronecker(K2, diag(ncol(X1))) + @@ -1075,7 +1075,7 @@ NULL } } - if(args$lambda1 != 0 & args$lambda2 != 0) + if(args$lambda1 != 0 && args$lambda2 != 0) stop("%Xa0% can only be used when smoothing parameter is zero for one direction.") l1 <- args$lambda1 @@ -1094,9 +1094,9 @@ NULL X1 <- X1$X if (!is.null(l1)) K1 <- l1 * K1 MATRIX <- options("mboost_useMatrix")$mboost_useMatrix - if (MATRIX & !is(X1, "Matrix")) + if (MATRIX && !is(X1, "Matrix")) X1 <- Matrix(X1) - if (MATRIX & !is(K1, "Matrix")) + if (MATRIX && !is(K1, "Matrix")) K1 <- Matrix(K1) X2 <- newX2(mf[, bl2$get_names(), drop = FALSE], @@ -1104,9 +1104,9 @@ NULL K2 <- X2$K X2 <- X2$X if (!is.null(l2)) K2 <- l2 * K2 - if (MATRIX & !is(X2, "Matrix")) + if (MATRIX && !is(X2, "Matrix")) X2 <- Matrix(X2) - if (MATRIX & !is(K2, "Matrix")) + if (MATRIX && !is(K2, "Matrix")) K2 <- Matrix(K2) suppressMessages( X <- kronecker(X1, Matrix(1, ncol = ncol(X2), diff --git a/R/crossvalidation.R b/R/crossvalidation.R index e956817..22e7155 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -255,7 +255,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ } } - if(!any(class(object) == "FDboostLong") & !any(class(object) == "FDboostScalar")){ + if(!any(class(object) == "FDboostLong") && !any(class(object) == "FDboostScalar")){ dathelp[[object$yname]] <- matrix(object$response, ncol=object$ydim[2]) dathelp$integration_weights <- matrix(integration_weights, ncol=object$ydim[2]) dathelp$object_id <- object$id @@ -783,7 +783,7 @@ validateFDboost <- function(object, response = NULL, nameyind <- attr(object$yind, "nameyind") dathelp[[nameyind]] <- object$yind - if(!any(class(object) == "FDboostLong") & !any(class(object) == "FDboostScalar")){ + if(!any(class(object) == "FDboostLong") && !any(class(object) == "FDboostScalar")){ dathelp[[object$yname]] <- matrix(object$response, ncol = Gy) }else{ dathelp[[object$yname]] <- object$response @@ -1287,7 +1287,7 @@ plot.validateFDboost <- function(x, riskopt=c("mean", "median"), } # Plot the predictions for the optimal mstop - if(4 %in% which | 5 %in% which){ + if(4 %in% which || 5 %in% which){ if(!is.null(x$oobpreds)){ response <- x$response @@ -1376,7 +1376,7 @@ plotPredCoef <- function(x, which = NULL, pers = TRUE, return(NULL) } - if(commonRange & is.null(ylim)){ + if(commonRange && is.null(ylim)){ ylim <- range(x$predCV[which]) } @@ -1407,7 +1407,7 @@ plotPredCoef <- function(x, which = NULL, pers = TRUE, }else{ # plot coefficients - if(commonRange & is.null(ylim)){ + if(commonRange && is.null(ylim)){ if(length(x$yind)>1){ if(!any(sapply(lapply(x$coefCV[which], function(x) x$value), is.null))){ ylim <- range(lapply(x$coefCV[which], function(x) x$value)) diff --git a/R/methods.R b/R/methods.R index d045bd0..41fd2fc 100644 --- a/R/methods.R +++ b/R/methods.R @@ -109,11 +109,11 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR dots <- list(...) # toFDboost is only meaningful for array-data - if(any(class(object) == "FDboostScalar") | any(class(object) == "FDboostLong")) toFDboost <- FALSE + if(any(class(object) == "FDboostScalar") || any(class(object) == "FDboostLong")) toFDboost <- FALSE if(!is.null(dots$aggregate) && dots$aggregate[1] != "sum"){ if(length(which) > 1 ) stop("For aggregate != 'sum', only one effect, or which=NULL are possible.") - if(toFDboost & class(object)[1] == "FDboost"){ + if(toFDboost && class(object)[1] == "FDboost"){ toFDboost <- FALSE warning("Set toFDboost to FALSE, as aggregate != 'sum'. Prediction is in long vector.") } @@ -146,7 +146,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR # try to get more reliable information on n (number of trajectories) # and on lengthYind (length of time) # using the hmatrix-objects in newdata if available - if(is.list(newdata) | is.data.frame(newdata)){ + if(is.list(newdata) || is.data.frame(newdata)){ classes <- lapply(newdata, class) alln <- c() alllengthYind <- c() @@ -185,7 +185,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR n <- 1 lengthYind <- length(newdata[[nameyind]]) - if(is.list(newdata) | is.data.frame(newdata)){ + if(is.list(newdata) || is.data.frame(newdata)){ classes <- lapply(newdata, class) alllengthYind <- c(lengthYind) for(i in seq_along(classes)){ @@ -289,7 +289,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR ## predict all effects together, model-inherent offset is included automatically if(is.null(which)){ - if(is.null(object$offsetFDboost) & !is.null(object$offsetMboost) ){ + if(is.null(object$offsetFDboost) && !is.null(object$offsetMboost) ){ # offset=NULL in FDboost, but not in mboost ## suppress the warning that the offset cannot be used if offset=NULL in FDboost ## as offset is predicted and included in prediction @@ -438,7 +438,7 @@ fitted.FDboost <- function(object, toFDboost = TRUE, ...) { if (length(args) == 0) { ## give back matrix for regular response and toFDboost == TRUE - if(toFDboost & !any(class(object) == "FDboostScalar") & !any(class(object) == "FDboostLong") ){ + if(toFDboost && !any(class(object) == "FDboostScalar") && !any(class(object) == "FDboostLong") ){ ret <- matrix(object$fitted(), nrow = object$ydim[1]) }else{ # give back a long vector ret <- object$fitted() @@ -564,7 +564,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, ret$offset$main <- "offset" # For the special case of which=0, only return the coefficients of the offset - if(!is.null(which) & length(which)==1 && which==0){ + if(!is.null(which) && length(which)==1 && which==0){ if(computeCoef){ return(ret) }else{ @@ -929,7 +929,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, ## add dummy signal to data for bsignal() - if(grepl("bsignal", trm$get_call()) | grepl("bfpc", trm$get_call()) ){ + if(grepl("bsignal", trm$get_call()) || grepl("bfpc", trm$get_call()) ){ position_signal <- which(sapply(trm$model.frame(), function(x) !is.null(attr(x, "signalIndex")) )) @@ -979,7 +979,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, dlist <- NULL ## if %X% was used in combination with factor variables make a list of data-frames - if(is.factor(x) & is.factor(z)){ ## both variables are factors + if(is.factor(x) && is.factor(z)){ ## both variables are factors numberLevels <- nlevels(x) * nlevels(z) xlevels <- sort(unique(x)) zlevels <- sort(unique(z)) @@ -1050,7 +1050,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, if(!is.matrix(predHelp)){ X <- predHelp }else{ - X <- if(any(trm$get_names() %in% c("ONEtime")) | + X <- if(any(trm$get_names() %in% c("ONEtime")) || any(class(object)=="FDboostScalar")){ # effect constant in t predHelp[,1] }else{ @@ -1110,7 +1110,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, z=attr(d, "zm"), zlab=varnms[3], vecStand=vecStand) ## include the second scalar covariate called z1 into the output - if( grepl("bhistx", trm$get_call()) & length(trm$get_names()) > 2){ + if( grepl("bhistx", trm$get_call()) && length(trm$get_names()) > 2){ extra_output <- list(z1=attr(d, "z1m"), z1lab=varnms[4]) P <- c(P, extra_output) } @@ -1171,7 +1171,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, # what to do with bbs(..., by=factor)? - if(trm$dim > 3 & !grepl("bhistx", trm$get_call()) ){ + if(trm$dim > 3 && !grepl("bhistx", trm$get_call()) ){ warning("Can't deal with smooths with more than 3 dimensions, returning NULL for ", shrtlbls[i], ".") return(NULL) @@ -1194,8 +1194,8 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, each=length(unique(d[[vari]])) ) }else{ # expand signal variable - if( grepl("bhist(", trm$get_call(), fixed = TRUE) | - grepl("bsignal", trm$get_call()) | grepl("bfpc", trm$get_call()) ){ + if( grepl("bhist(", trm$get_call(), fixed = TRUE) || + grepl("bsignal", trm$get_call()) || grepl("bfpc", trm$get_call()) ){ vari <- names(d)[!names(d) %in% attr(d, "varnms")] d[[vari]] <- d[[vari]][ rep(1:NROW(d[[vari]]), times=NROW(d[[vari]])), ] @@ -1425,8 +1425,8 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, # In the case that intercept and offset should be plotted and the intercept was never selected # plot the offset - if( (1 %in% whichSpecified | is.null(whichSpecified)) - & ! 1 %in% which & length(x$yind) > 1) which <- c(0, which) + if( (1 %in% whichSpecified || is.null(whichSpecified)) + && ! 1 %in% which && length(x$yind) > 1) which <- c(0, which) if(length(which) == 0){ warning("Nothing selected for plotting.") @@ -1459,14 +1459,14 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, # plot the offset as extra effect # case 1: the offset should be included as extra plot # case 2: the whole model is plotted, but the intercept-base-learner was never selected - if( (! includeOffset | (includeOffset & ! 1 %in% which)) & - is.null(whichSpecified) & ! is.null(selected(x))){ + if( (! includeOffset || (includeOffset && ! 1 %in% which)) && + is.null(whichSpecified) && ! is.null(selected(x))){ terms <- c(offset = list(offsetTerms), terms) bl_data <- c(offset = list( list(x$yind) ), bl_data) names(bl_data[[1]]) <- attr(x$yind, "nameyind") } - if((length(terms) > 1 || is.null(terms[[1]]$dim) || terms[[1]]$dim == 3) & ask) par(ask = TRUE) + if((length(terms) > 1 || is.null(terms[[1]]$dim) || terms[[1]]$dim == 3) && ask) par(ask = TRUE) if(commonRange){ range <- range(lapply(terms, function(x) x$value )) @@ -1506,8 +1506,8 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, ylab="coef", type="l")) } - if(rug & !is.factor(x = trm$x)){ - if(grepl("bconcurrent", trm$main) | grepl("bsignal", trm$main) | grepl("bfpc", trm$main) ){ + if(rug && !is.factor(x = trm$x)){ + if(grepl("bconcurrent", trm$main) || grepl("bsignal", trm$main) || grepl("bfpc", trm$main) ){ rug(attr(bl_data[[i]][[1]], "signalIndex"), ticksize = 0.02) }else rug(bl_data[[i]][[trm$xlab]], ticksize = 0.02) } @@ -1515,7 +1515,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, # plot with factor variable if( (!grepl("bhistx", trm$main)) && trm$dim==2 && - ((is.factor(trm$x) | is.factor(trm$y)) | is.factor(trm$z)) ){ + ((is.factor(trm$x) || is.factor(trm$y)) || is.factor(trm$z)) ){ ## plot for the special case where factor is plotted in several plots if(!is.null(trm$add_main)){ @@ -1591,7 +1591,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, }else{ # persp-plot for 2-dim effects - if(trm$dim == 2 & pers){ + if(trm$dim == 2 && pers){ if(length(unique(as.vector(trm$value)))==1){ # persp() gives error if only a flat plane should be drawn plot(y=trm$value[1,], x=trm$x, main=trm$main, type="l", xlab=trm$ylab, @@ -1610,7 +1610,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } } # image for 2-dim effects - if(trm$dim == 2 & !pers){ + if(trm$dim == 2 && !pers){ plotWithArgs(image, args=argsImage, myargs=list(x=trm$y, y=trm$x, z=t(trm$value), xlab=trm$ylab, ylab=trm$xlab, main=trm$main, col = heat.colors(length(trm$x)^2))) @@ -1634,7 +1634,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } ### 3 dim plots # persp-plot for 3-dim effects - if(trm$dim == 3 & pers){ + if(trm$dim == 3 && pers){ for(j in seq_along(trm$z)){ plotWithArgs(persp, args=argsPersp, myargs=list(x=trm$x, y=trm$y, z=trm$value[[j]], xlab=paste("\n", trm$xlab), @@ -1646,7 +1646,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } } # image for 3-dim effects - if(trm$dim == 3 & !pers){ + if(trm$dim == 3 && !pers){ for(j in seq_along(trm$z)){ plotWithArgs(image, args=argsImage, myargs=list(x=trm$x, y=trm$y, z=trm$value[[j]], xlab=trm$xlab, ylab=trm$ylab, @@ -1678,7 +1678,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } # end for-loop - if(length(terms)>1 & ask) par(ask = FALSE) + if(length(terms)>1 && ask) par(ask = FALSE) ### plot smooth effects as they are estimated for the original data }else{ @@ -1689,7 +1689,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, offset <- attr(terms, "offset") # convert matrix into a list, each list entry for one effect - if(is.null(x$ydim) & !is.null(dim(terms))){ + if(is.null(x$ydim) && !is.null(dim(terms))){ temp <- list() for(i in seq_len(ncol(terms))){ temp[[i]] <- terms[,i] @@ -1718,7 +1718,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, terms[[1]] <- terms[[1]] + x$offset shrtlbls[1] <- paste("offset", "+", shrtlbls[1]) } - if(length(which) > 1 & ask) par(ask = TRUE) + if(length(which) > 1 && ask) par(ask = TRUE) if(commonRange){ range <- range(terms) @@ -1760,7 +1760,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } } - if(length(which) > 1 & ask) par(ask = FALSE) + if(length(which) > 1 && ask) par(ask = FALSE) } } @@ -1809,7 +1809,7 @@ update.FDboost <- function(object, weights = NULL, oobweights = NULL, risk = NUL extras <- match.call(expand.dots = FALSE)$... - if (!is.null(risk) | !is.null(trace) | !is.null(extras$control)) { + if (!is.null(risk) || !is.null(trace) || !is.null(extras$control)) { cc <- as.list(call$control) if(length(cc)==0) cc <- list(as.symbol("boost_control")) @@ -1931,7 +1931,7 @@ extract.blg <- function(object, what = c("design", "penalty", "index"), asmatrix = FALSE, expand = FALSE, ...){ what <- match.arg(what) - if(grepl("%O%", object$get_call()) | grepl("%Oz%", object$get_call())){ + if(grepl("%O%", object$get_call()) || grepl("%Oz%", object$get_call())){ object <- object$dpp( rep(1, NROW(object$model.frame()[[1]])) ) }else{ object <- object$dpp(rep(1, nrow(object$model.frame()))) diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index 60175da..85db269 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -253,7 +253,7 @@ plotPredicted <- function(x, subset=NULL, posLegend="topleft", lwdObs=1, lwdPred } - if(is.character(response) | is.factor(x$response)){ + if(is.character(response) || is.factor(x$response)){ if(length(x$yind) > 1){ message("For functional response that is not continuous only the predicted values are plotted.") @@ -410,13 +410,13 @@ getYYhatTime <- function(object, breaks=object$yind){ #' @export funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ...){ - if(length(object$yind)<2 | any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ y <- object$response yhat <- object$fitted() time <- object$yind id <- object$id if(is.null(id)) id <- seq_along(y) - if(overTime & !global) { + if(overTime && !global) { overTime <- FALSE message("For scalar or irregualr response the functional R-squared cannot be computed over time.") } @@ -457,7 +457,7 @@ funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x) ) }else{ ### for each subject i - if(length(object$yind)<2 | any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ # Mean for each subject mut <- tapply(y, id, mean, na.rm=TRUE )[id] # numerator cannot be 0 @@ -527,13 +527,13 @@ funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, relative=FALSE, root=FALSE, ...){ - if(length(object$yind)<2 | any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ y <- object$response yhat <- object$fitted() time <- object$yind id <- object$id if(is.null(id)) id <- seq_along(y) - if(overTime & !global) { + if(overTime && !global) { overTime <- FALSE message("For scalar or irregualr response the functional MSE cannot be computed over time.") } @@ -557,7 +557,7 @@ funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x)) }else{ ### for each subject i - if(length(object$yind)<2 | any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ ret <- tapply((y - yhat)^2, id, mean, na.rm=TRUE ) attr(ret, "name") <- "MSE over subjects" }else{ @@ -614,13 +614,13 @@ funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, #' @export funMRD <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ...){ - if(length(object$yind)<2 | any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ y <- object$response yhat <- object$fitted() time <- object$yind id <- object$id if(is.null(id)) id <- seq_along(y) - if(overTime & !global) { + if(overTime && !global) { overTime <- FALSE message("For scalar or irregualr response the functional MRD cannot be computed over time.") } @@ -648,7 +648,7 @@ funMRD <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ... attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x)) }else{ ### for each subject i - if(length(object$yind)<2 | any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ ret <- tapply( abs((y1 - yhat) / y1), id, mean, na.rm=TRUE ) attr(ret, "name") <- "MRD over subjects" }else{ @@ -717,7 +717,7 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, ## logCondDs <- log10(e_DstDs$values[1]) - log10(tail(e_DstDs$values, 1)) evDs <- svd(Ds, nu = 0, nv = 0)$d^2 ## the same as eigenvalues of DstDs logCondDs <- log10(max(evDs)) - log10(min(evDs)) - if(giveWarnings & logCondDs > 6 & is.null(limits)){ + if(giveWarnings && logCondDs > 6 && is.null(limits)){ warning("Condition number for <", xname, "> greater than 10^6 (logCondDs = ", round(logCondDs, 2),"). ", "Effect identifiable only through penalty.") } @@ -731,7 +731,7 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, ind0Bs <- ((!ind0)*1) %*% Bs # matrix to check for 0 columns ## implementation is suitable for common grid of t, maybe with some missings ## common grid is assumed if Y(t) is observed at least in 80% for each point - if( length(yind) < nrow(X1des) | all(table(yind) / max(id) > 0.8) ){ + if( length(yind) < nrow(X1des) || all(table(yind) / max(id) > 0.8) ){ if(is.null(t_unique)) t_unique <- sort(unique(yind)) logCondDs_hist <- rep(NA, length=length(t_unique)) for(k in seq_along(t_unique)){ @@ -792,7 +792,7 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, } names(logCondDs_hist) <- round(t_unique[-length(t_unique)],2) } - if(giveWarnings & any(logCondDs_hist > 6)){ + if(giveWarnings && any(logCondDs_hist > 6)){ # get the first and the last entry of t, for which the condition number is >10^6 tempL <- names(which.min(which(logCondDs_hist > 6))) tempU <- names(which.max(which(logCondDs_hist > 6))) @@ -842,7 +842,7 @@ check_ident <- function(X1, L, Bs, K, xname, penalty, # look at overlap with whole functional covariate overlapKeComplete <- getOverlap(subset=seq_len(ncol(X1)), X1=X1, L=L, Bs=Bs, K=K) - if(giveWarnings & overlapKe >= 1){ + if(giveWarnings && overlapKe >= 1){ warning("Kernel overlap for <", xname, "> and the specified basis and penalty detected. ", "Changing basis for x-direction to to make model identifiable through penalty. ", "Coefficient surface estimate will be inherently unreliable. ", @@ -865,11 +865,11 @@ trace_lv <- function(A, B, tol=1e-10){ # Rolf Larsson, Mattias Villani (2001) # "A distance measure between cointegration spaces" - if(NCOL(A)==0 | NCOL(B)==0){ + if(NCOL(A)==0 || NCOL(B)==0){ return(0) } - if(NROW(A) != NROW(B) | NCOL(A) > NROW(A) | NCOL(B) > NROW(B)){ + if(NROW(A) != NROW(B) || NCOL(A) > NROW(A) || NCOL(B) > NROW(B)){ return(NA) } @@ -1018,9 +1018,9 @@ reweightData <- function(data, argvals, vars, idvars = NULL, compress = FALSE) { - if(missing(argvals) & missing(vars)) + if(missing(argvals) && missing(vars)) stop("Either argvals or vars must be supplied.") - if(missing(weights) & missing(index)) + if(missing(weights) && missing(index)) stop("Either weights or index must be supplied.") # get names of data @@ -1029,7 +1029,7 @@ reweightData <- function(data, argvals, vars, # if(missing(idvars)) idvars <- NULL # drop not used entries if both argvals and vars are given - if(!missing(argvals) & !missing(vars)){ + if(!missing(argvals) && !missing(vars)){ data[nd[!nd %in% c(argvals, vars, longvars, idvars)]] <- NULL nd <- names(data) # reset names From fab24001297483494b12d13a039988b1194f6534 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Fri, 21 Mar 2025 10:04:02 +0100 Subject: [PATCH 35/56] refactor: use more expressive `paste0()` and `toString()` functions --- R/FDboost.R | 12 ++++++------ R/baselearners.R | 16 ++++++++-------- R/baselearnersX.R | 2 +- R/crossvalidation.R | 18 +++++++++--------- R/methods.R | 12 ++++++------ R/utilityFunctions.R | 2 +- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index 91a112d..f6e378a 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -461,7 +461,7 @@ FDboost <- function(formula, ### response ~ xvars equalBrackets <- NULL if(length(trmstrings) > 0){ ## insert id at end of each base-learner - trmstrings2 <- paste(substr(trmstrings, 1 , nchar(trmstrings)-1), ", index=", id[2],")", sep = "") + trmstrings2 <- paste0(substr(trmstrings, 1 , nchar(trmstrings)-1), ", index=", id[2],")") ## check if number of opening brackets is equal to number of closing brackets equalBrackets <- sapply(seq_along(trmstrings2), function(i) { @@ -493,7 +493,7 @@ FDboost <- function(formula, ### response ~ xvars ## delete all trailing whitespace trim.trailing <- function (x) sub("\\s+$", "", x) temp1 <- trim.trailing(temp1) - temp1 <- paste(substr(temp1, 1 , nchar(temp1)-1), ", index=", id[2],")", sep = "") + temp1 <- paste0(substr(temp1, 1 , nchar(temp1)-1), ", index=", id[2],")") trmstrings2[i] <- paste0(paste0(temp1, collapse = " %X"), " %X", temp[length(temp)]) } ## do not add index to base-learners bhistx() @@ -714,10 +714,10 @@ FDboost <- function(formula, ### response ~ xvars # set c_df to the df/lambda in timeformula if( grepl("lambda", tfm) || ( grepl("bols", tfm) && !grepl("df", tfm)) ){ - c_lambda <- eval(parse(text = paste(tfm, "$dpp(rep(1.0,", length(time), "))$df()", sep = "")))["lambda"] + c_lambda <- eval(parse(text = paste0(tfm, "$dpp(rep(1.0,", length(time), "))$df()")))["lambda"] cfm <- paste("bols(ONEtime, intercept = FALSE, lambda = ", c_lambda ,")") } else{ - c_df <- eval(parse(text=paste(tfm, "$dpp(rep(1.0,", length(time), "))$df()", sep = "")))["df"] + c_df <- eval(parse(text=paste0(tfm, "$dpp(rep(1.0,", length(time), "))$df()")))["df"] cfm <- paste("bols(ONEtime, intercept = FALSE, df = ", c_df ,")") } } @@ -737,8 +737,8 @@ FDboost <- function(formula, ### response ~ xvars } else{ which_equalBrackets <- which(equalBrackets) } - xfmTemp <- paste(substr(xfm[which_equalBrackets], 1 , - nchar(xfm[which_equalBrackets]) - 1 ), ")", sep = "") # , index=id is done in the beginning + xfmTemp <- paste0(substr(xfm[which_equalBrackets], 1 , + nchar(xfm[which_equalBrackets]) - 1 ), ")") # , index=id is done in the beginning xfm[which_equalBrackets] <- xfmTemp rm(xfmTemp) tmp <- outer(xfm, tfm, function(x, y) paste(x, y, sep = "%X%")) diff --git a/R/baselearners.R b/R/baselearners.R index c528f31..f3bc64d 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -273,7 +273,7 @@ X_bsignal <- function(mf, vary, args) { "linear" = matrix(c(rep(1, length(xind)), xind), ncol=2), "constant"= matrix(c(rep(1, length(xind))), ncol=1)) - colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) # use cyclic splines @@ -288,7 +288,7 @@ X_bsignal <- function(mf, vary, args) { fun = "cbs") } - colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) ### Penalty matrix: product differences matrix if (args$differences > 0){ @@ -701,7 +701,7 @@ bsignal <- function(x, s, index = NULL, inS = c("smooth", "linear", "constant"), if(is.null(Z) && all( abs(rowMeans(x, na.rm = TRUE)-mean(rowMeans(x, na.rm = TRUE))) < .Machine$double.eps *10^10)){ - message(paste("All trajectories in ", xname, " have the same mean. Coefficient function is centered.", sep="")) + message(paste0("All trajectories in ", xname, " have the same mean. Coefficient function is centered.")) } # mf <- mfL @@ -870,7 +870,7 @@ X_conc <- function(mf, vary, args) { fun = "cbs") } - colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) # set up design matrix for concurrent model if(args$format=="wide"){ @@ -1176,7 +1176,7 @@ X_hist <- function(mf, vary, args) { "linear" = matrix(c(rep(1, length(xind)), xind), ncol = 2), "constant"= matrix(c(rep(1, length(xind))), ncol = 1)) - colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) # integration weights L <- args$intFun(X1=X1, xind=xind) @@ -1700,7 +1700,7 @@ X_fpc <- function(mf, vary, args) { } - colnames(X) <- paste(xname, ".PC", seq_len(ncol(X)), sep = "") + colnames(X) <- paste0(xname, ".PC", seq_len(ncol(X))) ## set up the penalty matrix K <- switch(args$penalty, @@ -2337,8 +2337,8 @@ X_olsc <- function(mf, vary, args) { contr <- NULL } else { ### set up model matrix - fm <- paste("~ ", paste(colnames(mf)[colnames(mf) != vary], - collapse = "+"), sep = "") + fm <- paste0("~ ", paste(colnames(mf)[colnames(mf) != vary], + collapse = "+")) fac <- sapply(mf[colnames(mf) != vary], is.factor) DUMMY <- FALSE if (any(fac)){ diff --git a/R/baselearnersX.R b/R/baselearnersX.R index fc49418..b6e45e7 100644 --- a/R/baselearnersX.R +++ b/R/baselearnersX.R @@ -92,7 +92,7 @@ X_histx <- function(mf, vary, args) { "linear" = matrix(c(rep(1, length(xind)), xind), ncol = 2), "constant"= matrix(c(rep(1, length(xind))), ncol = 1)) - colnames(Bs) <- paste(xname, seq_len(ncol(Bs)), sep="") + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) # integration weights L <- args$intFun(X1=X1, xind=xind) diff --git a/R/crossvalidation.R b/R/crossvalidation.R index f58709d..17f1ea9 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -305,7 +305,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ if(any(!grepl("\\(", singleBls))) stop(paste0("applyFolds can not deal with the following base-learner(s) without brackets: ", - paste(singleBls[!grepl("\\(", singleBls)], collapse = ", "))) + toString(singleBls[!grepl("\\(", singleBls)]))) ## check if data includes all variables @@ -321,7 +321,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ any( grepl(w, object$baselearner[[i]]$get_names() ) )) return(i)) )[1]) - stop(paste0("base-learner(s) ", paste(unlist(list(1,2)), collapse = ", "), + stop(paste0("base-learner(s) ", toString(unlist(list(1,2))), " contain(s) variables, which are not part of the data object.")) } @@ -914,7 +914,7 @@ validateFDboost <- function(object, response = NULL, # stop() or warning()? if(sum(!modFitted) > sum(modFitted)) warning("More than half of the models could not be fitted.") - warning("Model fit did not work in fold ", paste(which(!modFitted), collapse = ", ")) + warning("Model fit did not work in fold ", toString(which(!modFitted))) modRisk <- modRisk[modFitted] OOBweights <- OOBweights[,modFitted] folds <- folds[,modFitted] @@ -1585,7 +1585,7 @@ plot_bootstrapped_coef <- function(temp, l, xlab=paste("\n", temp$xlab), ylab=paste("\n", temp$ylab), zlab=paste("\n", "coef"), zlim=if(any(is.null(ylim))) range(matvec, na.rm=TRUE) else ylim, - main=paste(temp$main, " at ", probs[k]*100, "%-quantile", sep=""), + main=paste0(temp$main, " at ", probs[k]*100, "%-quantile"), col=getColPersp(tempZ))) } @@ -1620,7 +1620,7 @@ plot_bootstrapped_coef <- function(temp, l, myargs=list(x=temp$y, y=temp$x, z=t(tempZ), xlab=paste("\n", temp$xlab), ylab=paste("\n", temp$ylab), zlim=c(min(matvec, na.rm=TRUE), max(matvec, na.rm=TRUE)), - main=paste(temp$main, " at ", probs[k]*100, "%-quantile", sep=""), + main=paste0(temp$main, " at ", probs[k]*100, "%-quantile"), col = heat.colors(length(temp$x)^2) ) ) @@ -1643,7 +1643,7 @@ plot_bootstrapped_coef <- function(temp, l, myRow <- t(temp$value[[which(quantx[j]==temp$x)]]) plot_curves(x_i = temp$y, y_i = myRow, xlab_i = temp$ylab, - main_i = paste(temp$main, " at ", temp$xlab,"=" ,quantx[j], sep = ""), + main_i = paste0(temp$main, " at ", temp$xlab,"=" ,quantx[j]), ylim_i = ylim) }else{ @@ -1651,8 +1651,8 @@ plot_bootstrapped_coef <- function(temp, l, myRow <- sapply(temp$value, function(x) x[quantx[j]==temp$x & quantz[j]==temp$z, ]) # first column plot_curves(x_i = temp$y, y_i = myRow, xlab_i = temp$ylab, - main_i = paste(temp$main, " at ", temp$xlab, "=" , quantx[j], ", " , - temp$zlab, "=", quantz[j], sep = ""), + main_i = paste0(temp$main, " at ", temp$xlab, "=" , quantx[j], ", " , + temp$zlab, "=", quantz[j]), ylim_i = ylim) } } @@ -1713,7 +1713,7 @@ cvLong <- function(id, weights = rep(1, l=length(id)), B = B, prob = prob, strata = strata) foldsLong <- folds[id, , drop = FALSE] * weights } - attr(foldsLong, "type") <- paste(B, "-fold ", type, sep = "") + attr(foldsLong, "type") <- paste0(B, "-fold ", type) return(foldsLong) } diff --git a/R/methods.R b/R/methods.R index 5d133c1..cea7b80 100644 --- a/R/methods.R +++ b/R/methods.R @@ -1258,12 +1258,12 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, temp[1] <- unlist(strsplit(temp[1], "(", fixed=TRUE))[1] if(substr(temp[2], 1, 1)==" ") temp[2] <- substr(temp[2], 2, nchar(temp[2])) if(length(commaSep) == 1){ - xpart[i] <- paste(temp[1], "(", temp[2], sep="") + xpart[i] <- paste0(temp[1], "(", temp[2]) }else{ - xpart[i] <- paste(temp[1], "(", temp[2], ")", sep="") + xpart[i] <- paste0(temp[1], "(", temp[2], ")") } }else{ - if(length(commaSep) > 1){ xpart[i] <- paste(commaSep[1], ")", sep="")} + if(length(commaSep) > 1){ xpart[i] <- paste0(commaSep[1], ")")} } #xpart[i] <- if(length(commaSep)==1){ # paste(paste(commaSep[1:nvar], collapse=","), sep="") @@ -1641,7 +1641,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, ylab=paste("\n", trm$ylab), zlab=paste("\n", "coef"), theta=30, phi=30, ticktype="detailed", zlim=range(trm$value), col=getColPersp(trm$value[[j]]), - main= paste(trm$zlab ,"=", round(trm$z[j],2), ": ", trm$main, sep="")) + main= paste0(trm$zlab ,"=", round(trm$z[j],2), ": ", trm$main)) ) } } @@ -1651,7 +1651,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, plotWithArgs(image, args=argsImage, myargs=list(x=trm$x, y=trm$y, z=trm$value[[j]], xlab=trm$xlab, ylab=trm$ylab, col = heat.colors(length(trm$x)^2), zlim=range(trm$value), - main= paste(trm$zlab ,"=", round(trm$z[j],2), ": ", trm$main, sep=""))) + main= paste0(trm$zlab ,"=", round(trm$z[j],2), ": ", trm$main))) plotWithArgs(contour, args=argsContour, myargs=list(trm$x, trm$y, trm$value[[j]], xlab=trm$xlab, add = TRUE)) if(rug){ @@ -1889,7 +1889,7 @@ update.FDboost <- function(object, weights = NULL, oobweights = NULL, risk = NUL if(any( !grepl("\\(",singleBls) )) stop(paste0("update can not deal with the following base-learner(s) without brackets: ", - paste(singleBls[!grepl("\\(",singleBls)], collapse=", "), ".\n", + toString(singleBls[!grepl("\\(",singleBls)]), ".\n", "Please build such base-learners within the FDboost call or ", "update corresponding baselearner(s) manually and supply a new formula to the update function.")) diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index 85db269..e3820e4 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -1045,7 +1045,7 @@ reweightData <- function(data, argvals, vars, # check names if(length(whichNot) != 0) stop(paste0("Could not find ", - paste(c(argvals, vars, idvars, longvars)[whichNot], collapse = ", "), + toString(c(argvals, vars, idvars, longvars)[whichNot]), " in data.")) # check for hmatrix and delete in argvals or vars if present From c2d13a9f72319d00f6e71971d740e99cc668c15d Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Fri, 21 Mar 2025 10:10:35 +0100 Subject: [PATCH 36/56] refactor: use more `seq_len()` --- R/baselearners.R | 2 +- R/bootstrapCIs.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/baselearners.R b/R/baselearners.R index c528f31..b173f55 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -1666,7 +1666,7 @@ X_fpc <- function(mf, vary, args) { args$klX$xind <- xind ## only use part of the eigen-functions! - args$subset <- 1:min(ncol(klX$scores), args$npc.max) + args$subset <- seq_len(min(ncol(klX$scores), args$npc.max)) ## args$a <- max(xind) - min(xind) ## scores \xi_{ik}: rows i=1,..., N and columns k=1,...,K diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index c13e047..6000526 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -544,7 +544,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, if(!is.list(temp_CI)){ if(temp$dim >= 2){ - temp$value <- split(temp_CI, seq(nrow(temp_CI))) + temp$value <- split(temp_CI, seq_len(nrow(temp_CI))) }else{ ## temp$dim == 1 like in scalar response with bsignal() ## put each fold into one list entry From dc71ca8d5fd88b6043e64a8d925001288e31257c Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Fri, 21 Mar 2025 10:20:19 +0100 Subject: [PATCH 37/56] docs: remove trailing whitespace in package docs --- R/FDboost-package.R | 128 ++++++++++++++++++++--------------------- man/FDboost-package.Rd | 74 ++++++++++++------------ 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/R/FDboost-package.R b/R/FDboost-package.R index 5a3ea2b..624c794 100644 --- a/R/FDboost-package.R +++ b/R/FDboost-package.R @@ -1,87 +1,87 @@ ################################################################################# #' FDboost: Boosting Functional Regression Models -#' -#' @description -#' Regression models for functional data, i.e., scalar-on-function, -#' function-on-scalar and function-on-function regression models, are fitted +#' +#' @description +#' Regression models for functional data, i.e., scalar-on-function, +#' function-on-scalar and function-on-function regression models, are fitted #' by a component-wise gradient boosting algorithm. -#' -#' @details -#' This package is intended to fit regression models with functional variables. -#' It is possible to fit models with functional response and/or functional covariates, -#' resulting in scalar-on-function, function-on-scalar and function-on-function regression. +#' +#' @details +#' This package is intended to fit regression models with functional variables. +#' It is possible to fit models with functional response and/or functional covariates, +#' resulting in scalar-on-function, function-on-scalar and function-on-function regression. #' Furthermore, the package can be used to fit density-on-scalar regression models. #' Details on the functional regression models that can be fitted with \pkg{FDboost} -#' can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). -#' A hands-on tutorial for the package can be found +#' can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). +#' A hands-on tutorial for the package can be found #' in Brockhaus, Ruegamer and Greven (2020), see . #' For density-on-scalar regression models see Maier et al. (2021). -#' -#' Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on -#' the R package \pkg{mboost} (Hothorn et al., 2017). -#' A comprehensive tutorial to \pkg{mboost} is given in Hofner et al. (2014). -#' -#' The main fitting function is \code{\link{FDboost}}. -#' The model complexity is controlled by the number of boosting iterations (mstop). -#' Like the fitting procedures in \pkg{mboost}, the function \code{FDboost} DOES NOT -#' select an appropriate stopping iteration. This must be chosen by the user. -#' The user can determine an adequate stopping iteration by resampling methods like -#' cross-validation or bootstrap. -#' This can be done using the function \code{\link{applyFolds}}. -#' -#' Aside from common effect surface plots, tensor product factorization via the -#' function \code{\link{factorize}} presents an alternative tool for visualization -#' of estimated effects for non-linear function-on-scalar models -#' (Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). -#' After factorization, effects are decomposed multiple scalar effects into -#' functional main effect directions, which can be separately plotted allowing to -#' visualize more complex effect structures. -#' -#' -#' @references +#' +#' Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on +#' the R package \pkg{mboost} (Hothorn et al., 2017). +#' A comprehensive tutorial to \pkg{mboost} is given in Hofner et al. (2014). +#' +#' The main fitting function is \code{\link{FDboost}}. +#' The model complexity is controlled by the number of boosting iterations (mstop). +#' Like the fitting procedures in \pkg{mboost}, the function \code{FDboost} DOES NOT +#' select an appropriate stopping iteration. This must be chosen by the user. +#' The user can determine an adequate stopping iteration by resampling methods like +#' cross-validation or bootstrap. +#' This can be done using the function \code{\link{applyFolds}}. +#' +#' Aside from common effect surface plots, tensor product factorization via the +#' function \code{\link{factorize}} presents an alternative tool for visualization +#' of estimated effects for non-linear function-on-scalar models +#' (Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). +#' After factorization, effects are decomposed multiple scalar effects into +#' functional main effect directions, which can be separately plotted allowing to +#' visualize more complex effect structures. +#' +#' +#' @references #' Brockhaus, S., Ruegamer, D. and Greven, S. (2020): -#' Boosting Functional Regression Models with FDboost. +#' Boosting Functional Regression Models with FDboost. #' Journal of Statistical Software, 94(10), 1–50. #' -#' -#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): -#' The functional linear array model. Statistical Modelling, 15(3), 279-300. -#' -#' Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): -#' Boosting flexible functional regression models with a high number of functional historical effects, -#' Statistics and Computing, 27(4), 913-926. -#' -#' Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): -#' Signal regression models for location, scale and shape with an application to stock returns. +#' +#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +#' The functional linear array model. Statistical Modelling, 15(3), 279-300. +#' +#' Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +#' Boosting flexible functional regression models with a high number of functional historical effects, +#' Statistics and Computing, 27(4), 913-926. +#' +#' Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): +#' Signal regression models for location, scale and shape with an application to stock returns. #' Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 665-686. -#' -#' Hothorn T., Buehlmann P., Kneib T., Schmid M., and Hofner B. (2017). mboost: Model-Based Boosting, +#' +#' Hothorn T., Buehlmann P., Kneib T., Schmid M., and Hofner B. (2017). mboost: Model-Based Boosting, #' R package version 2.8-1, \url{https://cran.r-project.org/package=mboost} -#' -#' Hofner, B., Mayr, A., Robinzonov, N., Schmid, M. (2014). Model-based Boosting in R: -#' A Hands-on Tutorial Using the R Package mboost. Computational Statistics, 29, 3-35. +#' +#' Hofner, B., Mayr, A., Robinzonov, N., Schmid, M. (2014). Model-based Boosting in R: +#' A Hands-on Tutorial Using the R Package mboost. Computational Statistics, 29, 3-35. #' \url{https://cran.r-project.org/package=mboost/vignettes/mboost_tutorial.pdf} -#' +#' #' Maier, E.-M., Stoecker, A., Fitzenberger, B., Greven, S. (2021): #' Additive Density-on-Scalar Regression in Bayes Hilbert Spaces with an Application to Gender Economics. #' arXiv preprint arXiv:2110.11771. -#' -#' Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). -#' Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. +#' +#' Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). +#' Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. #' Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. -#' +#' #' Stoecker A., Steyer L., Greven S. (2022): #' Functional Additive Models on Manifolds of Planar Shapes and Forms. #' arXiv preprint arXiv:2109.02624. -#' -#' @author +#' +#' @author #' Sarah Brockhaus, David Ruegamer and Almond Stoecker -#' +#' #' @aliases FDboost_package package-FDboost FDboost-package -#' -#' @seealso -#' \code{\link{FDboost}} for the main fitting function and -#' \code{\link{applyFolds}} for model tuning via resampling methods. -#' +#' +#' @seealso +#' \code{\link{FDboost}} for the main fitting function and +#' \code{\link{applyFolds}} for model tuning via resampling methods. +#' "_PACKAGE" -#> [1] "_PACKAGE" \ No newline at end of file + diff --git a/man/FDboost-package.Rd b/man/FDboost-package.Rd index 9b9c520..cb90f8c 100644 --- a/man/FDboost-package.Rd +++ b/man/FDboost-package.Rd @@ -7,71 +7,71 @@ \alias{package-FDboost} \title{FDboost: Boosting Functional Regression Models} \description{ -Regression models for functional data, i.e., scalar-on-function, -function-on-scalar and function-on-function regression models, are fitted +Regression models for functional data, i.e., scalar-on-function, +function-on-scalar and function-on-function regression models, are fitted by a component-wise gradient boosting algorithm. } \details{ -This package is intended to fit regression models with functional variables. -It is possible to fit models with functional response and/or functional covariates, -resulting in scalar-on-function, function-on-scalar and function-on-function regression. +This package is intended to fit regression models with functional variables. +It is possible to fit models with functional response and/or functional covariates, +resulting in scalar-on-function, function-on-scalar and function-on-function regression. Furthermore, the package can be used to fit density-on-scalar regression models. Details on the functional regression models that can be fitted with \pkg{FDboost} -can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). -A hands-on tutorial for the package can be found +can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). +A hands-on tutorial for the package can be found in Brockhaus, Ruegamer and Greven (2020), see . For density-on-scalar regression models see Maier et al. (2021). -Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on -the R package \pkg{mboost} (Hothorn et al., 2017). -A comprehensive tutorial to \pkg{mboost} is given in Hofner et al. (2014). +Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on +the R package \pkg{mboost} (Hothorn et al., 2017). +A comprehensive tutorial to \pkg{mboost} is given in Hofner et al. (2014). -The main fitting function is \code{\link{FDboost}}. -The model complexity is controlled by the number of boosting iterations (mstop). -Like the fitting procedures in \pkg{mboost}, the function \code{FDboost} DOES NOT -select an appropriate stopping iteration. This must be chosen by the user. -The user can determine an adequate stopping iteration by resampling methods like -cross-validation or bootstrap. -This can be done using the function \code{\link{applyFolds}}. +The main fitting function is \code{\link{FDboost}}. +The model complexity is controlled by the number of boosting iterations (mstop). +Like the fitting procedures in \pkg{mboost}, the function \code{FDboost} DOES NOT +select an appropriate stopping iteration. This must be chosen by the user. +The user can determine an adequate stopping iteration by resampling methods like +cross-validation or bootstrap. +This can be done using the function \code{\link{applyFolds}}. -Aside from common effect surface plots, tensor product factorization via the -function \code{\link{factorize}} presents an alternative tool for visualization -of estimated effects for non-linear function-on-scalar models -(Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). -After factorization, effects are decomposed multiple scalar effects into -functional main effect directions, which can be separately plotted allowing to +Aside from common effect surface plots, tensor product factorization via the +function \code{\link{factorize}} presents an alternative tool for visualization +of estimated effects for non-linear function-on-scalar models +(Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). +After factorization, effects are decomposed multiple scalar effects into +functional main effect directions, which can be separately plotted allowing to visualize more complex effect structures. } \references{ Brockhaus, S., Ruegamer, D. and Greven, S. (2020): -Boosting Functional Regression Models with FDboost. +Boosting Functional Regression Models with FDboost. Journal of Statistical Software, 94(10), 1–50. -Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): -The functional linear array model. Statistical Modelling, 15(3), 279-300. +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +The functional linear array model. Statistical Modelling, 15(3), 279-300. -Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): -Boosting flexible functional regression models with a high number of functional historical effects, -Statistics and Computing, 27(4), 913-926. +Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +Boosting flexible functional regression models with a high number of functional historical effects, +Statistics and Computing, 27(4), 913-926. -Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): -Signal regression models for location, scale and shape with an application to stock returns. +Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): +Signal regression models for location, scale and shape with an application to stock returns. Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 665-686. -Hothorn T., Buehlmann P., Kneib T., Schmid M., and Hofner B. (2017). mboost: Model-Based Boosting, +Hothorn T., Buehlmann P., Kneib T., Schmid M., and Hofner B. (2017). mboost: Model-Based Boosting, R package version 2.8-1, \url{https://cran.r-project.org/package=mboost} -Hofner, B., Mayr, A., Robinzonov, N., Schmid, M. (2014). Model-based Boosting in R: -A Hands-on Tutorial Using the R Package mboost. Computational Statistics, 29, 3-35. +Hofner, B., Mayr, A., Robinzonov, N., Schmid, M. (2014). Model-based Boosting in R: +A Hands-on Tutorial Using the R Package mboost. Computational Statistics, 29, 3-35. \url{https://cran.r-project.org/package=mboost/vignettes/mboost_tutorial.pdf} Maier, E.-M., Stoecker, A., Fitzenberger, B., Greven, S. (2021): Additive Density-on-Scalar Regression in Bayes Hilbert Spaces with an Application to Gender Economics. arXiv preprint arXiv:2110.11771. -Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). -Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. +Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). +Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. Stoecker A., Steyer L., Greven S. (2022): @@ -79,7 +79,7 @@ Functional Additive Models on Manifolds of Planar Shapes and Forms. arXiv preprint arXiv:2109.02624. } \seealso{ -\code{\link{FDboost}} for the main fitting function and +\code{\link{FDboost}} for the main fitting function and \code{\link{applyFolds}} for model tuning via resampling methods. } \author{ From e5ff0f826f5d9e2276e91798d059f9a21591ecc2 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sun, 23 Mar 2025 14:12:33 +0100 Subject: [PATCH 38/56] refactor: use `lengths()` instead of `sapply(x, length)` --- R/FDboost.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index f6e378a..e487474 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -465,8 +465,8 @@ FDboost <- function(formula, ### response ~ xvars ## check if number of opening brackets is equal to number of closing brackets equalBrackets <- sapply(seq_along(trmstrings2), function(i) { - sapply(regmatches(trmstrings2[i], gregexpr("\\(", trmstrings2[i])), length) == - sapply(regmatches(trmstrings2[i], gregexpr("\\)", trmstrings2[i])), length) + lengths(regmatches(trmstrings2[i], gregexpr("\\(", trmstrings2[i]))) == + lengths(regmatches(trmstrings2[i], gregexpr("\\)", trmstrings2[i]))) }) } @@ -621,7 +621,7 @@ FDboost <- function(formula, ### response ~ xvars nr <- nrow(response) if(!is.list(time)) stopifnot(ncol(response) == length(time)) else - stopifnot(all(ncol(response) == sapply(time[sapply(time, is.vector)], length))) + stopifnot(all(ncol(response) == lengths(time[sapply(time, is.vector)]))) nc <- ncol(response) dresponse <- as.vector(response) # column-wise stacking of response ## convert characters to factor @@ -633,7 +633,7 @@ FDboost <- function(formula, ### response ~ xvars stopifnot(is.null(dim(response))) ## stopifnot(is.vector(response)) # check length of response and its time and index if(is.list(time)) - stopifnot(all(length(response) == sapply(time, length)) & length(response) == length(id)) else + stopifnot(all(length(response) == lengths(time)) & length(response) == length(id)) else stopifnot(length(response) == length(time) & length(response) == length(id)) if(anyNA(response)) warning("For non-grid observations the response should not contain missing values.") @@ -944,7 +944,7 @@ FDboost <- function(formula, ### response ~ xvars ### multiply integration weights numInt to weights and w if(is.numeric(numInt)){ .numInt_len_check <- if(is.list(time)) - all(length(numInt) == sapply(time, length)) else + all(length(numInt) == lengths(time)) else length(numInt) == length(time) if(!.numInt_len_check) stop("Length of integration weights and time vector are not equal.") From 912d96edddae567e4ed3439b53ef4a53424e1c47 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sun, 23 Mar 2025 14:45:59 +0100 Subject: [PATCH 39/56] refactor: remove unnecessary concatenation --- R/FDboost.R | 2 +- R/crossvalidation.R | 4 ++-- R/methods.R | 2 +- R/utilityFunctions.R | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index f6e378a..4edf66f 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -456,7 +456,7 @@ FDboost <- function(formula, ### response ~ xvars ### save formula of FDboost before it is changed formulaFDboost <- formula - tf <- terms.formula(formula, specials = c("c")) + tf <- terms.formula(formula, specials = "c") trmstrings <- attr(tf, "term.labels") equalBrackets <- NULL if(length(trmstrings) > 0){ diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 17f1ea9..a05e8cd 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -1248,7 +1248,7 @@ plot.validateFDboost <- function(x, riskopt=c("mean", "median"), c(min(c(0, ylim[1] * ifelse(ylim[1] < 0, 2, 0.5))), riskMean[paste(mOptMean)]), lty = 2) legend("topright", legend=paste(c(mOptMean)), - lty=c(2), col=c("black")) + lty=2, col="black") } @@ -1261,7 +1261,7 @@ plot.validateFDboost <- function(x, riskopt=c("mean", "median"), riskMedian[paste(mOptMedian)]), lty = 2) legend("topright", legend=paste(c(mOptMedian)), - lty=c(2), col=c("black")) + lty=2, col="black") } } diff --git a/R/methods.R b/R/methods.R index cea7b80..58d1fe7 100644 --- a/R/methods.R +++ b/R/methods.R @@ -1050,7 +1050,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, if(!is.matrix(predHelp)){ X <- predHelp }else{ - X <- if(any(trm$get_names() %in% c("ONEtime")) || + X <- if(any(trm$get_names() %in% "ONEtime") || any(class(object)=="FDboostScalar")){ # effect constant in t predHelp[,1] }else{ diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index e3820e4..5e49758 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -12,7 +12,7 @@ #' @export o_control <- function(k_min=20, rule=2, silent=TRUE, cyclic=FALSE, knots=NULL) { RET <- list(k_min=k_min, rule=rule, silent=silent, cyclic=cyclic, knots=knots) - class(RET) <- c("offset_control") + class(RET) <- "offset_control" RET } From e82649ceef6afd1659616c9dd9f3e7a1a8858e30 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sun, 23 Mar 2025 15:10:17 +0100 Subject: [PATCH 40/56] docs: update readme docs: more readme changes docs: more changes docs: more badges --- README.md | 60 ++++++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 8de94c9..fa7a8aa 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ -FDboost -====== +# FDboost -[![Build Status (Linux)](https://travis-ci.org/boost-R/FDboost.svg?branch=master)](https://travis-ci.org/boost-R/FDboost) - -[![CRAN Status Badge](https://www.r-pkg.org/badges/version/FDboost)](https://cran.r-project.org/package=FDboost) - -[![](https://cranlogs.r-pkg.org/badges/FDboost)](https://cran.rstudio.com/web/packages/FDboost/index.html) + + +[![CRAN status](https://www.r-pkg.org/badges/version/FDboost)](https://CRAN.R-project.org/package=FDboost) +[![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/FDboost)](https://www.r-pkg.org/pkg/FDboost) + + `FDboost` Boosting Functional Regression Models. -The package FDboost fits regression models for functional data, i.e., +The package FDboost fits regression models for functional data, i.e., scalar-on-function, function-on-scalar, and function-on-function regression models, -by a component-wise gradient boosting algorithm. +by a component-wise gradient boosting algorithm. Furthermore, it can be used to fit density-on-scalar regression models. ## Using FDboost @@ -19,9 +19,10 @@ Furthermore, it can be used to fit density-on-scalar regression models. For installation instructions see below. Instructions on how to use `FDboost` can be found in various places: + - Read the tutorial paper [doi:10.18637/jss.v094.i10](doi:10.18637/jss.v094.i10) - Have a look at the manual, which also contains example code -- Check the vignettes: +- Check the vignettes: - [function-on-function regression](https://cran.r-project.org/web/packages/FDboost/vignettes/FLAM_canada.pdf) - [scalar-on-function regression](https://cran.r-project.org/web/packages/FDboost/vignettes/FLAM_fuel.pdf) - [function-on-scalar regression](https://cran.r-project.org/web/packages/FDboost/vignettes/FLAM_viscosity.pdf) @@ -31,30 +32,17 @@ Instructions on how to use `FDboost` can be found in various places: For issues, bugs, feature requests etc. please use the [GitHub Issues](https://github.com/boost-R/FDboost/issues). -## Installation Instructions - -- Current version (from CRAN): - ```r - install.packages("FDboost") - ``` - -- Latest **patch version** (patched version of CRAN package; under development) from GitHub: - ```r - library("devtools") - install_github("boost-R/FDboost") - library("FDboost") - ``` - - - - To be able to use the `install_github()` command, one needs to install `devtools` first: - ```r - install.packages("devtools") - ``` +## Installation + +Install the last release from [CRAN](https://cran.r-project.org): + +```r +install.packages("FDboost") +``` + +Install the development version from [GitHub](https://github.com/): +```r +# install.packages("pak") +pak::pak("boost-R/FDboost") +``` From f0e05ab1d3992d59b22b97e9a4e0ccbb2e90319a Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Mon, 24 Mar 2025 19:12:10 +0100 Subject: [PATCH 41/56] refactor: use `inherits()` for checking S3 class --- R/FDboost.R | 6 +++--- R/FDboostLSS.R | 2 +- R/bootstrapCIs.R | 6 +++--- R/constrainedX.R | 2 +- R/crossvalidation.R | 44 ++++++++++++++++++++++---------------------- R/methods.R | 12 ++++++------ R/stabsel.R | 2 +- R/utilityFunctions.R | 28 ++++++++++++++-------------- 8 files changed, 51 insertions(+), 51 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index f6e378a..2ebdc80 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -474,12 +474,12 @@ FDboost <- function(formula, ### response ~ xvars if(inherits(try(id), "try-error")) stop("id must either be NULL or a formula object.") if(missing(timeformula) || inherits(try(timeformula), "try-error")) stop("timeformula must either be NULL or a formula object.") - stopifnot(class(formula) == "formula") - if(!is.null(timeformula)) stopifnot(class(timeformula) == "formula") + stopifnot(inherits(formula, "formula")) + if(!is.null(timeformula)) stopifnot(inherits(timeformula, "formula")) ## insert the id variable into the formula, to treat it like the other variables if(!is.null(id)){ - stopifnot(class(id) == "formula") + stopifnot(inherits(id, "formula")) ##tf <- terms.formula(formula, specials = c("c")) ##trmstrings <- attr(tf, "term.labels") ##equalBrackets <- NULL diff --git a/R/FDboostLSS.R b/R/FDboostLSS.R index debc3dd..e66dc54 100644 --- a/R/FDboostLSS.R +++ b/R/FDboostLSS.R @@ -209,7 +209,7 @@ cvrisk.FDboostLSS <- function(object, folds = cvLong(id = object[[1]]$id, ## set up grid according to defaults of cvrisk.nc_mboostLSS and cvrisk.mboostLSS if(is.null(grid)){ - if(any(class(object) == "nc_mboostLSS")){ + if(inherits(object, "nc_mboostLSS")){ grid <- 1:sum(mstop(object)) }else{ grid <- make.grid(mstop(object)) diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index 6000526..e741215 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -186,7 +186,7 @@ bootstrapCI <- function(object, which = NULL, type_inner <- match.arg(type_inner) ########## check for scalar response ######### - scalarResp <- "FDboostScalar" %in% class(object) + scalarResp <- inherits(object, "FDboostScalar") ########## define outer resampling function if NULL ######### if(is.null(resampling_fun_outer)){ @@ -498,7 +498,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, ylim = NULL, ...) { - stopifnot(class(x) == "bootstrapCI") + stopifnot(inherits(x, "bootstrapCI")) boot_offset <- 0 @@ -598,7 +598,7 @@ plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, print.bootstrapCI <- function(x, ...) { - stopifnot(class(x)=="bootstrapCI") + stopifnot(inherits(x, "bootstrapCI")) cat("\n") diff --git a/R/constrainedX.R b/R/constrainedX.R index 296339d..059f8ab 100644 --- a/R/constrainedX.R +++ b/R/constrainedX.R @@ -211,7 +211,7 @@ ## use whole matrices of marginal effects for constraints as Almond suggested C <- t(X) %*% cbind(rep(1, nrow(X)), X1, X2) qr_C <- qr(C) ## , tol = 1e-10 ## time? - if( any(class(qr_C) == "sparseQR") ){ + if( inherits(qr_C, "sparseQR") ){ rank_C <- qr_C@Dim[2] }else{ rank_C <- qr_C$rank diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 17f1ea9..6dead21 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -172,7 +172,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ stop("The folds-matrix must have one row per observed trajectory.") } - if(any(class(object) == "FDboostLong")){ # irregular response + if(inherits(object, "FDboostLong")){ # irregular response nObs <- length(unique(object$id)) # number of curves Gy <- NULL # number of time-points per curve }else{ # regular response / scalar response @@ -201,7 +201,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ }else{ if(numInt == "Riemann"){ # use the integration scheme specified in applyFolds - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ integration_weights <- as.vector(integrationWeights(X1 = matrix(object$response, ncol = object$ydim[2]), object$yind)) }else{ @@ -216,7 +216,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ ### get yind in long format yindLong <- object$yind - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ yindLong <- rep(object$yind, each = nObs) } ### compute ("length of each trajectory")^-1 in the response @@ -255,7 +255,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ } } - if(!any(class(object) == "FDboostLong") && !any(class(object) == "FDboostScalar")){ + if(!inherits(object, "FDboostLong") && !inherits(object, "FDboostScalar")){ dathelp[[object$yname]] <- matrix(object$response, ncol=object$ydim[2]) dathelp$integration_weights <- matrix(integration_weights, ncol=object$ydim[2]) dathelp$object_id <- object$id @@ -279,13 +279,13 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ names_variables <- names_variables[names_variables != nameyind] names_variables <- names_variables[names_variables != "ONEx"] names_variables <- names_variables[names_variables != "ONEtime"] - if(!any(class(object) == "FDboostLong")) names_variables <- c(object$yname, "integration_weights", names_variables) + if(!inherits(object, "FDboostLong")) names_variables <- c(object$yname, "integration_weights", names_variables) - length_variables <- if("FDboostScalar" %in% class(object)) + length_variables <- if(inherits(object, "FDboostScalar")) lapply(dathelp[names_variables], length) else lapply(dathelp[names_variables], NROW) names_variables_long <- names_variables[ length_variables == length(object$id) ] - nothmatrix <- ! sapply(dathelp[names_variables_long], function(x) any(class(x) == "hmatrix" )) + nothmatrix <- ! sapply(dathelp[names_variables_long], is.hmatrix) names_variables_long <- names_variables_long[ nothmatrix ] if(identical(names_variables_long, character(0))) names_variables_long <- NULL @@ -330,7 +330,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ fitfct <- function(weights, oobweights){ ## get data according to weights - if(any(class(object) == "FDboostLong")){ + if(inherits(object, "FDboostLong")){ dat_weights <- reweightData(data = dathelp, vars = names_variables, longvars = c(object$yname, nameyind, "integration_weights", names_variables_long), weights = weights, idvars = c(attr(object$id, "nameid"), index_names), @@ -403,7 +403,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ } ## get data according to oobweights - if(any(class(object) == "FDboostLong")){ + if(inherits(object, "FDboostLong")){ dathelp$lengthTi1 <- c(lengthTi1) dat_oobweights <- reweightData(data = dathelp, vars = c(names_variables, "lengthTi1"), longvars = c(object$yname, nameyind, @@ -449,7 +449,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ invokeRestart( "muffleWarning" ) } - if(any(class(object) == "FDboostLong")){ + if(inherits(object, "FDboostLong")){ if(numInt == "equal"){ oobwstand <- dat_oobweights$integration_weights * (1/sum(dat_oobweights$integration_weights)) @@ -715,7 +715,7 @@ validateFDboost <- function(object, response = NULL, stop("The folds-matrix must have one row per observed trajectory.") } - if(any(class(object) == "FDboostLong")){ # irregular response + if(inherits(object, "FDboostLong")){ # irregular response nObs <- length(unique(object$id)) # number of curves Gy <- NULL # number of time-points per curve }else{ # regular response / scalar response @@ -739,7 +739,7 @@ validateFDboost <- function(object, response = NULL, # intWeights <- model.weights(object) # weights are rescaled in mboost, see mboost:::rescale_weights if(!is.null(object$callEval$numInt) && object$callEval$numInt == "Riemann"){ - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ intWeights <- as.vector(integrationWeights(X1 = matrix(object$response, ncol = object$ydim[2]), object$yind)) }else{ @@ -761,7 +761,7 @@ validateFDboost <- function(object, response = NULL, ### get yind in long format yindLong <- object$yind - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ yindLong <- rep(object$yind, each = nObs) } ### compute ("length of each trajectory")^-1 in the response @@ -783,7 +783,7 @@ validateFDboost <- function(object, response = NULL, nameyind <- attr(object$yind, "nameyind") dathelp[[nameyind]] <- object$yind - if(!any(class(object) == "FDboostLong") && !any(class(object) == "FDboostScalar")){ + if(!inherits(object, "FDboostLong") && !inherits(object, "FDboostScalar")){ dathelp[[object$yname]] <- matrix(object$response, ncol = Gy) }else{ dathelp[[object$yname]] <- object$response @@ -801,7 +801,7 @@ validateFDboost <- function(object, response = NULL, # call$control <- boost_control(risk="oobag") # call$oobweights <- oobweights[id] if(refitSmoothOffset == FALSE && is.null(call$offset) ){ - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ call$offset <- matrix(object$offset, ncol = Gy)[1, ] }else{ call$offset <- object$offset @@ -908,7 +908,7 @@ validateFDboost <- function(object, response = NULL, # str(modRisk, max.level=5) # check whether model fit worked in all iterations - modFitted <- sapply(modRisk, function(x) class(x) == "list") + modFitted <- sapply(modRisk, is.list) if(any(!modFitted)){ # stop() or warning()? @@ -962,7 +962,7 @@ validateFDboost <- function(object, response = NULL, oobpreds0 <- lapply(modRisk, function(x) x$predGrid) oobpreds <- matrix(nrow = nrow(oobpreds0[[1]]), ncol = ncol(oobpreds0[[1]])) - if(any(class(object) == "FDboostLong")){ + if(inherits(object, "FDboostLong")){ for(i in seq_along(oobpreds0)){ # i runs over observed trajectories, i.e. over id oobpreds[id == i, ] <- oobpreds0[[i]][id == i, ] } @@ -1068,7 +1068,7 @@ validateFDboost <- function(object, response = NULL, # offset is vector of length yind or numeric of length 1 for constant offset ret <- modRisk[[g]]$mod[optimalMstop]$predictOffset(object$yind) # regular data or scalar response - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ if( length(ret) == 1 ) ret <- rep(ret, modRisk[[1]]$mod$ydim[2]) # irregular data }else{ @@ -1077,13 +1077,13 @@ validateFDboost <- function(object, response = NULL, }else{ # other effects ret <- predict(modRisk[[g]]$mod[optimalMstop], which = l-1) # model g if(!(l-1) %in% selected(modRisk[[g]]$mod[optimalMstop]) ){ # effect was never chosen - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ ret <- matrix(0, ncol=modRisk[[1]]$mod$ydim[2], nrow=modRisk[[1]]$mod$ydim[1]) }else{ ret <- matrix(0, nrow = length(object$id), ncol=1) } } - if(!any(class(object) == "FDboostLong")){ + if(!inherits(object, "FDboostLong")){ ret <- ret[g,] # save g-th row = preds for g-th observations }else{ ret <- ret[object$id == g] # save preds of g-th observations @@ -1112,7 +1112,7 @@ validateFDboost <- function(object, response = NULL, oobrisk0 = oobrisk0, oobmse0 = oobmse0, oobmrd0 = oobmrd0, - format = if(any(class(object) == "FDboostLong")) "FDboostLong" else "FDboost", + format = if(inherits(object, "FDboostLong")) "FDboostLong" else "FDboost", fun_ret = if(is.null(fun)) NULL else lapply(modRisk, function(x) x$fun_ret) ) rm(modRisk) @@ -1354,7 +1354,7 @@ plotPredCoef <- function(x, which = NULL, pers = TRUE, probs = c(0.25, 0.5, 0.75), # quantiles of variables to use for plotting ylim = NULL, ...){ - stopifnot(any(class(x) == "validateFDboost")) + stopifnot(inherits(x, "validateFDboost")) if(is.null(which)) which <- seq_along(x$coefCV) diff --git a/R/methods.R b/R/methods.R index cea7b80..45ac542 100644 --- a/R/methods.R +++ b/R/methods.R @@ -104,12 +104,12 @@ print.FDboost <- function(x, ...) { # predict function: wrapper for predict.mboost() predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TRUE, ...){ - stopifnot(any(class(object) == "FDboost")) + stopifnot(inherits(object, "FDboost")) # print("Prediction FDboost") dots <- list(...) # toFDboost is only meaningful for array-data - if(any(class(object) == "FDboostScalar") || any(class(object) == "FDboostLong")) toFDboost <- FALSE + if(inherits(object, c("FDboostScalar", "FDboostLong"))) toFDboost <- FALSE if(!is.null(dots$aggregate) && dots$aggregate[1] != "sum"){ if(length(which) > 1 ) stop("For aggregate != 'sum', only one effect, or which=NULL are possible.") @@ -438,7 +438,7 @@ fitted.FDboost <- function(object, toFDboost = TRUE, ...) { if (length(args) == 0) { ## give back matrix for regular response and toFDboost == TRUE - if(toFDboost && !any(class(object) == "FDboostScalar") && !any(class(object) == "FDboostLong") ){ + if(toFDboost && !inherits(object, "FDboostScalar") && !inherits(object, "FDboostLong") ){ ret <- matrix(object$fitted(), nrow = object$ydim[1]) }else{ # give back a long vector ret <- object$fitted() @@ -478,7 +478,7 @@ fitted.FDboost <- function(object, toFDboost = TRUE, ...) { ### residuals (the current negative gradient) residuals.FDboost <- function(object, ...){ - if(!any(class(object)=="FDboostLong")){ + if(!inherits(object, "FDboostLong")){ resid <- matrix(object$resid()) ydim <- ifelse(is.null(object$ydim[1]), NROW(resid), object$ydim[1]) resid <- matrix(resid, nrow = ydim) @@ -1051,7 +1051,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, X <- predHelp }else{ X <- if(any(trm$get_names() %in% c("ONEtime")) || - any(class(object)=="FDboostScalar")){ # effect constant in t + inherits(object, "FDboostScalar")){ # effect constant in t predHelp[,1] }else{ predHelp[1,] # smooth intercept/ concurrent effect @@ -1622,7 +1622,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, if(grepl("bhist", trm$main)){ rug(x$yind, ticksize = 0.02) }else{ - ifelse(grepl("by", trm$main) | ( !any(class(x)=="FDboostLong") && grepl("%X", trm$main) ) , + ifelse(grepl("by", trm$main) | ( !inherits(x, "FDboostLong") && grepl("%X", trm$main) ) , rug(bl_data[[i]][[3]], ticksize = 0.02), rug(bl_data[[i]][[2]], ticksize = 0.02)) } diff --git a/R/stabsel.R b/R/stabsel.R index 904a242..3842c08 100644 --- a/R/stabsel.R +++ b/R/stabsel.R @@ -148,7 +148,7 @@ stabsel.FDboost <- function(x, refitSmoothOffset = TRUE, } ## for scalar response and/or scalar offset, use the more efficient cvrisk() - if( any(class(x) == "FDboostScalar" ) ) refitSmoothOffset <- FALSE + if( inherits(x, "FDboostScalar" ) ) refitSmoothOffset <- FALSE if( !is.null(x$call$offset) && x$call$offset == "scalar" ) refitSmoothOffset <- FALSE if(refitSmoothOffset){ diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index e3820e4..a64863d 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -224,9 +224,9 @@ funplot <- function(x, y, id=NULL, rug=TRUE, ...){ ### function to plot the observed response and the predicted values of a model plotPredicted <- function(x, subset=NULL, posLegend="topleft", lwdObs=1, lwdPred=1, ...){ - stopifnot("FDboost" %in% class(x)) + stopifnot(inherits(x, "FDboost")) - if(any(class(x) == "FDboostScalar")){ + if(inherits(x, "FDboostScalar")){ if(is.null(subset)) subset <- seq_along(x$response) response <- x$response[subset, drop=FALSE] @@ -235,7 +235,7 @@ plotPredicted <- function(x, subset=NULL, posLegend="topleft", lwdObs=1, lwdPred }else{ - if(!any(class(x) == "FDboostLong")){ + if(!inherits(x, "FDboostLong")){ if(is.null(subset)) subset <- 1:x$ydim[1] response <- matrix(x$response, nrow=x$ydim[1], ncol=x$ydim[2])[subset, , drop=FALSE] pred <- fitted(x)[subset, , drop=FALSE] @@ -292,9 +292,9 @@ plotPredicted <- function(x, subset=NULL, posLegend="topleft", lwdObs=1, lwdPred ### function to plot the residuals plotResiduals <- function(x, subset=NULL, posLegend="topleft", ...){ - stopifnot("FDboost" %in% class(x)) + stopifnot(inherits(x, "FDboost")) - if(any(class(x) == "FDboostScalar")){ + if(inherits(x, "FDboostScalar")){ if(is.null(subset)) subset <- seq_along(x$response) response <- x$response[subset, drop=FALSE] @@ -302,7 +302,7 @@ plotResiduals <- function(x, subset=NULL, posLegend="topleft", ...){ }else{ - if(!any(class(x) == "FDboostLong")){ ## wide format + if(!inherits(x, "FDboostLong")){ ## wide format if(is.null(subset)) subset <- 1:x$ydim[1] resid <- matrix(x$resid(), nrow = x$ydim[1])[subset, , drop=FALSE] yind <- x$yind @@ -410,7 +410,7 @@ getYYhatTime <- function(object, breaks=object$yind){ #' @export funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ...){ - if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ y <- object$response yhat <- object$fitted() time <- object$yind @@ -457,7 +457,7 @@ funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x) ) }else{ ### for each subject i - if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ # Mean for each subject mut <- tapply(y, id, mean, na.rm=TRUE )[id] # numerator cannot be 0 @@ -527,7 +527,7 @@ funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, relative=FALSE, root=FALSE, ...){ - if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ y <- object$response yhat <- object$fitted() time <- object$yind @@ -557,7 +557,7 @@ funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x)) }else{ ### for each subject i - if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ ret <- tapply((y - yhat)^2, id, mean, na.rm=TRUE ) attr(ret, "name") <- "MSE over subjects" }else{ @@ -614,7 +614,7 @@ funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, #' @export funMRD <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ...){ - if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ y <- object$response yhat <- object$fitted() time <- object$yind @@ -648,7 +648,7 @@ funMRD <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ... attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x)) }else{ ### for each subject i - if(length(object$yind)<2 || any(class(object)=="FDboostLong")){ + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ ret <- tapply( abs((y1 - yhat) / y1), id, mean, na.rm=TRUE ) attr(ret, "name") <- "MRD over subjects" }else{ @@ -1049,7 +1049,7 @@ reweightData <- function(data, argvals, vars, " in data.")) # check for hmatrix and delete in argvals or vars if present - whichHmat <- sapply(data[vars], function(x) "hmatrix" %in% class(x)) + whichHmat <- sapply(data[vars], is.hmatrix) # get dimensions of data dimd <- lapply(data, dim) @@ -1137,7 +1137,7 @@ reweightData <- function(data, argvals, vars, ## subset hmatrix newHmats[[j]] <- subset_hmatrix(data[[nhm[j]]], index = index, compress = compress) - if( any(class(data[[nhm[j]]]) == "AsIs") ){ + if( inherits(data[[nhm[j]]], "AsIs") ){ newHmats[[j]] <- I(newHmats[[j]]) } From 916f26939072150606f5cfdcdbbc233335111299 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Mon, 24 Mar 2025 23:22:23 +0100 Subject: [PATCH 42/56] chore: use NEWS.md --- NEWS.md | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 NEWS.md diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..365ca99 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,225 @@ +# FDboost 1.1.0 (2022-07-12) + +## Miscellaneous + +- Anisotropic tensor-product operators `b1 %A0% b2` and `b1 %Xa0% b2` now also work when `lambda` is specified for `b1` and `df` is specified for `b2` (or vice versa). + +## New features + +- New function `clr()` to compute the centered-log-ratio transform and its inverse for density-on-scalar regression in Bayes spaces. +- New dataset `birthDistribution`. +- New vignette illustrating density-on-function regression on the `birthDistribution` data. +- Function `factorize()` added for tensor-product factorization of estimated effects or models. + +# FDboost 0.3.4 (2020-08-31) + +## Bug fixes + +- Fix `predict()` for `bsignal()` with `newdata` and the functional covariate given as a numeric matrix, raised in [#17](https://github.com/boost-R/FDboost/issues/17). +- Deprecated argument `LINPACK` in `solve()` removed. + +# FDboost 0.3.3 (2020-06-13) + +## New features + +- It is now possible to specify several time variables as well as factor time variables in the `timeformula`. This feature is needed for the manifoldboost package. + +## Miscellaneous + +- The function `stabsel.FDboost()` now uses `applyFolds()` instead of `validateFDboost()` to do cross-validation with recomputation of the smooth offset. This is only relevant for models with a functional response. This will change results if the model contains base-learners like `bbsc()` or `bolsc()`, as `applyFolds()` also recomputes the Z-matrix for those base-learners. + +## Bug fixes + +- Adapted functions `integrationWeights()` and `integrationWeightsLeft()` for unsorted time variables. +- Changed code in `predict.FDboost()` such that interaction effects of two functional covariates like `bsignal() %X% bsignal()` can be predicted with new data. +- Adapt FDboost to R 4.0.1 by explicitly using the first entry of `dots$aggregate` (i.e., `dots$aggregate[1] != "sum"`) in `predict.FDboost()` so that it also works with the default, where `aggregate` is a vector of length 3 and later only the first argument is used via `match.arg()`. + +# FDboost 0.3.2 (2018-08-04) + +## Bug fixes + +- Deprecated argument `corrected` in `cvrisk()` removed. + +# FDboost 0.3.1 (2018-05-10) + +## Bug fixes + +- `cvrisk()` has by default adequate folds for a noncyclic fitted FDboostLSS model, see [#14](https://github.com/boost-R/FDboost/issues/14). + +## Miscellaneous + +- Replaced `cBind()` (which is deprecated) with `cbind()`. + +# FDboost 0.3.0 (2017-05-31) + +## User-visible changes + +- New function `bootstrapCI()` to compute bootstrapped coefficients. +- Added the dataset `emotion` containing EEG and EMG measures under different experimental conditions. +- With scalar response, `FDboost()` now works with the response as a vector (instead of a 1-row matrix); thus, `fitted()` and `predict()` return a vector. + +## Bug fixes + +- `update.FDboost()` now works with a scalar response. +- `FDboost()` works with family `Binomial(type = "glm")`, see [#1](https://github.com/boost-R/FDboost/issues/1). +- `applyFolds()` works for factor response, see [#7](https://github.com/boost-R/FDboost/issues/7). +- `cvLong()` and `cvMA()` return a matrix for only one resampling fold with `B = 1` (proposed by Almond Stoecker). + +## Miscellaneous + +- Adapt `FDboost` to `mboost` 2.8-0, which allows for `mstop = 0`. +- Restructure `FDboostLSS()` such that it calls `mboostLSS_fit()` from `gamboostLSS` 2.0-0. +- In `FDboost`, set `options("mboost_indexmin" = +Inf)` to disable internal use of ties in model fitting, as this breaks some methods for models with responses in long format and for models containing `bhistx()`, see [#10](https://github.com/boost-R/FDboost/issues/10). +- Deprecated `validateFDboost()`, use `applyFolds()` and `bootstrapCI()` instead. + +# FDboost 0.2.0 (2016-05-26) + +## User-visible changes + +- Added function `applyFolds()` to compute the optimal stopping iteration. + +## Bug fixes + +- Allows for extrapolation in `predict()` with `bbsc()`. + +# FDboost 0.1.2 (2016-04-22) + +## Bug fixes + +- Fixed a bug in `bolsc()`: correctly use the index in `bolsc()`/`bbsc()`. Previously, each observation was used only once for computing Z. + +## User-visible changes + +- Added function `%Xa0%` that computes a row-tensor product of two base-learners where the penalty in one direction is zero. +- Added function `reweightData()` that computes the data for Bootstrap or cross-validation folds. +- Added function `stabsel.FDboost()` that refits the smooth offset in each fold. +- Added argument `fun` to `validateFDboost()`. +- Added `update.FDboost()` that overwrites `update.mboost()`. + +## Miscellaneous + +- `FDboost()` works with `family = Binomial()`. + +# FDboost 0.1.1 (2016-04-06) + +## Bug fixes + +- Fixed `oobpred` in `validateFDboost()` for irregular response and resampling at the curve level so that `plot.validateFDboost()` works for that case. +- Fixed scope of formula in `FDboost()`: now the formula given to `mboost()` within `FDboost()` uses the variables in the environment of the formula specified in `FDboost()`. + +## Miscellaneous + +- `plot.FDboost()` works for more effects, especially for effects like `bolsc() %X% bhistx()`. + +# FDboost 0.1.0 (2016-03-10) + +## User-visible changes + +- New operator `%A0%` for Kronecker product of two base-learners with an anisotropic penalty for the special case where `lambda1` or `lambda2` is zero. +- The base-learner `bbsc()` can be used with `center = TRUE` (derived by Almond Stoecker). +- In `FDboostLSS()`, a list of one-sided formulas can be specified for `timeformula`. + +## Bug fixes + +- `FDboostLSS()` works with `families = GammaLSS()`. + +## Miscellaneous + +- Operator `%A%` uses weights in the model call. This only works correctly for weights on the level of `blg1` and `blg2` (same as weights on rows and columns of the response matrix). +- Calls to internal functions of `mboost` are done using `mboost_intern()`. +- `hyper_olsc()` is based on `hyper_ols()` from `mboost`. + +# FDboost 0.0.17 (2016-02-25) + +## User-visible changes + +- Changed the operator `%Xc%` for the row tensor product of two scalar covariates. The design matrix of the interaction effects is constrained such that the interaction is centered around the intercept and around the two main effects of the scalar covariates (experimental!). Use, for example, `bols(x1) %Xc% bols(x2)`. + +# FDboost 0.0.16 (2016-02-22) + +## User-visible changes + +- Changed the operator `%Xc%` for row tensor product where the sum-to-zero constraint is applied to the design matrix resulting from the row-tensor product (experimental!). Specifically, an intercept-column is first added, and then the sum-to-zero constraint is applied. Use, for example, `bolsc(x1) %Xc% bolsc(x2)`. +- The functional index `s` is now used as `argsvals` in the FPCA conducted within `bfpc()`. + +# FDboost 0.0.15 (2016-02-12) + +## User-visible changes + +- New operator `%A%` that implies anisotropic penalties for differently specified `df` in the two base-learners. + +## Bug fixes + +- No penalty is applied in the direction of `ONEx` in a smooth intercept specified implicitly by `~1`, for example, `bols(ONEx, intercept=FALSE, df=1) %A% bbs(time)`. + +## Miscellaneous + +- Effects containing `%A%` or `%O%` are not expanded with the `timeformula`, allowing for different effects over time in the model. + +# FDboost 0.0.14 (2016-02-11) + +## User-visible changes + +- Added the function `FDboostLSS()` to fit GAMLSS models with functional data using R-package `gamboostLSS`. +- New operator `%Xc%` for row tensor product where the sum-to-zero constraint is applied to the design matrix resulting from the row-tensor product (experimental!). +- Allowed `newdata` to be a list in `predict.FDboost()` when used with signal base-learners. +- Expanded `coef.FDboost()` so that it works for 3-dimensional tensor products of the form `bhistx() %X% bolsc() %X% bolsc()` (with David Ruegamer). +- Added a new possibility for scalar-on-function regression: if `timeformula=NULL`, no Kronecker product with `1` is used, which changes the penalty (otherwise, the direction of `1` would also be penalized). + +## Miscellaneous + +- New dependency on R-package `gamboostLSS`. +- Removed dependency on R-package `MASS`. +- Used the argument `prediction` in the internal computation of the base-learners (work in progress). +- Throw an error if `timeLab` of the `hmatrix`-object in `bhistx()` is not equal to the time variable in `timeformula`. + +# FDboost 0.0.13 (2015-11-17) + +## User-visible changes + +- In function `FDboost()`, the offset is supplied differently. For a scalar offset, use `offset = "scalar"`. The default remains `offset = NULL`. +- `predict.FDboost()` has a new argument `toFDboost` (logical). +- `fitted.FDboost()` has argument `toFDboost` explicitly (not only via `...`). +- New base-learner `bhistx()`, especially suited for effects used with `%X%`, e.g., `bhistx() %X% bolsc()`. +- `coef.FDboost()` and `plot.FDboost()` now handle effects like `bhistx() %X% bolsc()`. +- For `predict.FDboost()` with effects `bhistx()` and newdata, the latest `mboostPatch` is necessary. + +## Bug fixes + +- The check for the necessity of a smooth offset works for missing values in a regular response (spotted by Tore Erdmann). + +# FDboost 0.0.12 (2015-09-15) + +- Internal experimental version. + +# FDboost 0.0.11 (2015-06-01) + +## User-visible changes + +- `integrationWeights()` now gives equal weights for regular grids. +- New base-learner `bfpc()` for a functional covariate where both the functional covariate and the coefficient are expanded using fPCA (experimental feature!). Only works for regularly observed functional covariate. + +## Bug fixes + +- `coef.FDboost()` only works for `bhist()` if the time variable is the same in the timeformula and in `bhist()`. +- `predict.FDboost()` now checks that only `type = "link"` can be predicted for newdata. + +# FDboost 0.0.10 (2015-04-16) + +## User-visible changes + +- Changed the default difference penalties to first-order difference (`differences = 1`), improving identifiability. +- New method `cvrisk.FDboost()` that uses (by default) sampling on the levels of curves, which is important for functional responses. +- Reorganized documentation of `cvrisk()` and `validateFDboost()`. +- In `bhist()`, an effect can be standardized. + +## Miscellaneous + +- Added a `CITATION` file. +- Uses `mboost 2.4-2`, which exports all important functions. + +## Bug fixes + +- `main` argument is always passed in `plot.FDboost()`. +- `bhist()` and `bconcurrent()` now work for equal `time` and `s`. +- `predict.FDboost()` works with tensor-product base-learners like `bl1 %X% bl2`. From 0328b28a015f46c360becb31b771ed444f2e9f25 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Wed, 26 Mar 2025 23:33:45 +0100 Subject: [PATCH 43/56] refactor: remove redundant comparison use more `isTRUE()` and `isFALSE()` --- R/baselearners.R | 10 +++++----- R/baselearnersX.R | 2 +- R/constrainedX.R | 4 ++-- R/crossvalidation.R | 2 +- R/methods.R | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/R/baselearners.R b/R/baselearners.R index ed100ac..ee88fbd 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -229,7 +229,7 @@ hyper_signal <- function(mf, vary, inS="smooth", knots = 10, boundary.knots = NU # stop("variable names and knot names must be the same") # if (is.list(boundary.knots)) if(!all(names(boundary.knots) %in% nm)) # stop("variable names and boundary.knot names must be the same") - if (!identical(center, FALSE) && cyclic) + if (!isFALSE(center) && cyclic) stop("centering of cyclic covariates not yet implemented") # ret <- vector(mode = "list", length = length(nm)) # names(ret) <- nm @@ -363,7 +363,7 @@ X_bsignal <- function(mf, vary, args) { ##################################################### ####### K <- crossprod(K) has been computed before! - if (!identical(args$center, FALSE)) { + if (!isFALSE(args$center)) { ### L = \Gamma \Omega^1/2 in Section 2.3. of ### Fahrmeir et al. (2004, Stat Sinica); "spectralDecomp" @@ -1102,7 +1102,7 @@ hyper_hist <- function(mf, vary, knots = 10, boundary.knots = NULL, degree = 3, # stop("variable names and knot names must be the same") # if (is.list(boundary.knots)) if(!all(names(boundary.knots) %in% nm)) # stop("variable names and boundary.knot names must be the same") - if (!identical(center, FALSE) && cyclic) + if (!isFALSE(center) && cyclic) stop("centering of cyclic covariates not yet implemented") # ret <- vector(mode = "list", length = length(nm)) # names(ret) <- nm @@ -1990,7 +1990,7 @@ X_bbsc <- function(mf, vary, args) { if (vary != "" && ncol(by) > 1){ # build block diagonal penalty suppressMessages(K <- kronecker(diag(ncol(by)), K)) } - if (!identical(args$center, FALSE)) { + if (!isFALSE(args$center)) { ### L = \Gamma \Omega^1/2 in Section 2.3. of Fahrmeir et al. ### (2004, Stat Sinica), always L <- eigen(K, symmetric = TRUE) @@ -2010,7 +2010,7 @@ X_bbsc <- function(mf, vary, args) { ### Calculate constraints ## for center = TRUE, design matrix does not contain constant part - if(args$center != FALSE){ + if(!isFALSE(args$center)){ ## center the columns of the design matrix ## Z contains column means diff --git a/R/baselearnersX.R b/R/baselearnersX.R index b6e45e7..2e121a6 100644 --- a/R/baselearnersX.R +++ b/R/baselearnersX.R @@ -32,7 +32,7 @@ hyper_histx <- function(mf, vary, knots = 10, boundary.knots = NULL, degree = 3, stop("variable names and knot names must be the same") if (is.list(boundary.knots)) if(!all(names(boundary.knots) %in% nm)) stop("variable names and boundary.knot names must be the same") - if (!identical(center, FALSE) && cyclic) + if (!isFALSE(center) && cyclic) stop("centering of cyclic covariates not yet implemented") ret <- vector(mode = "list", length = length(nm)) names(ret) <- nm diff --git a/R/constrainedX.R b/R/constrainedX.R index 059f8ab..673098d 100644 --- a/R/constrainedX.R +++ b/R/constrainedX.R @@ -89,8 +89,8 @@ if(any(used_bl == "bolsc")) stop("Use bols instead of bolsc with %Xc%.") if(any(used_bl == "brandomc")) stop("Use brandom instead of brandomc with %Xc%.") if(any(used_bl == "bbsc")) stop("Use bbs instead of bbsc with %Xc%.") - if( (!is.null(match.call()$bl1$intercept) && match.call()$bl1$intercept != TRUE) || - (!is.null(match.call()$bl2$intercept) && match.call()$bl2$intercept != TRUE) ){ + if( (!is.null(match.call()$bl1$intercept) && !isTRUE(match.call()$bl1$intercept)) || + (!is.null(match.call()$bl2$intercept) && !isTRUE(match.call()$bl2$intercept)) ){ stop("Set intercept = TRUE in base-learners used with %Xc%.") } diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 6d6d3ea..b55e75f 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -800,7 +800,7 @@ validateFDboost <- function(object, response = NULL, # Using the offset of object with the following settings # call$control <- boost_control(risk="oobag") # call$oobweights <- oobweights[id] - if(refitSmoothOffset == FALSE && is.null(call$offset) ){ + if(!refitSmoothOffset && is.null(call$offset) ){ if(!inherits(object, "FDboostLong")){ call$offset <- matrix(object$offset, ncol = Gy)[1, ] }else{ diff --git a/R/methods.R b/R/methods.R index 45ac542..7b5127f 100644 --- a/R/methods.R +++ b/R/methods.R @@ -1050,7 +1050,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, if(!is.matrix(predHelp)){ X <- predHelp }else{ - X <- if(any(trm$get_names() %in% c("ONEtime")) || + X <- if(any(trm$get_names() %in% "ONEtime") || inherits(object, "FDboostScalar")){ # effect constant in t predHelp[,1] }else{ From 1157346fa8179ecca201cf0ef9a075063f649e64 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Wed, 26 Mar 2025 23:44:40 +0100 Subject: [PATCH 44/56] chore: use `usethis::use_description()` and add orcid ids --- DESCRIPTION | 64 ++++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index defcfcd..dc5439e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,47 +1,56 @@ -Package: FDboost Type: Package +Package: FDboost Title: Boosting Functional Regression Models Version: 1.1-1 Date: 2022-09-08 -Authors@R: c(person("Sarah", "Brockhaus", role = "aut", - email = "Sarah.Brockhaus@stat.uni-muenchen.de"), - person("David", "Ruegamer", role = c("aut", "cre"), - email = "david.ruegamer@gmail.com"), - person("Almond", "Stoecker", role = "aut", - email = "almond.stoecker@hu-berlin.de"), - person("Torsten", "Hothorn", role = "ctb"), - person("with contributions by many others", "(see inst/CONTRIBUTIONS)", role = "ctb")) -Maintainer: David Ruegamer -Description: Regression models for functional data, i.e., scalar-on-function, - function-on-scalar and function-on-function regression models, are fitted - by a component-wise gradient boosting algorithm. - For a manual on how to use 'FDboost', see Brockhaus, Ruegamer, Greven (2017) . +Authors@R: c( + person("Sarah", "Brockhaus", , "Sarah.Brockhaus@stat.uni-muenchen.de", role = "aut", + comment = c(ORCID = "0000-0001-9484-7488")), + person("David", "Ruegamer", , "david.ruegamer@gmail.com", role = c("aut", "cre"), + comment = c(ORCID = "0000-0002-8772-9202")), + person("Almond", "Stoecker", , "almond.stoecker@hu-berlin.de", role = "aut", + comment = c(ORCID = "0000-0001-9160-2397")), + person("Torsten", "Hothorn", role = "ctb", + comment = c(ORCID = "0000-0001-8301-0471")), + person("with contributions by many others", "(see inst/CONTRIBUTIONS)", role = "ctb") + ) +Description: Regression models for functional data, i.e., + scalar-on-function, function-on-scalar and function-on-function + regression models, are fitted by a component-wise gradient boosting + algorithm. For a manual on how to use 'FDboost', see Brockhaus, + Ruegamer, Greven (2017) . +License: GPL-2 +URL: https://github.com/boost-R/FDboost +BugReports: https://github.com/boost-R/FDboost/issues Depends: - R (>= 3.5.0), - mboost (>= 2.9-0) + mboost (>= 2.9-0), + R (>= 3.5.0) Imports: - methods, + gamboostLSS (>= 2.0-0), graphics, grDevices, - utils, - stats, + MASS, Matrix, - gamboostLSS (>= 2.0-0), - stabs, + methods, mgcv, - MASS, + stabs, + stats, + utils, zoo Suggests: fda, fields, ggplot2, - maps, - mapdata, knitr, + mapdata, + maps, refund, testthat -License: GPL-2 +VignetteBuilder: + knitr +Encoding: UTF-8 Packaged: 2022-06-14 12:19:33 UTC; brockhaus +RoxygenNote: 7.3.2 Collate: 'aaa.R' 'FDboost-package.R' @@ -58,8 +67,3 @@ Collate: 'methods.R' 'stabsel.R' 'utilityFunctions.R' -RoxygenNote: 7.3.2 -Encoding: UTF-8 -BugReports: https://github.com/boost-R/FDboost/issues -URL: https://github.com/boost-R/FDboost -VignetteBuilder: knitr From 610fad440afd2a18a5c9afc100545fa40d293918 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 27 Mar 2025 22:19:11 +0100 Subject: [PATCH 45/56] chore: remove old NEWS.Rd --- inst/NEWS.Rd | 337 --------------------------------------------------- 1 file changed, 337 deletions(-) delete mode 100644 inst/NEWS.Rd diff --git a/inst/NEWS.Rd b/inst/NEWS.Rd deleted file mode 100644 index 9727bcf..0000000 --- a/inst/NEWS.Rd +++ /dev/null @@ -1,337 +0,0 @@ -\name{NEWS} -\title{News for Package 'FDboost'} - -\section{Changes in FDboost version 1.1-0 (2022-07-12)}{ - \subsection{Miscellaneous}{ - \itemize{ - \item Anisotropic tensor-product operators \code{b1 \%A0\% b2} and \code{b1 \%Xa0\% b2} now - also working when \code{lambda} is specified for \code{b1} and \code{df} is specified for \code{b2} - (or vice versa). - } - } - \subsection{New feature}{ - \itemize{ - \item New function \code{clr} to compute the centered-log-ratio transform and its - inverse for density-on-scalar regression in Bayes spaces. - \item New dataset \code{birthDistribution}. - \item New vignette illustrating density-on-function regression on - the \code{birthDistribution} data. - \item Function \code{factorize} added for tensor-product factorization of - estimated effects or models. - } - } -} - -\section{Changes in FDboost version 0.3-4 (2020-08-31)}{ - \subsection{Bug-fixes}{ - \itemize{ - \item Fix predict() for bsignal with newdata and the functional covariate - given as numeric matrix, raised in - \href{https://github.com/boost-R/FDboost/issues/17}{#17} - \item Deprecated argument \code{LINPACK} in \code{solve} removed. - } - } -} - -\section{Changes in FDboost version 0.3-3 (2020-06-13)}{ -\subsection{New feature}{ -\itemize{ - \item Now it is possible to specify several time variabels as well as - factor time variabels in the timeformula. - This feature is needed for the manifoldboost package. - } -} -\subsection{Miscellaneous}{ -\itemize{ - \item The function stabsel.FDboost() now uses applyFolds() instead of validateFDboost() to do - cross-validation with recomputation of the smooth offset. This is only relevant for models with functional response. - This will change the results if the model contains base-learners like bbsc() or bolsc(), - as applyFolds() also recomputes the Z-matrix for those base-learners. - } -} - \subsection{Bug-fixes}{ - \itemize{ - \item Adapted functions \code{integrationWeights} and \code{integrationWeightsLeft} for unsorted time variables. - \item Change code in predict.FDboost() such that interaction effects of two functional - covariates such as \code{bsignal() \%X\% bsignal()} can be predicted with new data. - \item Adapt FDboost to R 4.0.1: explicitely use the first entry of dots$aggregate, - by setting dots$aggregate[1] != "sum", in predict.FDboost(); such that it also works with the default, - where aggregate is a vector of length 3 and later on the first argument is used, using match.arg() - } -} -} - -\section{Changes in FDboost version 0.3-2 (2018-08-04)}{ - \subsection{Bug-fixes}{ - \itemize{ - \item Deprecated argument \code{corrected} in \code{cvrisk} removed. - } - } -} - -\section{Changes in FDboost version 0.3-1 (2018-05-10)}{ - \subsection{Bug-fixes}{ - \itemize{ - \item \code{cvrisk} has per default adequate folds for a noncyclic fitted FDboostLSS model, - see issue \href{https://github.com/boost-R/FDboost/issues/14}{#14} - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item replace cBind which is deprecated with cbind - } - } -} - -\section{Changes in FDboost version 0.3-0 (2017-05-31)}{ - \subsection{User-visible changes}{ - \itemize{ - \item new function \code{bootstrapCI()} to compute bootstrapped coefficients - \item add the dataset 'emotion' containing EEG and EMG measures under different experimental conditions - \item with scalar response, \code{FDboost()} works with the response as - vector and not as matrix with one row; - thus, \code{fitted()} and \code{predict()} return a vector - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item \code{update.FDboost()} works now with scalar response - \item \code{FDboost()} works with family \code{Binomial(type = "glm")}, - see isssue \href{https://github.com/boost-R/FDboost/issues/1}{#1} - \item \code{applyFolds()} works for factor response, - see issue \href{https://github.com/boost-R/FDboost/issues/7}{#7} - \item \code{cvLong} and \code{cvMA} return a matrix for only one resampling - fold with \code{B = 1} (proposed by Almond Stoecker) - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item adapt \pkg{FDboost} to \pkg{mboost} 2.8-0 that allows for mstop = 0 - \item restructure FDboostLSS() such that it calls mboostLSS_fit() from \pkg{gamboostLSS} 2.0-0 - \item in \pkg{FDboost}, set \code{options("mboost_indexmin" = +Inf)} to disable the - internal use of ties in model fitting, as this breaks some methods for models with response - in long format and for models containing \code{bhistx}, - see issue \href{https://github.com/boost-R/FDboost/issues/10}{#10} - \item deprecate \code{validateFDboost()}, - use \code{applyFolds()} and \code{bootstrapCI()} instead - } - } -} - - -\section{Changes in FDboost version 0.2-0 (2016-05-26)}{ - \subsection{User-visible changes}{ - \itemize{ - \item add function applyFolds() to compute the optimal stopping iteration - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item allow for extrapolation in predict() with bbsc() - } - } -} - -\section{Changes in FDboost version 0.1-2 (2016-04-22)}{ - \subsection{Bug-fixes}{ - \itemize{ - \item bugfix in bolsc(): correctly use index in bolsc() / bbsc(), - before: for the computation of Z each observation was used only once - } - } - \subsection{User-visible changes}{ - \itemize{ - \item add function \%Xa0\% that computes a row-tensor product of two base-learners where - the penalty in one direction is zero - \item add function reweightData() that computes the data for Bootstrap or cross-falidation folds - \item add function stabsel.FDboost() that refits the smooth offset in each fold - \item add argument 'fun' to validateFDboost() - \item add update.FDboost() that overwrites update.mboost() - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item FDboost() works with family = Binomial() - } - } -} - - -\section{Changes in FDboost version 0.1-1 (2016-04-06)}{ - \subsection{Bug-fixes}{ - \itemize{ - \item fix oobpred in validateFDboost() for irregular response and resampling on the level of curves - and thus plot.validateFDboost() works for that case - \item fix scope of formula in FDboost(): now the formula given to mboost() within FDboost() uses the variables in the environment of the formula specified in FDboost() - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item plot.FDboost() works for more effects, especially for effects like bolsc() \%X\% bhistx() - } - } -} - - -\section{Changes in FDboost version 0.1-0 (2016-03-10)}{ - \subsection{User-visible changes}{ - \itemize{ - \item new operator \%A0\% for Kronecker product of two base-learners with - anisotropic penalty for the special case where lambda1 or lambda2 is zero - \item the base-learner bbsc() can be used with center = TRUE, derived by Almond Stoecker - \item in FDboostLSS() a list of one-sided formulas can be specified for timeformula - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item FDboostLSS works with families = GammaLSS() - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item operator \%A\% uses weights in model call; only works correctly for weights on level - of blg1 and blg2 (which is the same as weights on rows and columns of the response matrix) - \item call to internal functions of mboost is done using mboost_intern() - \item hyper_olsc() is based on hyper_ols() of mboost - } - } -} - -\section{Changes in FDboost version 0.0-17 (2016-02-25)}{ - \subsection{User-visible changes}{ - \itemize{ - \item changed the operator \%Xc\% for row tensor product of two scalar covariates. - The design matrix of the interaction effects is constrained such that the interaction is - centred around the intercept and around the two main effects of the scalar covariates (experimental!); - use e.g. as bols(x1) \%Xc\% bols(x2) - } - } -} - -\section{Changes in FDboost version 0.0-16 (2016-02-22)}{ - \subsection{User-visible changes}{ - \itemize{ - \item changed the operator \%Xc\% for row tensor product where the sum-to-zero constraint is applied to - the design matrix resulting from the row-tensor product (experimental!), - such that first a, intercept-column is added to the design-matrix and then the sum-to-zero constraint - is applied, use e.g. as bolsc(x1) \%Xc\% bolsc(x2) - \item use the functional index s as argsvals in the FPCA conducted within bfpc() - } - } -} - -\section{Changes in FDboost version 0.0-15 (2016-02-12)}{ - \subsection{User-visible changes}{ - \itemize{ - \item new operator \%A\% that implies anisotropic penalties for differently specified df in the two base-learners - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item do not penalize in direction of ONEx in smooth intercept specified implicitly by ~1, as bols(ONEx, intercept=FALSE, df=1) \%A\% bbs(time) - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item do not expand an effect that contains \%A\% or \%O\% with the timeformula, allowing for different effects over time for the - effects in the model - } - } -} - -\section{Changes in FDboost version 0.0-14 (2016-02-11)}{ - \subsection{User-visible changes}{ - \itemize{ - \item add the function FDboostLSS() to fit GAMLSS models with functional data - using R-package gamboostLSS - \item new operator \%Xc\% for row tensor product where the sum-to-zero constraint is applied to - the design matrix resulting from the row-tensor product (experimental!) - \item allow newdata to be a list in predict.FDboost() in combination with signal base-learners - \item expand coef.FDboost() such that it works for 3-dimensional tensor products - of with bhistx() the form bhistx() \%X\% bolsc() \%X\% bolsc() (with David Ruegamer) - \item add a new possibility for scalar-on-function regression: - for timeformula=NULL, no Kronecker-product with 1 is used, which - changes the penalty as otherwise in the direction of 1 is penalized as well. - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item new dependency on R-package gamboostLSS - \item remove dependency on R-package MASS - \item use the argument 'prediction' in the internal computation - of the base-learners (work in progress) - \item throw an error if 'timeLab' of the hmatrix-object in bhistx() is not - equal to the time-variable in 'timeformula'. - } - } -} - - -\section{Changes in FDboost version 0.0-13 (2015-11-17)}{ - \subsection{User-visible changes}{ - \itemize{ - \item in function FDboost() the offset is supplied differently, for a scalar offset, use offset = "scalar", the default is still the same offset=NULL - \item predict.FDboost() has new argument toFDboost (logical) - \item fitted.FDboost() has argument toFDboost explicitly and not only in ... - \item new base-learner bhistx() especially suited for effects with \%X\%, like bhistx \%X\% bolsc - \item coef.FDboost() and plot.FDboost() suited for effects like bhistx \%X\% bolsc - \item for predict.FDboost() with effects bhistx() and newdata the latest mboostPatch is necessary - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item check for necessity of smooth offset works for missings in regular response (spotted by Tore Erdmann) - } - } -} - -\section{Changes in FDboost version 0.0-12 (2015-09-15)}{ - \itemize{ - \item Internal experimental version. - } -} - -\section{Changes in FDboost version 0.0-11 (2015-06-01)}{ - \subsection{User-visible changes}{ - \itemize{ - \item integrationWeights() gives equal weights for regular grids - \item new base-learner bfpc() for a functional covariate where - functional covariate and the coeffcient are both expanded using fPCA (experimental feature!); - only works for regularly observed functional covariate. - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item the function coef.FDboost() only works for bhist() if the time variable is the same in the timeformula and in bhist() - \item predict.FDboost() has a check that for newdata only type="link" can be predicted - } - } -} - -\section{Changes in FDboost version 0.0-10 (2015-04-16)}{ - \subsection{User-visible changes}{ - \itemize{ - \item change the default in difference-penalties to first order difference penalty - differences=1, as then the effects are better identifiable - \item new method cvrisk.FDboost() that uses per default - sampling on the levels of curves, which is important for functional response - \item reorganize documentation of cvrisk() and validateFDboost() - \item in bhist(): effect can be standardized - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item add a CITATION file - \item use mboost 2.4-2 as it exports all important functions - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item main argument is always passed in plot.FDboost() - \item bhist() and bconcurrent() work for equal time and s - \item predict.FDboost() works with tensor-product base-learners bl1 \%X\% bl2 - } - } -} - - From 6a294e23e4bb4babccd0888fc4df8e83666190ed Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 27 Mar 2025 22:21:42 +0100 Subject: [PATCH 46/56] ci: add github actions --- .github/.gitignore | 1 + .github/workflows/R-CMD-check.yaml | 52 ++++++++++++++++++++++++++++++ .github/workflows/pkgdown.yaml | 49 ++++++++++++++++++++++++++++ _pkgdown.yml | 5 +++ 4 files changed, 107 insertions(+) create mode 100644 .github/.gitignore create mode 100644 .github/workflows/R-CMD-check.yaml create mode 100644 .github/workflows/pkgdown.yaml create mode 100644 _pkgdown.yml diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..2d19fc7 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..8151d17 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,52 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: R-CMD-check.yaml + +permissions: read-all + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - { os: macos-latest, r: "release" } + - { os: windows-latest, r: "release" } + - { os: ubuntu-latest, r: "devel", http-user-agent: "release" } + - { os: ubuntu-latest, r: "release" } + - { os: ubuntu-latest, r: "oldrel-1" } + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml new file mode 100644 index 0000000..83e9810 --- /dev/null +++ b/.github/workflows/pkgdown.yaml @@ -0,0 +1,49 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + release: + types: [published] + workflow_dispatch: + +name: pkgdown.yaml + +permissions: read-all + +jobs: + pkgdown: + runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::pkgdown, local::. + needs: website + + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} + + - name: Deploy to GitHub pages 🚀 + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@v4.7.2 + with: + clean: false + branch: gh-pages + folder: docs diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..588072d --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,5 @@ +url: https://boost-R.github.io/FDboost + +template: + bootstrap: 5 + light-switch: true From 4fcb82d01687623b98c348bc80f06eb73d286a2d Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Thu, 27 Mar 2025 22:29:09 +0100 Subject: [PATCH 47/56] refactor: replace `length(levels(x))` with `nlevels(x)` --- R/crossvalidation.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/crossvalidation.R b/R/crossvalidation.R index b55e75f..1fd10dd 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -354,8 +354,8 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ for(i in seq_along(namesFac)){ - if(length(levels(droplevels(dathelp[[namesFac[i]]]))) != - length(levels(droplevels(dat_weights[[namesFac[i]]])))) + if(nlevels(droplevels(dathelp[[namesFac[i]]])) != + nlevels(droplevels(dat_weights[[namesFac[i]]]))) stop(paste0("The factor variable '", namesFac[i], "' has unobserved levels in the training data. ", "Make sure that training data in each fold contains all factor levels.")) From 67a9fb490e70059feab924868091090cf05ffd63 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sat, 5 Apr 2025 12:17:32 +0200 Subject: [PATCH 48/56] refactor: use fixed strings where possible --- R/FDboost.R | 66 +++++++++++++++++----------------- R/crossvalidation.R | 30 ++++++++-------- R/factorize.R | 4 +-- R/methods.R | 86 ++++++++++++++++++++++---------------------- R/utilityFunctions.R | 2 +- 5 files changed, 93 insertions(+), 95 deletions(-) diff --git a/R/FDboost.R b/R/FDboost.R index 3a74d7a..149b7d0 100644 --- a/R/FDboost.R +++ b/R/FDboost.R @@ -465,8 +465,8 @@ FDboost <- function(formula, ### response ~ xvars ## check if number of opening brackets is equal to number of closing brackets equalBrackets <- sapply(seq_along(trmstrings2), function(i) { - lengths(regmatches(trmstrings2[i], gregexpr("\\(", trmstrings2[i]))) == - lengths(regmatches(trmstrings2[i], gregexpr("\\)", trmstrings2[i]))) + lengths(regmatches(trmstrings2[i], gregexpr("(", trmstrings2[i], fixed = TRUE))) == + lengths(regmatches(trmstrings2[i], gregexpr(")", trmstrings2[i], fixed = TRUE))) }) } @@ -486,8 +486,8 @@ FDboost <- function(formula, ### response ~ xvars if(length(trmstrings) > 0){ ## insert index into the other base-learners of the tensor-product as well for(i in seq_along(trmstrings)){ - if(grepl( "%X", trmstrings2[i])){ - temp <- unlist(strsplit(trmstrings2[i], "%X")) + if(grepl( "%X", trmstrings2[i], fixed = TRUE)){ + temp <- unlist(strsplit(trmstrings2[i], "%X", fixed = TRUE)) temp1 <- temp[-length(temp)] ## http://stackoverflow.com/questions/2261079 ## delete all trailing whitespace @@ -497,13 +497,13 @@ FDboost <- function(formula, ### response ~ xvars trmstrings2[i] <- paste0(paste0(temp1, collapse = " %X"), " %X", temp[length(temp)]) } ## do not add index to base-learners bhistx() - if( grepl("bhistx", trmstrings[i]) ) trmstrings2[i] <- trmstrings[i] + if( grepl("bhistx", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] ## do not add an index if an index is already part of the formula if( grepl("index[[:blank:]]*=", trmstrings[i]) ) trmstrings2[i] <- trmstrings[i] ## do not add an index if an index for %A%, %A0%, %O% - if( grepl("%A%", trmstrings[i]) ) trmstrings2[i] <- trmstrings[i] - if( grepl("%A0%", trmstrings[i]) ) trmstrings2[i] <- trmstrings[i] - if( grepl("%O%", trmstrings[i]) ) trmstrings2[i] <- trmstrings[i] + if( grepl("%A%", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] + if( grepl("%A0%", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] + if( grepl("%O%", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] ## do not add an index for base-learner that do not have brackets if( i %in% which(!equalBrackets) ) trmstrings2[i] <- trmstrings[i] } @@ -538,7 +538,7 @@ FDboost <- function(formula, ### response ~ xvars scalarResponse <- TRUE if(is.null(timeformula)) scalarNoFLAM <- TRUE - if(grepl("df", formula[3]) || !grepl("lambda", formula[3]) ){ + if(grepl("df", formula[3], fixed = TRUE) || !grepl("lambda", formula[3], fixed = TRUE) ){ timeformula <- ~bols(ONEtime, intercept = FALSE, df = 1) }else{ timeformula <- ~bols(ONEtime, intercept = FALSE) @@ -671,23 +671,23 @@ FDboost <- function(formula, ### response ~ xvars ## get formula over time tfm <- paste(deparse(timeformula), collapse = "") - tfm <- strsplit(tfm, "~")[[1]] - tfm <- strsplit(tfm[2], "\\+")[[1]] + tfm <- strsplit(tfm, "~", fixed = TRUE)[[1]] + tfm <- strsplit(tfm[2], "+", fixed = TRUE)[[1]] ## get formula in covariates cfm <- paste(deparse(formula), collapse = "") - cfm <- strsplit(cfm, "~")[[1]] + cfm <- strsplit(cfm, "~", fixed = TRUE)[[1]] cfm0 <- cfm #xfm <- strsplit(cfm[2], "\\+")[[1]] xfm <- trmstrings ## check that the timevariable in timeformula and in the bhistx-base-learners have the same name - if(any(grepl("bhistx", trmstrings))){ + if(any(grepl("bhistx", trmstrings, fixed = TRUE))){ for(j in seq_along(trmstrings)){ - if(any(grepl("bhistx", trmstrings[j]))){ - if(grepl("%X", trmstrings[j]) ){ + if(any(grepl("bhistx", trmstrings[j], fixed = TRUE))){ + if(grepl("%X", trmstrings[j], fixed = TRUE) ){ temp <- strsplit(trmstrings[[j]], "%X.*%")[[1]] - temp <- temp[ grepl("bhistx", temp) ] + temp <- temp[ grepl("bhistx", temp, fixed = TRUE) ] ## pryr::standardise_call(quote(bhistx(X1h, df=3))) temp_name <- all.vars(formula(paste("~", temp)))[1] }else{ @@ -707,13 +707,13 @@ FDboost <- function(formula, ### response ~ xvars } } - yfm <- strsplit(cfm[1], "\\+")[[1]] ## name of response + yfm <- strsplit(cfm[1], "+", fixed = TRUE)[[1]] ## name of response ## set up formula for effects constant in time if(length(where.c) > 0){ # set c_df to the df/lambda in timeformula - if( grepl("lambda", tfm) || - ( grepl("bols", tfm) && !grepl("df", tfm)) ){ + if( grepl("lambda", tfm, fixed = TRUE) || + ( grepl("bols", tfm, fixed = TRUE) && !grepl("df", tfm, fixed = TRUE)) ){ c_lambda <- eval(parse(text = paste0(tfm, "$dpp(rep(1.0,", length(time), "))$df()")))["lambda"] cfm <- paste("bols(ONEtime, intercept = FALSE, lambda = ", c_lambda ,")") } else{ @@ -745,20 +745,20 @@ FDboost <- function(formula, ### response ~ xvars } # do not expand an effect bconcurrent() or bhist() with timeformula - if( length(c(grep("bconcurrent", tmp), grep("bhis", tmp)) ) > 0 ) - tmp[c(grep("bconcurrent", tmp), grep("bhist", tmp))] <- xfm[c(grep("bconcurrent", tmp), grep("bhist", tmp))] + if (any(grepl("bconcurrent|bhis", tmp))) + tmp[c(grep("bconcurrent", tmp, fixed = TRUE), grep("bhist", tmp, fixed = TRUE))] <- xfm[c(grep("bconcurrent", tmp, fixed = TRUE), grep("bhist", tmp, fixed = TRUE))] ## do not expand effects in formula including %A% with timeformula - if( length(grep("%A%", xfm)) > 0 ) - tmp[grep("%A%", xfm)] <- xfm[grep("%A%", xfm)] + if( any(grepl("%A%", xfm, fixed = TRUE)) ) + tmp[grep("%A%", xfm, fixed = TRUE)] <- xfm[grep("%A%", xfm, fixed = TRUE)] ## do not expand effects in formula including %A0% with timeformula - if( length(grep("%A0%", xfm)) > 0 ) - tmp[grep("%A0%", xfm)] <- xfm[grep("%A0%", xfm)] + if( any(grepl("%A0%", xfm, fixed = TRUE)) ) + tmp[grep("%A0%", xfm, fixed = TRUE)] <- xfm[grep("%A0%", xfm, fixed = TRUE)] ## do not expand effects in formula including %O% with timeformula - if( length(grep("%O%", xfm)) > 0 ) - tmp[grep("%O%", xfm)] <- xfm[grep("%O%", xfm)] + if( any(grepl("%O%", xfm, fixed = TRUE)) ) + tmp[grep("%O%", xfm, fixed = TRUE)] <- xfm[grep("%O%", xfm, fixed = TRUE)] ## expand with a constant effect in t-direction if(length(where.c) > 0){ @@ -833,11 +833,11 @@ FDboost <- function(formula, ### response ~ xvars ### replace "1" with intercept base learner formula_intercept <- FALSE - if ( any( gsub(" ", "", strsplit(cfm0[2], "\\+")[[1]]) == "1")){ + if ( any( gsub(" ", "", strsplit(cfm0[2], "+", fixed = TRUE)[[1]], fixed = TRUE) == "1")){ formula_intercept <- TRUE ## use df or lambda as in timeformula - if( any(grepl("lambda", deparse(timeformula))) || - any(( grepl("bols", deparse(timeformula)) & !grepl("df", deparse(timeformula)))) ){ + if( any(grepl("lambda", deparse(timeformula), fixed = TRUE)) || + any(( grepl("bols", deparse(timeformula), fixed = TRUE) & !grepl("df", deparse(timeformula), fixed = TRUE))) ){ tmp <- c("bols(ONEx, intercept = FALSE, lambda = 0)", tmp) } else{ tmp <- c("bols(ONEx, intercept = FALSE, df = 1)", tmp) @@ -879,9 +879,9 @@ FDboost <- function(formula, ### response ~ xvars ## get the limits argument current_bl <- attr(terms_fm_bhist, "variables")[[places_bhist[pl] + 1]] # for base-learner with interaction, find bhistx / bhist - if(any(grepl("%X", current_bl))){ + if(any(grepl("%X", current_bl, fixed = TRUE))){ #current_bl <- current_bl[ grepl("bhist", current_bl) ] - arg_limits <- eval(as.call(as.list(current_bl[grepl("bhist", current_bl)])[[1]])$limits) + arg_limits <- eval(as.call(as.list(current_bl[grepl("bhist", current_bl, fixed = TRUE)])[[1]])$limits) }else{ # limits argument of bhist / bhistx arg_limits <- eval(as.call(current_bl)$limits) @@ -1163,7 +1163,7 @@ FDboost <- function(formula, ### response ~ xvars if(check0 && length(ret$baselearner) > 1 && is.null(id) && dim(response)[2] != 1){ # do not check the smooth intercept - if(any( gsub(" ", "", strsplit(cfm[2], "\\+")[[1]]) == "1")){ + if(any( gsub(" ", "", strsplit(cfm[2], "+", fixed = TRUE)[[1]], fixed = TRUE) == "1")){ effectsToCheck <- 2:length(ret$baselearner) }else{ effectsToCheck <- seq_along(ret$baselearner) diff --git a/R/crossvalidation.R b/R/crossvalidation.R index 1fd10dd..55a1636 100644 --- a/R/crossvalidation.R +++ b/R/crossvalidation.R @@ -235,7 +235,7 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ # Function to suppress the warning of missings in the response h <- function(w){ - if( any( grepl( "response contains missing values;", w) ) ) + if( any( grepl( "response contains missing values;", w, fixed = TRUE) ) ) invokeRestart( "muffleWarning" ) } @@ -296,16 +296,16 @@ applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), typ # the probelm with such base-learners is that their data is not contained in object$data # using object$baselearner[[j]]$get_data() is difficult as this can be blow up by index for %X% singleBls <- gsub("\\s", "", unlist(lapply(strsplit( - strsplit(object$formulaFDboost, "~")[[1]][2], # split formula - "\\+")[[1]], # split additive terms + strsplit(object$formulaFDboost, "~", fixed = TRUE)[[1]][2], # split formula + "+", fixed = TRUE)[[1]], # split additive terms function(y) strsplit(y, split = "%.{1,3}%")) # split single baselearners )) singleBls <- singleBls[singleBls != "1"] - if(any(!grepl("\\(", singleBls))) + if(any(!grepl("(", singleBls, fixed = TRUE))) stop(paste0("applyFolds can not deal with the following base-learner(s) without brackets: ", - toString(singleBls[!grepl("\\(", singleBls)]))) + toString(singleBls[!grepl("(", singleBls, fixed = TRUE)]))) ## check if data includes all variables @@ -701,9 +701,9 @@ validateFDboost <- function(object, response = NULL, msg = "'validateFDboost' is deprecated. Use 'applyFolds' and 'bootstrapCI' instead.") names_bl <- names(object$baselearner) - if(any(grepl("brandomc", names_bl))) message("For brandomc, the transformation matrix Z is fixed over all folds.") - if(any(grepl("bolsc", names_bl))) message("For bolsc, the transformation matrix Z is fixed over all folds.") - if(any(grepl("bbsc", names_bl))) message("For bbsc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("brandomc", names_bl, fixed = TRUE))) message("For brandomc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bolsc", names_bl, fixed = TRUE))) message("For bolsc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bbsc", names_bl, fixed = TRUE))) message("For bbsc, the transformation matrix Z is fixed over all folds.") type <- attr(folds, "type") if(is.null(type)) type <- "unknown" @@ -755,7 +755,7 @@ validateFDboost <- function(object, response = NULL, # Function to suppress the warning of missings in the response h <- function(w){ - if( any( grepl( "response contains missing values;", w) ) ) + if( any( grepl( "response contains missing values;", w, fixed = TRUE) ) ) invokeRestart( "muffleWarning" ) } @@ -956,7 +956,7 @@ validateFDboost <- function(object, response = NULL, } ## only makes sense for type="curves" with leaving-out one curve per fold!! - if(grepl( "curves", type)){ + if(grepl( "curves", type, fixed = TRUE)){ # predict response for all mstops in grid out of bag # predictions for each response are in a vector! oobpreds0 <- lapply(modRisk, function(x) x$predGrid) @@ -1061,7 +1061,7 @@ validateFDboost <- function(object, response = NULL, ### predictions of terms based on the coefficients for each model # only makes sense for type="curves" with leaving-out one curve per fold!! - if(grepl("curves", type)){ + if(grepl("curves", type, fixed = TRUE)){ for(l in 1:(length(modRisk[[1]]$mod$baselearner)+1)){ predCV[[l]] <- t(sapply(seq_along(modRisk), function(g){ if(l == 1){ # save offset of model @@ -1561,7 +1561,7 @@ plot_bootstrapped_coef <- function(temp, l, quanty <- quantile(temp$y, probs=probs, type=1) # set lower triangular matrix to NA for historic effect - if(grepl("bhist", temp$main)){ + if(grepl("bhist", temp$main, fixed = TRUE)){ for(k in seq_along(temp$value)){ temp$value[[k]][temp$value[[k]]==0] <- NA } @@ -1675,9 +1675,9 @@ cvrisk.FDboost <- function(object, folds = cvLong(id=object$id, weights=model.we if(!length(unique(object$offset)) == 1) message("The smooth offset is fixed over all folds.") names_bl <- names(object$baselearner) - if(any(grepl("brandomc", names_bl))) message("For brandomc, the transformation matrix Z is fixed over all folds.") - if(any(grepl("bolsc", names_bl))) message("For bolsc, the transformation matrix Z is fixed over all folds.") - if(any(grepl("bbsc", names_bl))) message("For bbsc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("brandomc", names_bl, fixed = TRUE))) message("For brandomc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bolsc", names_bl, fixed = TRUE))) message("For bolsc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bbsc", names_bl, fixed = TRUE))) message("For bbsc, the transformation matrix Z is fixed over all folds.") class(object) <- "mboost" diff --git a/R/factorize.R b/R/factorize.R index 293264c..e3d344c 100644 --- a/R/factorize.R +++ b/R/factorize.R @@ -266,7 +266,7 @@ factorize.FDboost <- function(x, newdata = NULL, newweights = 1, blwise = TRUE, e[[i]]$ens <- unlist(lapply(cf[[i]], asplit, 2), recursive = FALSE) e[[i]]$ens <- Map( function(x, cls) { bm <- list(model = x) - class(bm) <- gsub("bl", "bm", cls) + class(bm) <- gsub("bl", "bm", cls, fixed = TRUE) bm }, x = e[[i]]$ens[bl_order[[i]]], @@ -356,4 +356,4 @@ plot.FDboost_fac <- function(x, which = NULL, main = NULL, ...) { main <- names(x$baselearner)[w] for(i in seq_along(w)) plot.mboost(x, which = w[i], main = main[i], ...) -} \ No newline at end of file +} diff --git a/R/methods.R b/R/methods.R index 7b5127f..3350dde 100644 --- a/R/methods.R +++ b/R/methods.R @@ -232,9 +232,9 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR indname <- attr(object$baselearner[[i]]$get_data()[[xname]], "indname") # does not work for %X% ## if two ore more base-learners are connected by %X%, find the functional variable ## the loop is necessary if more than one functioal covaraites are used in the same bl - if(grepl("%X", names(object$baselearner)[i])){ - form <- strsplit(object$baselearner[[i]]$get_call(), "%X")[[1]] - findFun <- grepl("bhist", form) | grepl("bconcurrent", form) | grepl("bsignal", form) | grepl("bfpc", form) + if(grepl("%X", names(object$baselearner)[i], fixed = TRUE)){ + form <- strsplit(object$baselearner[[i]]$get_call(), "%X", fixed = TRUE)[[1]] + findFun <- grepl("bhist", form, fixed = TRUE) | grepl("bconcurrent", form, fixed = TRUE) | grepl("bsignal", form, fixed = TRUE) | grepl("bfpc", form, fixed = TRUE) xname <- c() indname <- c() for(j in which(findFun)){ @@ -282,7 +282,7 @@ predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TR # offset of length>1 is not used in prediction, # important when offset=NULL in FDboost() but not in mboost() muffleWarning1 <- function(w){ - if( any( grepl( "User-specified offset is not a scalar", w) ) ) + if( any( grepl("User-specified offset is not a scalar", w, fixed = TRUE) ) ) invokeRestart( "muffleWarning" ) } @@ -603,7 +603,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, numberLevels <- 1 ### generate data in the case of an bhistx()-bl - if(grepl("bhistx", trm$get_call())){ + if(grepl("bhistx", trm$get_call(), fixed = TRUE)){ ng <- n2 # get hmatrix-object position_hmatrix <- which(sapply(trm$model.frame(), is.hmatrix)) @@ -614,10 +614,10 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, tvals <- seq(min(tvals), max(tvals), length = ng) tvals <- rep(tvals, each = ng) - if( grepl("%X", trm$get_call()) ){ + if( grepl("%X", trm$get_call(), fixed = TRUE) ){ split_bl <- strsplit(trm$get_call(), split = "%.{1,3}%")[[1]] ## save the position of bhistx() - position_bhistx <- which(grepl("bhistx", split_bl)) + position_bhistx <- grep("bhistx", split_bl, fixed = TRUE) if(length(split_bl) == 2){ # one %X% if(position_bhistx == 1){ @@ -667,7 +667,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, attr(d, "ym") <- seq(min(tvals), max(tvals), length = ng) ## for a tensor product term: add the scalar factors to d - if( grepl("%X", trm$get_call()) ){ + if( grepl("%X", trm$get_call(), fixed = TRUE) ){ if(position_hmatrix == 1){ position_z <- 2 }else{ @@ -827,7 +827,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, }else{ ### functional response ## not bhist - if( ! grepl("bhist", trm$get_call()) ){ + if( ! grepl("bhist", trm$get_call(), fixed = TRUE) ){ ## y (time variable, usually second variable) ## important in case of by-variables, then yind is third variable @@ -929,7 +929,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, ## add dummy signal to data for bsignal() - if(grepl("bsignal", trm$get_call()) || grepl("bfpc", trm$get_call()) ){ + if (grepl("bsignal|bfpc", trm$get_call())) { position_signal <- which(sapply(trm$model.frame(), function(x) !is.null(attr(x, "signalIndex")) )) @@ -944,7 +944,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, ## as they cannot be included into the variable x(s) ## use intFun() to compute the integration weights # ls(environment(trm$dpp)) - if(grepl("bhist", trm$get_call()) ){ + if(grepl("bhist", trm$get_call(), fixed = TRUE) ){ ## temp <- I(diag(ng)/integrationWeightsLeft(diag(ng), d[[varnms[1]]])) ## use intFun() of the bl to compute the integration weights temp <- environment(trm$dpp)$args$intFun(diag(ng), d[[attr(object$yind, "nameyind")]]) @@ -956,7 +956,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, } ## add dummy signal to data for bconcurrent() - if(grepl("bconcurrent", trm$get_call())){ + if(grepl("bconcurrent", trm$get_call(), fixed = TRUE)){ d[[ trm$get_names()[1] ]] <- I(matrix(rep(1.0, ng^2), ncol=ng)) } @@ -975,7 +975,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, # if %X% was used in combination with factor variables make a list of data-frames - if(!inherits(object, "FDboostLong") && grepl("%X", trm$get_call())){ + if(!inherits(object, "FDboostLong") && grepl("%X", trm$get_call(), fixed = TRUE)){ dlist <- NULL ## if %X% was used in combination with factor variables make a list of data-frames @@ -1068,7 +1068,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, ## for bhist(), multiply with standardisation weights if necessary ## you need the args$vecStand from the prediction of X, constructed here - if(grepl("bhist", trm$get_call())){ + if(grepl("bhist", trm$get_call(), fixed = TRUE)){ myargsHist <- myargs ## use the args found in makeDataGrid() ## this should only occur for more than two %X% @@ -1110,13 +1110,13 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, z=attr(d, "zm"), zlab=varnms[3], vecStand=vecStand) ## include the second scalar covariate called z1 into the output - if( grepl("bhistx", trm$get_call()) && length(trm$get_names()) > 2){ + if( grepl("bhistx", trm$get_call(), fixed = TRUE) && length(trm$get_names()) > 2){ extra_output <- list(z1=attr(d, "z1m"), z1lab=varnms[4]) P <- c(P, extra_output) } ## save the arguments of stand and limits as part of returned object - if(grepl("bhist", trm$get_call())){ + if(grepl("bhist", trm$get_call(), fixed = TRUE)){ P$stand <- myargsHist$stand P$limits <- myargsHist$limits } @@ -1151,8 +1151,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, trm <- object$baselearner[[i]] trm$dim <- length(trm$get_names()) - if(any(grepl("ONEx", trm$get_names()), - grepl("ONEtime", trm$get_names()))) trm$dim <- trm$dim - 1 + if(any(grepl("ONE(x|time)", trm$get_names()))) trm$dim <- trm$dim - 1 ### give error for bl1 %X% bl2 %X% bl3 #if( grepl("bhistx", trm$get_call()) & trm$dim > 2){ @@ -1160,18 +1159,18 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, #} ## add 1 to dimension of bhist and bhistx, otherwise dim is only 1 - if( grepl("bhist", trm$get_call()) ){ + if( grepl("bhist", trm$get_call(), fixed = TRUE) ){ trm$dim <- trm$dim + 1 } # If a by-variable was specified, reduce number of dimensions # as smooth linear effect in several groups can be plotted in one plot - if( grepl("by =", trm$get_call()) && grepl("bols", trm$get_call()) || - grepl("by =", trm$get_call()) && grepl("bbs", trm$get_call()) ) trm$dim <- trm$dim - 1 + if( grepl("by =", trm$get_call(), fixed = TRUE) && grepl("bols", trm$get_call(), fixed = TRUE) || + grepl("by =", trm$get_call(), fixed = TRUE) && grepl("bbs", trm$get_call(), fixed = TRUE) ) trm$dim <- trm$dim - 1 # what to do with bbs(..., by=factor)? - if(trm$dim > 3 && !grepl("bhistx", trm$get_call()) ){ + if(trm$dim > 3 && !grepl("bhistx", trm$get_call(), fixed = TRUE) ){ warning("Can't deal with smooths with more than 3 dimensions, returning NULL for ", shrtlbls[i], ".") return(NULL) @@ -1180,12 +1179,12 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, d <- makeDataGrid(trm) ### better solution for %X% in base-learner!!! - if(!is.null(object$ydim) && any(grepl("%X", trm$get_call())) - && !any(grepl("bhistx", trm$get_call())) ) trm$dim <- trm$dim - 1 + if(!is.null(object$ydim) && any(grepl("%X", trm$get_call(), fixed = TRUE)) + && !any(grepl("bhistx", trm$get_call(), fixed = TRUE)) ) trm$dim <- trm$dim - 1 ## it is necessary to expand the dataframe! if(!grepl("bhistx(", trm$get_call(), fixed=TRUE) && - inherits(object, "FDboostLong") && !grepl("bconcurrent", trm$get_call())){ + inherits(object, "FDboostLong") && !grepl("bconcurrent", trm$get_call(), fixed = TRUE)){ #print(attr(d, "varnms")) vari <- names(d)[1] if(is.factor(d[[vari]])){ @@ -1194,8 +1193,7 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, each=length(unique(d[[vari]])) ) }else{ # expand signal variable - if( grepl("bhist(", trm$get_call(), fixed = TRUE) || - grepl("bsignal", trm$get_call()) || grepl("bfpc", trm$get_call()) ){ + if (grepl("bhist\\(|bsignal|bfpc", trm$get_call())) { vari <- names(d)[!names(d) %in% attr(d, "varnms")] d[[vari]] <- d[[vari]][ rep(seq_len(NROW(d[[vari]])), times=NROW(d[[vari]])), ] @@ -1211,14 +1209,14 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, ###### just return the data, that is used for the prediction if(returnData){ - if(grepl("bhist", trm$get_call())){ + if(grepl("bhist", trm$get_call(), fixed = TRUE)){ message("If argument stand is specified !=\"no\", the standardization will be part of the predicted coefficient.") } return(d) } if( !is.null(attr(d, "numberLevels")) && attr(d, "numberLevels") > 1){ - if( grepl("bhistx", trm$get_call()) ) trm$dim <- 2 + if( grepl("bhistx", trm$get_call(), fixed = TRUE) ) trm$dim <- 2 ## get smooth coefficient estimates for several factor levels # P <- getP(d[[1]], trm = trm, myargs = attr(d, "myargsHist")) P <- lapply(d, getP, trm = trm, myargs = attr(d, "myargsHist")) @@ -1250,11 +1248,11 @@ coef.FDboost <- function(object, raw = FALSE, which = NULL, xpart[i] <- gsub(pattern = "\\\"", replacement = "", x = xpart[i], fixed=TRUE) xpart[i] <- gsub(pattern = "\\", replacement = "", x = xpart[i], fixed=TRUE) nvar <- length(all.vars(formula(paste("Y~", xpart[i])))[-1]) - commaSep <- unlist(strsplit(xpart[i], ",")) + commaSep <- unlist(strsplit(xpart[i], ",", fixed = TRUE)) # shorten the name to first variable and delete x= if present - if(grepl("=", commaSep[1])){ - temp <- unlist(strsplit(commaSep[1], "=")) + if(grepl("=", commaSep[1], fixed = TRUE)){ + temp <- unlist(strsplit(commaSep[1], "=", fixed = TRUE)) temp[1] <- unlist(strsplit(temp[1], "(", fixed=TRUE))[1] if(substr(temp[2], 1, 1)==" ") temp[2] <- substr(temp[2], 2, nchar(temp[2])) if(length(commaSep) == 1){ @@ -1479,7 +1477,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, ## trm <- terms[[i]] myplot <- function(trm, range_i = NULL){ - if(grepl("bhist", trm$main)){ + if(grepl("bhist", trm$main, fixed = TRUE)){ # set 0 to NA so that beta only has values in its domain # get the limits-function limits <- trm$limits @@ -1507,14 +1505,14 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, } if(rug && !is.factor(x = trm$x)){ - if(grepl("bconcurrent", trm$main) || grepl("bsignal", trm$main) || grepl("bfpc", trm$main) ){ + if (grepl("bconcurrent|bsignal|bfpc", trm$main)) { rug(attr(bl_data[[i]][[1]], "signalIndex"), ticksize = 0.02) }else rug(bl_data[[i]][[trm$xlab]], ticksize = 0.02) } } # plot with factor variable - if( (!grepl("bhistx", trm$main)) && trm$dim==2 && + if( (!grepl("bhistx", trm$main, fixed = TRUE)) && trm$dim==2 && ((is.factor(trm$x) || is.factor(trm$y)) || is.factor(trm$z)) ){ ## plot for the special case where factor is plotted in several plots @@ -1619,14 +1617,14 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, if(rug){ ##points(expand.grid(bl_data[[i]][[1]], bl_data[[i]][[2]])) - if(grepl("bhist", trm$main)){ + if(grepl("bhist", trm$main, fixed = TRUE)){ rug(x$yind, ticksize = 0.02) }else{ - ifelse(grepl("by", trm$main) | ( !inherits(x, "FDboostLong") && grepl("%X", trm$main) ) , + ifelse(grepl("by", trm$main, fixed = TRUE) | ( !inherits(x, "FDboostLong") && grepl("%X", trm$main, fixed = TRUE) ) , rug(bl_data[[i]][[3]], ticksize = 0.02), rug(bl_data[[i]][[2]], ticksize = 0.02)) } - ifelse(grepl("bsignal", trm$main) | grepl("bfpc", trm$main) | grepl("bhist", trm$main), + ifelse(grepl("bsignal|bfpc|bhist", trm$main), rug(attr(bl_data[[i]][[1]], "signalIndex"), ticksize = 0.02, side=2), rug(bl_data[[i]][[1]], ticksize = 0.02, side=2)) } @@ -1714,7 +1712,7 @@ plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, time <- x$yind # include the offset in the plot of the intercept - if( includeOffset && 1 %in% which && grepl("ONEx", shrtlbls[1]) ){ + if( includeOffset && 1 %in% which && grepl("ONEx", shrtlbls[1], fixed = TRUE) ){ terms[[1]] <- terms[[1]] + x$offset shrtlbls[1] <- paste("offset", "+", shrtlbls[1]) } @@ -1880,16 +1878,16 @@ update.FDboost <- function(object, weights = NULL, oobweights = NULL, risk = NUL ### check for brackets singleBls <- gsub("\\s", "", unlist(lapply(strsplit( - strsplit(object$formulaFDboost, "~")[[1]][2], # split formula - "\\+")[[1]], # split additive terms + strsplit(object$formulaFDboost, "~", fixed = TRUE)[[1]][2], # split formula + "+", fixed = TRUE)[[1]], # split additive terms function(y) strsplit(y, split = "%.{1,3}%")) # split single baselearners )) singleBls <- singleBls[singleBls!="1"] - if(any( !grepl("\\(",singleBls) )) + if(any( !grepl("(",singleBls, fixed = TRUE) )) stop(paste0("update can not deal with the following base-learner(s) without brackets: ", - toString(singleBls[!grepl("\\(",singleBls)]), ".\n", + toString(singleBls[!grepl("(", singleBls, fixed = TRUE)]), ".\n", "Please build such base-learners within the FDboost call or ", "update corresponding baselearner(s) manually and supply a new formula to the update function.")) @@ -1931,7 +1929,7 @@ extract.blg <- function(object, what = c("design", "penalty", "index"), asmatrix = FALSE, expand = FALSE, ...){ what <- match.arg(what) - if(grepl("%O%", object$get_call()) || grepl("%Oz%", object$get_call())){ + if (grepl("%O%|%Oz%", object$get_call())) { object <- object$dpp( rep(1, NROW(object$model.frame()[[1]])) ) }else{ object <- object$dpp(rep(1, nrow(object$model.frame()))) diff --git a/R/utilityFunctions.R b/R/utilityFunctions.R index ce5fc39..1d1ed4f 100644 --- a/R/utilityFunctions.R +++ b/R/utilityFunctions.R @@ -351,7 +351,7 @@ getYYhatTime <- function(object, breaks=object$yind){ newdata <- list() for(j in seq_along(object$baselearner)){ datVarj <- object$baselearner[[j]]$get_data() - if(grepl("bconcurrent", names(object$baselearner)[j])){ + if(grepl("bconcurrent", names(object$baselearner)[j], fixed = TRUE)){ datVarj <- t(apply(datVarj[[1]], 1, function(x) approx(object$yind, x, xout=time)$y)) datVarj <- list(datVarj) } From df67a9a204596bbd756c888ae4ceb6d56bb39f50 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sat, 5 Apr 2025 12:35:48 +0200 Subject: [PATCH 49/56] chore: add missing files to .Rbuildignore --- .Rbuildignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.Rbuildignore b/.Rbuildignore index 895c0da..c1ac78d 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -5,4 +5,9 @@ cran-comments.md README.md ^doc$ ^Meta$ -^figure$ \ No newline at end of file +^figure$ +^\.gitignore$ +^\.github$ +^_pkgdown\.yml$ +^pkgdown$ +^\.lintr$ From 6566fe21a0342575cc7dcea19ff834c66b69d0a6 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sat, 5 Apr 2025 22:00:24 +0200 Subject: [PATCH 50/56] ci: missing tex installation --- .github/workflows/R-CMD-check.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 8151d17..6f083e3 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -46,6 +46,15 @@ jobs: extra-packages: any::rcmdcheck needs: check + - uses: r-lib/actions/setup-tinytex@v2 + env: + TINYTEX_INSTALLER: TinyTeX + + - name: Install additional LaTeX packages + run: | + tlmgr update --self + tlmgr install doublestroke relsize + - uses: r-lib/actions/check-r-package@v2 with: upload-snapshots: true From ed7ca7900560ce7970f0bfe417ef3482cdb886e1 Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sun, 6 Apr 2025 10:58:15 +0200 Subject: [PATCH 51/56] chore: add badge to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fa7a8aa..c3a8f05 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ +[![R-CMD-check](https://github.com/boost-R/FDboost/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/boost-R/FDboost/actions/workflows/R-CMD-check.yaml) [![CRAN status](https://www.r-pkg.org/badges/version/FDboost)](https://CRAN.R-project.org/package=FDboost) [![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/FDboost)](https://www.r-pkg.org/pkg/FDboost) From b407a2f321de19fe528dbf89a7f2766b5af5a19b Mon Sep 17 00:00:00 2001 From: Maximilian Muecke Date: Sat, 12 Apr 2025 11:14:56 +0200 Subject: [PATCH 52/56] chore: remove travis config file Remove travis config file, since R CMD check is working now via GitHub Actions. --- .travis.yml | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 51a37e5..0000000 --- a/.travis.yml +++ /dev/null @@ -1,35 +0,0 @@ -# Sample .travis.yml for R projects. -# -# See README.md for instructions, or for more configuration options, -# see the wiki: -# https://github.com/craigcitro/r-travis/wiki - -language: r - - release - - devel -sudo: required -dist: bionic - -env: - - _R_S3_METHOD_LOOKUP_BASEENV_AFTER_GLOBALENV_=true - -repos: - CRAN: https://cloud.r-project.org - -r_github_packages: - - hofnerb/stabs - - boost-R/mboost - - boost-R/gamboostLSS - - jimhester/covr - - refunders/refund - -after_failure: - - ./travis-tool.sh dump_logs - -after_success: - - Rscript -e 'library(covr); coveralls()' - -notifications: - email: - on_success: change - on_failure: change From 5bb920a5cef7940bbdadb1dc63de6afd7202c1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20R=C3=BCgamer?= Date: Sun, 12 Apr 2026 12:26:00 +0200 Subject: [PATCH 53/56] Fix refund deprecation warnings and stabilize checks --- DESCRIPTION | 4 ++-- NEWS.md | 7 +++++++ R/baselearners.R | 5 ++--- R/baselearnersX.R | 4 ++-- R/bootstrapCIs.R | 4 ++-- man/bhistx.Rd | 4 ++-- man/bootstrapCI.Rd | 4 ++-- man/bsignal.Rd | 4 ++-- tests/general_tests.R | 7 +++++-- 9 files changed, 26 insertions(+), 17 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index dc5439e..939d948 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Type: Package Package: FDboost Title: Boosting Functional Regression Models -Version: 1.1-1 -Date: 2022-09-08 +Version: 1.1-4 +Date: 2026-03-24 Authors@R: c( person("Sarah", "Brockhaus", , "Sarah.Brockhaus@stat.uni-muenchen.de", role = "aut", comment = c(ORCID = "0000-0001-9484-7488")), diff --git a/NEWS.md b/NEWS.md index 365ca99..b372b57 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,10 @@ +# FDboost 1.1-4 (2026-03-24) + +## Bug fixes + +- Suppressed deprecation warnings from `refund::pffrSim()` in examples to keep checks clean with recent `refund` versions. +- Stabilized `tests/general_tests.R` by forcing serial evaluation (`mc.cores = 1`) to avoid parallel `applyFolds()` crashes on some check platforms. + # FDboost 1.1.0 (2022-07-12) ## Miscellaneous diff --git a/R/baselearners.R b/R/baselearners.R index ee88fbd..1844c62 100644 --- a/R/baselearners.R +++ b/R/baselearners.R @@ -585,7 +585,7 @@ X_bsignal <- function(mf, vary, args) { #' # model with linear functional effect, use bsignal() #' # Y(t) = f(t) + \int X1(s)\beta(s,t)ds + eps #' set.seed(2121) -#' data1 <- pffrSim(scenario = "ff", n = 40) +#' data1 <- suppressWarnings(pffrSim(scenario = "ff", n = 40)) #' data1$X1 <- scale(data1$X1, scale = FALSE) #' dat_list <- as.list(data1) #' dat_list$t <- attr(data1, "yindex") @@ -623,7 +623,7 @@ X_bsignal <- function(mf, vary, args) { #' mylimits <- function(s, t){ #' (s < t) | (s == t) #' } -#' data2 <- pffrSim(scenario = "ff", n = 40, limits = mylimits) +#' data2 <- suppressWarnings(pffrSim(scenario = "ff", n = 40, limits = mylimits)) #' data2$X1 <- scale(data2$X1, scale = FALSE) #' dat2_list <- as.list(data2) #' dat2_list$t <- attr(data2, "yindex") @@ -2600,4 +2600,3 @@ brandomc <- function (..., contrasts.arg = "contr.dummy", df = 4) { ret } - diff --git a/R/baselearnersX.R b/R/baselearnersX.R index 2e121a6..eb8ceb6 100644 --- a/R/baselearnersX.R +++ b/R/baselearnersX.R @@ -395,8 +395,8 @@ X_histx <- function(mf, vary, args) { #' ## the interaction effect is in this case not necessary #' n <- 100 #' nygrid <- 35 -#' data1 <- pffrSim(scenario = c("int", "ff"), limits = function(s,t){ s <= t }, -#' n = n, nygrid = nygrid) +#' data1 <- suppressWarnings(pffrSim(scenario = c("int", "ff"), limits = function(s,t){ s <= t }, +#' n = n, nygrid = nygrid)) #' data1$X1 <- scale(data1$X1, scale = FALSE) ## center functional covariate #' dataList <- as.list(data1) #' dataList$tvals <- attr(data1, "yindex") diff --git a/R/bootstrapCIs.R b/R/bootstrapCIs.R index e741215..f83c90f 100644 --- a/R/bootstrapCIs.R +++ b/R/bootstrapCIs.R @@ -47,7 +47,7 @@ #' #' @note Note that parallelization can be achieved by defining #' the \code{resampling_fun_outer} or \code{_inner} accordingly. -#' See, e.g., \code{\link{cvrisk}} on how to parallelize resampling +#' See, e.g., \code{\link[mboost]{cvrisk}} on how to parallelize resampling #' functions or the examples below. Also note that by defining #' a custum inner or outer resampling function the respective #' argument \code{B_inner} or \code{B_outer} is ignored. @@ -77,7 +77,7 @@ #' # model with linear functional effect, use bsignal() #' # Y(t) = f(t) + \int X1(s)\beta(s,t)ds + eps #' set.seed(2121) -#' data1 <- pffrSim(scenario = "ff", n = 40) +#' data1 <- suppressWarnings(pffrSim(scenario = "ff", n = 40)) #' data1$X1 <- scale(data1$X1, scale = FALSE) #' dat_list <- as.list(data1) #' dat_list$t <- attr(data1, "yindex") diff --git a/man/bhistx.Rd b/man/bhistx.Rd index 7d80fc8..8f7a55c 100644 --- a/man/bhistx.Rd +++ b/man/bhistx.Rd @@ -111,8 +111,8 @@ if(require(refund)){ ## the interaction effect is in this case not necessary n <- 100 nygrid <- 35 -data1 <- pffrSim(scenario = c("int", "ff"), limits = function(s,t){ s <= t }, - n = n, nygrid = nygrid) +data1 <- suppressWarnings(pffrSim(scenario = c("int", "ff"), limits = function(s,t){ s <= t }, + n = n, nygrid = nygrid)) data1$X1 <- scale(data1$X1, scale = FALSE) ## center functional covariate dataList <- as.list(data1) dataList$tvals <- attr(data1, "yindex") diff --git a/man/bootstrapCI.Rd b/man/bootstrapCI.Rd index 0c27324..b0e54fb 100644 --- a/man/bootstrapCI.Rd +++ b/man/bootstrapCI.Rd @@ -86,7 +86,7 @@ to bootstrap confidence intervals are biased towards zero. \note{ Note that parallelization can be achieved by defining the \code{resampling_fun_outer} or \code{_inner} accordingly. -See, e.g., \code{\link{cvrisk}} on how to parallelize resampling +See, e.g., \code{\link[mboost]{cvrisk}} on how to parallelize resampling functions or the examples below. Also note that by defining a custum inner or outer resampling function the respective argument \code{B_inner} or \code{B_outer} is ignored. @@ -104,7 +104,7 @@ if(require(refund)){ # model with linear functional effect, use bsignal() # Y(t) = f(t) + \int X1(s)\beta(s,t)ds + eps set.seed(2121) -data1 <- pffrSim(scenario = "ff", n = 40) +data1 <- suppressWarnings(pffrSim(scenario = "ff", n = 40)) data1$X1 <- scale(data1$X1, scale = FALSE) dat_list <- as.list(data1) dat_list$t <- attr(data1, "yindex") diff --git a/man/bsignal.Rd b/man/bsignal.Rd index 6334a79..a473053 100644 --- a/man/bsignal.Rd +++ b/man/bsignal.Rd @@ -256,7 +256,7 @@ if(require(refund)){ # model with linear functional effect, use bsignal() # Y(t) = f(t) + \int X1(s)\beta(s,t)ds + eps set.seed(2121) -data1 <- pffrSim(scenario = "ff", n = 40) +data1 <- suppressWarnings(pffrSim(scenario = "ff", n = 40)) data1$X1 <- scale(data1$X1, scale = FALSE) dat_list <- as.list(data1) dat_list$t <- attr(data1, "yindex") @@ -294,7 +294,7 @@ set.seed(2121) mylimits <- function(s, t){ (s < t) | (s == t) } -data2 <- pffrSim(scenario = "ff", n = 40, limits = mylimits) +data2 <- suppressWarnings(pffrSim(scenario = "ff", n = 40, limits = mylimits)) data2$X1 <- scale(data2$X1, scale = FALSE) dat2_list <- as.list(data2) dat2_list$t <- attr(data2, "yindex") diff --git a/tests/general_tests.R b/tests/general_tests.R index ff3e70a..50d5fe6 100644 --- a/tests/general_tests.R +++ b/tests/general_tests.R @@ -10,10 +10,14 @@ library(gamboostLSS) if(require(refund)){ + old_mc_cores <- getOption("mc.cores") + options(mc.cores = 1L) + on.exit(options(mc.cores = old_mc_cores), add = TRUE) + ## simulate a small data set print("simulate data") set.seed(230) - pffr_data <- pffrSim(n = 25, nxgrid = 21, nygrid = 19) + pffr_data <- suppressWarnings(pffrSim(n = 25, nxgrid = 21, nygrid = 19)) pffr_data$X1 <- scale(pffr_data$X1, scale = FALSE) dat <- as.list(pffr_data) @@ -210,4 +214,3 @@ pred <- predict(fof, newdata = fuelSubset) - From be3da5a21f9e41b51d37b9d541c1c2045cae9229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20R=C3=BCgamer?= Date: Sun, 12 Apr 2026 18:28:00 +0200 Subject: [PATCH 54/56] Run full checks and commit all local updates --- .codex | 0 FDboost.Rcheck/00_pkg_src/FDboost/.codex | 0 FDboost.Rcheck/00_pkg_src/FDboost/DESCRIPTION | 45 + FDboost.Rcheck/00_pkg_src/FDboost/NAMESPACE | 128 + FDboost.Rcheck/00_pkg_src/FDboost/NEWS.md | 232 ++ .../00_pkg_src/FDboost/R/FDboost-package.R | 87 + FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost.R | 1240 ++++++++ .../00_pkg_src/FDboost/R/FDboostLSS.R | 227 ++ FDboost.Rcheck/00_pkg_src/FDboost/R/aaa.R | 18 + .../00_pkg_src/FDboost/R/baselearners.R | 2602 +++++++++++++++++ .../00_pkg_src/FDboost/R/baselearnersX.R | 537 ++++ .../00_pkg_src/FDboost/R/bootstrapCIs.R | 616 ++++ .../00_pkg_src/FDboost/R/clr_functions.R | 241 ++ .../00_pkg_src/FDboost/R/constrainedX.R | 1131 +++++++ .../00_pkg_src/FDboost/R/crossvalidation.R | 1747 +++++++++++ .../00_pkg_src/FDboost/R/factorize.R | 359 +++ FDboost.Rcheck/00_pkg_src/FDboost/R/hmatrix.R | 371 +++ FDboost.Rcheck/00_pkg_src/FDboost/R/methods.R | 1939 ++++++++++++ FDboost.Rcheck/00_pkg_src/FDboost/R/stabsel.R | 206 ++ .../00_pkg_src/FDboost/R/utilityFunctions.R | 1225 ++++++++ .../00_pkg_src/FDboost/build/vignette.rds | Bin 0 -> 330 bytes .../FDboost/data/birthDistribution.RData | Bin 0 -> 25804 bytes .../00_pkg_src/FDboost/data/datalist | 4 + .../00_pkg_src/FDboost/data/emotion.RData | Bin 0 -> 1092126 bytes .../00_pkg_src/FDboost/data/fuelSubset.RData | Bin 0 -> 256609 bytes .../00_pkg_src/FDboost/data/viscosity.RData | Bin 0 -> 19341 bytes .../00_pkg_src/FDboost/docs/katex-auto.js | 14 + .../00_pkg_src/FDboost/docs/lightswitch.js | 85 + .../00_pkg_src/FDboost/docs/link.svg | 12 + .../00_pkg_src/FDboost/docs/pkgdown.js | 162 + .../00_pkg_src/FDboost/inst/CITATION | 78 + .../00_pkg_src/FDboost/inst/CONTRIBUTIONS | 19 + .../FDboost/inst/sim/analyze_results.R | 185 ++ .../00_pkg_src/FDboost/inst/sim/readme.txt | 11 + .../00_pkg_src/FDboost/inst/sim/run_FDboost.R | 225 ++ .../FDboost/inst/sim/run_PlotModels.R | 54 + .../00_pkg_src/FDboost/inst/sim/run_pffr.R | 224 ++ .../00_pkg_src/FDboost/inst/sim/run_time.R | 88 + .../00_pkg_src/FDboost/inst/sim/simfuns.R | 1264 ++++++++ .../FDboost/inst/simHist/analyze_results.R | 631 ++++ .../FDboost/inst/simHist/boosting4.R | 1331 +++++++++ .../FDboost/inst/simHist/readme.txt | 24 + .../FDboost/inst/simHist/run_FDboost2.R | 205 ++ .../FDboost/inst/simHist/run_FDboost3.R | 205 ++ .../FDboost/inst/simHist/run_FDboost4.R | 205 ++ .../FDboost/inst/simHist/run_PlotModels.R | 162 + .../FDboost/inst/simHist/run_pffr2.R | 206 ++ .../FDboost/inst/simHist/run_pffr3.R | 207 ++ .../FDboost/inst/simHist/simUtils.R | 957 ++++++ .../00_pkg_src/FDboost/man/FDboost-package.Rd | 87 + .../00_pkg_src/FDboost/man/FDboost.Rd | 463 +++ .../00_pkg_src/FDboost/man/FDboostLSS.Rd | 161 + .../FDboost/man/FDboost_fac-class.Rd | 15 + .../FDboost/man/anisotropic_Kronecker.Rd | 160 + .../00_pkg_src/FDboost/man/applyFolds.Rd | 224 ++ FDboost.Rcheck/00_pkg_src/FDboost/man/bbsc.Rd | 171 ++ .../00_pkg_src/FDboost/man/bhistx.Rd | 176 ++ .../FDboost/man/birthDistribution.Rd | 118 + .../00_pkg_src/FDboost/man/bootstrapCI.Rd | 204 ++ .../00_pkg_src/FDboost/man/bsignal.Rd | 353 +++ FDboost.Rcheck/00_pkg_src/FDboost/man/clr.Rd | 117 + .../00_pkg_src/FDboost/man/coef.FDboost.Rd | 75 + .../FDboost/man/cvrisk.FDboostLSS.Rd | 58 + .../00_pkg_src/FDboost/man/emotion.Rd | 52 + .../00_pkg_src/FDboost/man/extract.blg.Rd | 42 + .../00_pkg_src/FDboost/man/factorize.Rd | 344 +++ .../00_pkg_src/FDboost/man/fitted.FDboost.Rd | 26 + .../00_pkg_src/FDboost/man/fuelSubset.Rd | 67 + .../00_pkg_src/FDboost/man/funMRD.Rd | 42 + .../00_pkg_src/FDboost/man/funMSE.Rd | 56 + .../00_pkg_src/FDboost/man/funRsquared.Rd | 53 + .../00_pkg_src/FDboost/man/funplot.Rd | 41 + .../00_pkg_src/FDboost/man/getTime.Rd | 47 + .../00_pkg_src/FDboost/man/getTime.hmatrix.Rd | 44 + .../FDboost/man/grapes-Xc-grapes.Rd | 86 + .../00_pkg_src/FDboost/man/hmatrix.Rd | 93 + .../FDboost/man/integrationWeights.Rd | 84 + .../00_pkg_src/FDboost/man/is.hmatrix.Rd | 17 + .../00_pkg_src/FDboost/man/o_control.Rd | 27 + .../00_pkg_src/FDboost/man/plot.FDboost.Rd | 102 + .../FDboost/man/plot.bootstrapCI.Rd | 53 + .../FDboost/man/plot.validateFDboost.Rd | 101 + .../00_pkg_src/FDboost/man/predict.FDboost.Rd | 42 + .../FDboost/man/predict.FDboost_fac.Rd | 41 + .../FDboost/man/residuals.FDboost.Rd | 26 + .../00_pkg_src/FDboost/man/reweightData.Rd | 98 + .../00_pkg_src/FDboost/man/stabsel.FDboost.Rd | 139 + .../00_pkg_src/FDboost/man/sub-.hmatrix.Rd | 37 + .../00_pkg_src/FDboost/man/subset_hmatrix.Rd | 42 + .../00_pkg_src/FDboost/man/summary.FDboost.Rd | 28 + .../00_pkg_src/FDboost/man/truncateTime.Rd | 46 + .../00_pkg_src/FDboost/man/update.FDboost.Rd | 58 + .../00_pkg_src/FDboost/man/validateFDboost.Rd | 165 ++ .../00_pkg_src/FDboost/man/viscosity.Rd | 61 + .../00_pkg_src/FDboost/man/wide2long.Rd | 20 + .../FDboost/tests/factorize_test_irregular.R | 177 ++ .../FDboost/tests/factorize_test_regular.R | 111 + .../00_pkg_src/FDboost/tests/general_tests.R | 216 ++ .../FDboost/vignettes/FLAM_canada.Rnw | 346 +++ .../FDboost/vignettes/FLAM_fuel.Rnw | 234 ++ .../FDboost/vignettes/FLAM_viscosity.Rnw | 351 +++ .../vignettes/density-on-scalar_birth.Rnw | 312 ++ FDboost.Rcheck/00check.log | 79 + FDboost.Rcheck/00install.out | 15 + FDboost.Rcheck/FDboost-Ex.R | 1522 ++++++++++ FDboost.Rcheck/FDboost-Ex.Rout | 2091 +++++++++++++ FDboost.Rcheck/FDboost-Ex.pdf | Bin 0 -> 1892097 bytes FDboost.Rcheck/FDboost-manual.log | 1095 +++++++ FDboost.Rcheck/FDboost-manual.pdf | Bin 0 -> 372163 bytes FDboost.Rcheck/FDboost/CITATION | 78 + FDboost.Rcheck/FDboost/CONTRIBUTIONS | 19 + FDboost.Rcheck/FDboost/DESCRIPTION | 46 + FDboost.Rcheck/FDboost/INDEX | 63 + FDboost.Rcheck/FDboost/NAMESPACE | 128 + FDboost.Rcheck/FDboost/NEWS.md | 232 ++ FDboost.Rcheck/FDboost/R/FDboost | 27 + FDboost.Rcheck/FDboost/R/FDboost.rdb | Bin 0 -> 431534 bytes FDboost.Rcheck/FDboost/R/FDboost.rdx | Bin 0 -> 1620 bytes .../FDboost/data/birthDistribution.RData | Bin 0 -> 25804 bytes FDboost.Rcheck/FDboost/data/datalist | 4 + FDboost.Rcheck/FDboost/data/emotion.RData | Bin 0 -> 1092126 bytes FDboost.Rcheck/FDboost/data/fuelSubset.RData | Bin 0 -> 256609 bytes FDboost.Rcheck/FDboost/data/viscosity.RData | Bin 0 -> 19341 bytes FDboost.Rcheck/FDboost/help/AnIndex | 84 + FDboost.Rcheck/FDboost/help/FDboost.rdb | Bin 0 -> 211717 bytes FDboost.Rcheck/FDboost/help/FDboost.rdx | Bin 0 -> 1229 bytes FDboost.Rcheck/FDboost/help/aliases.rds | Bin 0 -> 743 bytes FDboost.Rcheck/FDboost/help/paths.rds | Bin 0 -> 563 bytes FDboost.Rcheck/FDboost/html/00Index.html | 195 ++ FDboost.Rcheck/FDboost/html/R.css | 130 + FDboost.Rcheck/FDboost/sim/analyze_results.R | 185 ++ FDboost.Rcheck/FDboost/sim/readme.txt | 11 + FDboost.Rcheck/FDboost/sim/run_FDboost.R | 225 ++ FDboost.Rcheck/FDboost/sim/run_PlotModels.R | 54 + FDboost.Rcheck/FDboost/sim/run_pffr.R | 224 ++ FDboost.Rcheck/FDboost/sim/run_time.R | 88 + FDboost.Rcheck/FDboost/sim/simfuns.R | 1264 ++++++++ .../FDboost/simHist/analyze_results.R | 631 ++++ FDboost.Rcheck/FDboost/simHist/boosting4.R | 1331 +++++++++ FDboost.Rcheck/FDboost/simHist/readme.txt | 24 + FDboost.Rcheck/FDboost/simHist/run_FDboost2.R | 205 ++ FDboost.Rcheck/FDboost/simHist/run_FDboost3.R | 205 ++ FDboost.Rcheck/FDboost/simHist/run_FDboost4.R | 205 ++ .../FDboost/simHist/run_PlotModels.R | 162 + FDboost.Rcheck/FDboost/simHist/run_pffr2.R | 206 ++ FDboost.Rcheck/FDboost/simHist/run_pffr3.R | 207 ++ FDboost.Rcheck/FDboost/simHist/simUtils.R | 957 ++++++ FDboost.Rcheck/Rdlatex.log | 1556 ++++++++++ FDboost.Rcheck/tests/Rplots.pdf | Bin 0 -> 116484 bytes .../tests/factorize_test_irregular.R | 177 ++ .../tests/factorize_test_irregular.Rout | 216 ++ FDboost.Rcheck/tests/factorize_test_regular.R | 111 + .../tests/factorize_test_regular.Rout | 145 + FDboost.Rcheck/tests/general_tests.R | 216 ++ FDboost.Rcheck/tests/general_tests.Rout | 290 ++ FDboost.Rcheck/tests/startup.Rs | 4 + FDboost_1.1-4.tar.gz | Bin 0 -> 3031135 bytes R/FDboost.R | 14 +- R/FDboostLSS.R | 18 +- R/constrainedX.R | 22 +- R/factorize.R | 2 +- R/methods.R | 4 +- docs/katex-auto.js | 14 + docs/lightswitch.js | 85 + docs/link.svg | 12 + docs/pkgdown.js | 162 + inst/CITATION | 16 +- man/FDboost.Rd | 14 +- man/FDboostLSS.Rd | 6 +- man/anisotropic_Kronecker.Rd | 22 +- man/cvrisk.FDboostLSS.Rd | 12 +- man/predict.FDboost.Rd | 4 +- man/predict.FDboost_fac.Rd | 2 +- 173 files changed, 40868 insertions(+), 66 deletions(-) create mode 100644 .codex create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/.codex create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/DESCRIPTION create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/NAMESPACE create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/NEWS.md create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost-package.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/FDboostLSS.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/aaa.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/baselearners.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/baselearnersX.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/bootstrapCIs.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/clr_functions.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/constrainedX.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/crossvalidation.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/factorize.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/hmatrix.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/methods.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/stabsel.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/R/utilityFunctions.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/build/vignette.rds create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/data/birthDistribution.RData create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/data/datalist create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/data/emotion.RData create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/data/fuelSubset.RData create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/data/viscosity.RData create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/docs/katex-auto.js create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/docs/lightswitch.js create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/docs/link.svg create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/docs/pkgdown.js create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/CITATION create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/CONTRIBUTIONS create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/analyze_results.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/readme.txt create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_FDboost.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_PlotModels.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_pffr.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_time.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/simfuns.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/analyze_results.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/boosting4.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/readme.txt create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost2.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost3.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost4.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_PlotModels.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr2.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr3.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/simUtils.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost-package.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/FDboostLSS.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost_fac-class.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/anisotropic_Kronecker.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/applyFolds.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/bbsc.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/bhistx.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/birthDistribution.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/bootstrapCI.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/bsignal.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/clr.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/coef.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/cvrisk.FDboostLSS.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/emotion.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/extract.blg.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/factorize.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/fitted.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/fuelSubset.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/funMRD.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/funMSE.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/funRsquared.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/funplot.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.hmatrix.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/grapes-Xc-grapes.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/hmatrix.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/integrationWeights.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/is.hmatrix.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/o_control.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/plot.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/plot.bootstrapCI.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/plot.validateFDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost_fac.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/residuals.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/reweightData.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/stabsel.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/sub-.hmatrix.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/subset_hmatrix.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/summary.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/truncateTime.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/update.FDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/validateFDboost.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/viscosity.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/man/wide2long.Rd create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_irregular.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_regular.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/tests/general_tests.R create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_canada.Rnw create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_fuel.Rnw create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_viscosity.Rnw create mode 100644 FDboost.Rcheck/00_pkg_src/FDboost/vignettes/density-on-scalar_birth.Rnw create mode 100644 FDboost.Rcheck/00check.log create mode 100644 FDboost.Rcheck/00install.out create mode 100644 FDboost.Rcheck/FDboost-Ex.R create mode 100644 FDboost.Rcheck/FDboost-Ex.Rout create mode 100644 FDboost.Rcheck/FDboost-Ex.pdf create mode 100644 FDboost.Rcheck/FDboost-manual.log create mode 100644 FDboost.Rcheck/FDboost-manual.pdf create mode 100644 FDboost.Rcheck/FDboost/CITATION create mode 100644 FDboost.Rcheck/FDboost/CONTRIBUTIONS create mode 100644 FDboost.Rcheck/FDboost/DESCRIPTION create mode 100644 FDboost.Rcheck/FDboost/INDEX create mode 100644 FDboost.Rcheck/FDboost/NAMESPACE create mode 100644 FDboost.Rcheck/FDboost/NEWS.md create mode 100644 FDboost.Rcheck/FDboost/R/FDboost create mode 100644 FDboost.Rcheck/FDboost/R/FDboost.rdb create mode 100644 FDboost.Rcheck/FDboost/R/FDboost.rdx create mode 100644 FDboost.Rcheck/FDboost/data/birthDistribution.RData create mode 100644 FDboost.Rcheck/FDboost/data/datalist create mode 100644 FDboost.Rcheck/FDboost/data/emotion.RData create mode 100644 FDboost.Rcheck/FDboost/data/fuelSubset.RData create mode 100644 FDboost.Rcheck/FDboost/data/viscosity.RData create mode 100644 FDboost.Rcheck/FDboost/help/AnIndex create mode 100644 FDboost.Rcheck/FDboost/help/FDboost.rdb create mode 100644 FDboost.Rcheck/FDboost/help/FDboost.rdx create mode 100644 FDboost.Rcheck/FDboost/help/aliases.rds create mode 100644 FDboost.Rcheck/FDboost/help/paths.rds create mode 100644 FDboost.Rcheck/FDboost/html/00Index.html create mode 100644 FDboost.Rcheck/FDboost/html/R.css create mode 100644 FDboost.Rcheck/FDboost/sim/analyze_results.R create mode 100644 FDboost.Rcheck/FDboost/sim/readme.txt create mode 100644 FDboost.Rcheck/FDboost/sim/run_FDboost.R create mode 100644 FDboost.Rcheck/FDboost/sim/run_PlotModels.R create mode 100644 FDboost.Rcheck/FDboost/sim/run_pffr.R create mode 100644 FDboost.Rcheck/FDboost/sim/run_time.R create mode 100644 FDboost.Rcheck/FDboost/sim/simfuns.R create mode 100644 FDboost.Rcheck/FDboost/simHist/analyze_results.R create mode 100644 FDboost.Rcheck/FDboost/simHist/boosting4.R create mode 100644 FDboost.Rcheck/FDboost/simHist/readme.txt create mode 100644 FDboost.Rcheck/FDboost/simHist/run_FDboost2.R create mode 100644 FDboost.Rcheck/FDboost/simHist/run_FDboost3.R create mode 100644 FDboost.Rcheck/FDboost/simHist/run_FDboost4.R create mode 100644 FDboost.Rcheck/FDboost/simHist/run_PlotModels.R create mode 100644 FDboost.Rcheck/FDboost/simHist/run_pffr2.R create mode 100644 FDboost.Rcheck/FDboost/simHist/run_pffr3.R create mode 100644 FDboost.Rcheck/FDboost/simHist/simUtils.R create mode 100644 FDboost.Rcheck/Rdlatex.log create mode 100644 FDboost.Rcheck/tests/Rplots.pdf create mode 100644 FDboost.Rcheck/tests/factorize_test_irregular.R create mode 100644 FDboost.Rcheck/tests/factorize_test_irregular.Rout create mode 100644 FDboost.Rcheck/tests/factorize_test_regular.R create mode 100644 FDboost.Rcheck/tests/factorize_test_regular.Rout create mode 100644 FDboost.Rcheck/tests/general_tests.R create mode 100644 FDboost.Rcheck/tests/general_tests.Rout create mode 100644 FDboost.Rcheck/tests/startup.Rs create mode 100644 FDboost_1.1-4.tar.gz create mode 100644 docs/katex-auto.js create mode 100644 docs/lightswitch.js create mode 100644 docs/link.svg create mode 100644 docs/pkgdown.js diff --git a/.codex b/.codex new file mode 100644 index 0000000..e69de29 diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/.codex b/FDboost.Rcheck/00_pkg_src/FDboost/.codex new file mode 100644 index 0000000..e69de29 diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/DESCRIPTION b/FDboost.Rcheck/00_pkg_src/FDboost/DESCRIPTION new file mode 100644 index 0000000..2ad3fa1 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/DESCRIPTION @@ -0,0 +1,45 @@ +Type: Package +Package: FDboost +Title: Boosting Functional Regression Models +Version: 1.1-4 +Date: 2026-03-24 +Authors@R: c( + person("Sarah", "Brockhaus", , "Sarah.Brockhaus@stat.uni-muenchen.de", role = "aut", + comment = c(ORCID = "0000-0001-9484-7488")), + person("David", "Ruegamer", , "david.ruegamer@gmail.com", role = c("aut", "cre"), + comment = c(ORCID = "0000-0002-8772-9202")), + person("Almond", "Stoecker", , "almond.stoecker@hu-berlin.de", role = "aut", + comment = c(ORCID = "0000-0001-9160-2397")), + person("Torsten", "Hothorn", role = "ctb", + comment = c(ORCID = "0000-0001-8301-0471")), + person("with contributions by many others", "(see inst/CONTRIBUTIONS)", role = "ctb") + ) +Description: Regression models for functional data, i.e., + scalar-on-function, function-on-scalar and function-on-function + regression models, are fitted by a component-wise gradient boosting + algorithm. For a manual on how to use 'FDboost', see Brockhaus, + Ruegamer, Greven (2017) . +License: GPL-2 +URL: https://github.com/boost-R/FDboost +BugReports: https://github.com/boost-R/FDboost/issues +Depends: mboost (>= 2.9-0), R (>= 3.5.0) +Imports: gamboostLSS (>= 2.0-0), graphics, grDevices, MASS, Matrix, + methods, mgcv, stabs, stats, utils, zoo +Suggests: fda, fields, ggplot2, knitr, mapdata, maps, refund, testthat +VignetteBuilder: knitr +Encoding: UTF-8 +Packaged: 2026-04-12 16:21:02 UTC; david +RoxygenNote: 7.3.2 +Collate: 'aaa.R' 'FDboost-package.R' 'FDboost.R' 'baselearners.R' + 'baselearnersX.R' 'bootstrapCIs.R' 'clr_functions.R' + 'constrainedX.R' 'crossvalidation.R' 'factorize.R' + 'FDboostLSS.R' 'hmatrix.R' 'methods.R' 'stabsel.R' + 'utilityFunctions.R' +NeedsCompilation: no +Author: Sarah Brockhaus [aut] (ORCID: ), + David Ruegamer [aut, cre] (ORCID: + ), + Almond Stoecker [aut] (ORCID: ), + Torsten Hothorn [ctb] (ORCID: ), + with contributions by many others (see inst/CONTRIBUTIONS) [ctb] +Maintainer: David Ruegamer diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/NAMESPACE b/FDboost.Rcheck/00_pkg_src/FDboost/NAMESPACE new file mode 100644 index 0000000..0b1790e --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/NAMESPACE @@ -0,0 +1,128 @@ +# Generated by roxygen2: do not edit by hand + +S3method("[",hmatrix) +S3method(coef,FDboost) +S3method(cvrisk,FDboost) +S3method(cvrisk,FDboostLSS) +S3method(factorize,FDboost) +S3method(fitted,FDboost) +S3method(getArgvals,hmatrix) +S3method(getArgvalsLab,hmatrix) +S3method(getId,hmatrix) +S3method(getIdLab,hmatrix) +S3method(getTime,hmatrix) +S3method(getTimeLab,hmatrix) +S3method(getX,hmatrix) +S3method(getXLab,hmatrix) +S3method(mstop,validateFDboost) +S3method(plot,FDboost) +S3method(plot,bootstrapCI) +S3method(plot,validateFDboost) +S3method(predict,FDboost) +S3method(predict,FDboost_fac) +S3method(print,FDboost) +S3method(print,bootstrapCI) +S3method(print,validateFDboost) +S3method(residuals,FDboost) +S3method(stabsel,FDboost) +S3method(summary,FDboost) +S3method(update,FDboost) +export("%A%") +export("%A0%") +export("%Xa0%") +export("%Xc%") +export(FDboost) +export(FDboostLSS) +export(applyFolds) +export(bbsc) +export(bconcurrent) +export(bfpc) +export(bhist) +export(bhistx) +export(bolsc) +export(bootstrapCI) +export(brandomc) +export(bsignal) +export(clr) +export(cvLong) +export(cvMa) +export(factorize) +export(funMRD) +export(funMSE) +export(funRsquared) +export(funplot) +export(getArgvals) +export(getArgvalsLab) +export(getId) +export(getIdLab) +export(getTime) +export(getTimeLab) +export(getX) +export(getXLab) +export(hmatrix) +export(integrationWeights) +export(integrationWeightsLeft) +export(is.hmatrix) +export(o_control) +export(plotPredCoef) +export(plotPredicted) +export(plotResiduals) +export(reweightData) +export(subset_hmatrix) +export(truncateTime) +export(validateFDboost) +export(wide2long) +exportClasses(FDboost_fac) +import(Matrix) +import(mboost) +import(methods) +importFrom(MASS,Null) +importFrom(MASS,ginv) +importFrom(Matrix,rankMatrix) +importFrom(gamboostLSS,GaussianLSS) +importFrom(gamboostLSS,GaussianMu) +importFrom(gamboostLSS,GaussianSigma) +importFrom(gamboostLSS,cvrisk.mboostLSS) +importFrom(gamboostLSS,make.grid) +importFrom(gamboostLSS,mboostLSS_fit) +importFrom(grDevices,heat.colors) +importFrom(grDevices,rgb) +importFrom(graphics,abline) +importFrom(graphics,barplot) +importFrom(graphics,contour) +importFrom(graphics,legend) +importFrom(graphics,lines) +importFrom(graphics,matplot) +importFrom(graphics,par) +importFrom(graphics,persp) +importFrom(graphics,plot) +importFrom(graphics,points) +importFrom(methods,setOldClass) +importFrom(mgcv,gam) +importFrom(mgcv,s) +importFrom(parallel,mclapply) +importFrom(splines,bs) +importFrom(splines,splineDesign) +importFrom(stabs,stabsel) +importFrom(stabs,stabsel_parameters) +importFrom(stats,approx) +importFrom(stats,as.formula) +importFrom(stats,coef) +importFrom(stats,complete.cases) +importFrom(stats,fitted) +importFrom(stats,formula) +importFrom(stats,lm) +importFrom(stats,median) +importFrom(stats,model.matrix) +importFrom(stats,model.weights) +importFrom(stats,na.omit) +importFrom(stats,predict) +importFrom(stats,quantile) +importFrom(stats,sd) +importFrom(stats,setNames) +importFrom(stats,terms.formula) +importFrom(stats,variable.names) +importFrom(utils,getS3method) +importFrom(utils,packageDescription) +importFrom(utils,relist) +importFrom(zoo,na.locf) diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/NEWS.md b/FDboost.Rcheck/00_pkg_src/FDboost/NEWS.md new file mode 100644 index 0000000..b372b57 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/NEWS.md @@ -0,0 +1,232 @@ +# FDboost 1.1-4 (2026-03-24) + +## Bug fixes + +- Suppressed deprecation warnings from `refund::pffrSim()` in examples to keep checks clean with recent `refund` versions. +- Stabilized `tests/general_tests.R` by forcing serial evaluation (`mc.cores = 1`) to avoid parallel `applyFolds()` crashes on some check platforms. + +# FDboost 1.1.0 (2022-07-12) + +## Miscellaneous + +- Anisotropic tensor-product operators `b1 %A0% b2` and `b1 %Xa0% b2` now also work when `lambda` is specified for `b1` and `df` is specified for `b2` (or vice versa). + +## New features + +- New function `clr()` to compute the centered-log-ratio transform and its inverse for density-on-scalar regression in Bayes spaces. +- New dataset `birthDistribution`. +- New vignette illustrating density-on-function regression on the `birthDistribution` data. +- Function `factorize()` added for tensor-product factorization of estimated effects or models. + +# FDboost 0.3.4 (2020-08-31) + +## Bug fixes + +- Fix `predict()` for `bsignal()` with `newdata` and the functional covariate given as a numeric matrix, raised in [#17](https://github.com/boost-R/FDboost/issues/17). +- Deprecated argument `LINPACK` in `solve()` removed. + +# FDboost 0.3.3 (2020-06-13) + +## New features + +- It is now possible to specify several time variables as well as factor time variables in the `timeformula`. This feature is needed for the manifoldboost package. + +## Miscellaneous + +- The function `stabsel.FDboost()` now uses `applyFolds()` instead of `validateFDboost()` to do cross-validation with recomputation of the smooth offset. This is only relevant for models with a functional response. This will change results if the model contains base-learners like `bbsc()` or `bolsc()`, as `applyFolds()` also recomputes the Z-matrix for those base-learners. + +## Bug fixes + +- Adapted functions `integrationWeights()` and `integrationWeightsLeft()` for unsorted time variables. +- Changed code in `predict.FDboost()` such that interaction effects of two functional covariates like `bsignal() %X% bsignal()` can be predicted with new data. +- Adapt FDboost to R 4.0.1 by explicitly using the first entry of `dots$aggregate` (i.e., `dots$aggregate[1] != "sum"`) in `predict.FDboost()` so that it also works with the default, where `aggregate` is a vector of length 3 and later only the first argument is used via `match.arg()`. + +# FDboost 0.3.2 (2018-08-04) + +## Bug fixes + +- Deprecated argument `corrected` in `cvrisk()` removed. + +# FDboost 0.3.1 (2018-05-10) + +## Bug fixes + +- `cvrisk()` has by default adequate folds for a noncyclic fitted FDboostLSS model, see [#14](https://github.com/boost-R/FDboost/issues/14). + +## Miscellaneous + +- Replaced `cBind()` (which is deprecated) with `cbind()`. + +# FDboost 0.3.0 (2017-05-31) + +## User-visible changes + +- New function `bootstrapCI()` to compute bootstrapped coefficients. +- Added the dataset `emotion` containing EEG and EMG measures under different experimental conditions. +- With scalar response, `FDboost()` now works with the response as a vector (instead of a 1-row matrix); thus, `fitted()` and `predict()` return a vector. + +## Bug fixes + +- `update.FDboost()` now works with a scalar response. +- `FDboost()` works with family `Binomial(type = "glm")`, see [#1](https://github.com/boost-R/FDboost/issues/1). +- `applyFolds()` works for factor response, see [#7](https://github.com/boost-R/FDboost/issues/7). +- `cvLong()` and `cvMA()` return a matrix for only one resampling fold with `B = 1` (proposed by Almond Stoecker). + +## Miscellaneous + +- Adapt `FDboost` to `mboost` 2.8-0, which allows for `mstop = 0`. +- Restructure `FDboostLSS()` such that it calls `mboostLSS_fit()` from `gamboostLSS` 2.0-0. +- In `FDboost`, set `options("mboost_indexmin" = +Inf)` to disable internal use of ties in model fitting, as this breaks some methods for models with responses in long format and for models containing `bhistx()`, see [#10](https://github.com/boost-R/FDboost/issues/10). +- Deprecated `validateFDboost()`, use `applyFolds()` and `bootstrapCI()` instead. + +# FDboost 0.2.0 (2016-05-26) + +## User-visible changes + +- Added function `applyFolds()` to compute the optimal stopping iteration. + +## Bug fixes + +- Allows for extrapolation in `predict()` with `bbsc()`. + +# FDboost 0.1.2 (2016-04-22) + +## Bug fixes + +- Fixed a bug in `bolsc()`: correctly use the index in `bolsc()`/`bbsc()`. Previously, each observation was used only once for computing Z. + +## User-visible changes + +- Added function `%Xa0%` that computes a row-tensor product of two base-learners where the penalty in one direction is zero. +- Added function `reweightData()` that computes the data for Bootstrap or cross-validation folds. +- Added function `stabsel.FDboost()` that refits the smooth offset in each fold. +- Added argument `fun` to `validateFDboost()`. +- Added `update.FDboost()` that overwrites `update.mboost()`. + +## Miscellaneous + +- `FDboost()` works with `family = Binomial()`. + +# FDboost 0.1.1 (2016-04-06) + +## Bug fixes + +- Fixed `oobpred` in `validateFDboost()` for irregular response and resampling at the curve level so that `plot.validateFDboost()` works for that case. +- Fixed scope of formula in `FDboost()`: now the formula given to `mboost()` within `FDboost()` uses the variables in the environment of the formula specified in `FDboost()`. + +## Miscellaneous + +- `plot.FDboost()` works for more effects, especially for effects like `bolsc() %X% bhistx()`. + +# FDboost 0.1.0 (2016-03-10) + +## User-visible changes + +- New operator `%A0%` for Kronecker product of two base-learners with an anisotropic penalty for the special case where `lambda1` or `lambda2` is zero. +- The base-learner `bbsc()` can be used with `center = TRUE` (derived by Almond Stoecker). +- In `FDboostLSS()`, a list of one-sided formulas can be specified for `timeformula`. + +## Bug fixes + +- `FDboostLSS()` works with `families = GammaLSS()`. + +## Miscellaneous + +- Operator `%A%` uses weights in the model call. This only works correctly for weights on the level of `blg1` and `blg2` (same as weights on rows and columns of the response matrix). +- Calls to internal functions of `mboost` are done using `mboost_intern()`. +- `hyper_olsc()` is based on `hyper_ols()` from `mboost`. + +# FDboost 0.0.17 (2016-02-25) + +## User-visible changes + +- Changed the operator `%Xc%` for the row tensor product of two scalar covariates. The design matrix of the interaction effects is constrained such that the interaction is centered around the intercept and around the two main effects of the scalar covariates (experimental!). Use, for example, `bols(x1) %Xc% bols(x2)`. + +# FDboost 0.0.16 (2016-02-22) + +## User-visible changes + +- Changed the operator `%Xc%` for row tensor product where the sum-to-zero constraint is applied to the design matrix resulting from the row-tensor product (experimental!). Specifically, an intercept-column is first added, and then the sum-to-zero constraint is applied. Use, for example, `bolsc(x1) %Xc% bolsc(x2)`. +- The functional index `s` is now used as `argsvals` in the FPCA conducted within `bfpc()`. + +# FDboost 0.0.15 (2016-02-12) + +## User-visible changes + +- New operator `%A%` that implies anisotropic penalties for differently specified `df` in the two base-learners. + +## Bug fixes + +- No penalty is applied in the direction of `ONEx` in a smooth intercept specified implicitly by `~1`, for example, `bols(ONEx, intercept=FALSE, df=1) %A% bbs(time)`. + +## Miscellaneous + +- Effects containing `%A%` or `%O%` are not expanded with the `timeformula`, allowing for different effects over time in the model. + +# FDboost 0.0.14 (2016-02-11) + +## User-visible changes + +- Added the function `FDboostLSS()` to fit GAMLSS models with functional data using R-package `gamboostLSS`. +- New operator `%Xc%` for row tensor product where the sum-to-zero constraint is applied to the design matrix resulting from the row-tensor product (experimental!). +- Allowed `newdata` to be a list in `predict.FDboost()` when used with signal base-learners. +- Expanded `coef.FDboost()` so that it works for 3-dimensional tensor products of the form `bhistx() %X% bolsc() %X% bolsc()` (with David Ruegamer). +- Added a new possibility for scalar-on-function regression: if `timeformula=NULL`, no Kronecker product with `1` is used, which changes the penalty (otherwise, the direction of `1` would also be penalized). + +## Miscellaneous + +- New dependency on R-package `gamboostLSS`. +- Removed dependency on R-package `MASS`. +- Used the argument `prediction` in the internal computation of the base-learners (work in progress). +- Throw an error if `timeLab` of the `hmatrix`-object in `bhistx()` is not equal to the time variable in `timeformula`. + +# FDboost 0.0.13 (2015-11-17) + +## User-visible changes + +- In function `FDboost()`, the offset is supplied differently. For a scalar offset, use `offset = "scalar"`. The default remains `offset = NULL`. +- `predict.FDboost()` has a new argument `toFDboost` (logical). +- `fitted.FDboost()` has argument `toFDboost` explicitly (not only via `...`). +- New base-learner `bhistx()`, especially suited for effects used with `%X%`, e.g., `bhistx() %X% bolsc()`. +- `coef.FDboost()` and `plot.FDboost()` now handle effects like `bhistx() %X% bolsc()`. +- For `predict.FDboost()` with effects `bhistx()` and newdata, the latest `mboostPatch` is necessary. + +## Bug fixes + +- The check for the necessity of a smooth offset works for missing values in a regular response (spotted by Tore Erdmann). + +# FDboost 0.0.12 (2015-09-15) + +- Internal experimental version. + +# FDboost 0.0.11 (2015-06-01) + +## User-visible changes + +- `integrationWeights()` now gives equal weights for regular grids. +- New base-learner `bfpc()` for a functional covariate where both the functional covariate and the coefficient are expanded using fPCA (experimental feature!). Only works for regularly observed functional covariate. + +## Bug fixes + +- `coef.FDboost()` only works for `bhist()` if the time variable is the same in the timeformula and in `bhist()`. +- `predict.FDboost()` now checks that only `type = "link"` can be predicted for newdata. + +# FDboost 0.0.10 (2015-04-16) + +## User-visible changes + +- Changed the default difference penalties to first-order difference (`differences = 1`), improving identifiability. +- New method `cvrisk.FDboost()` that uses (by default) sampling on the levels of curves, which is important for functional responses. +- Reorganized documentation of `cvrisk()` and `validateFDboost()`. +- In `bhist()`, an effect can be standardized. + +## Miscellaneous + +- Added a `CITATION` file. +- Uses `mboost 2.4-2`, which exports all important functions. + +## Bug fixes + +- `main` argument is always passed in `plot.FDboost()`. +- `bhist()` and `bconcurrent()` now work for equal `time` and `s`. +- `predict.FDboost()` works with tensor-product base-learners like `bl1 %X% bl2`. diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost-package.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost-package.R new file mode 100644 index 0000000..624c794 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost-package.R @@ -0,0 +1,87 @@ +################################################################################# +#' FDboost: Boosting Functional Regression Models +#' +#' @description +#' Regression models for functional data, i.e., scalar-on-function, +#' function-on-scalar and function-on-function regression models, are fitted +#' by a component-wise gradient boosting algorithm. +#' +#' @details +#' This package is intended to fit regression models with functional variables. +#' It is possible to fit models with functional response and/or functional covariates, +#' resulting in scalar-on-function, function-on-scalar and function-on-function regression. +#' Furthermore, the package can be used to fit density-on-scalar regression models. +#' Details on the functional regression models that can be fitted with \pkg{FDboost} +#' can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). +#' A hands-on tutorial for the package can be found +#' in Brockhaus, Ruegamer and Greven (2020), see . +#' For density-on-scalar regression models see Maier et al. (2021). +#' +#' Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on +#' the R package \pkg{mboost} (Hothorn et al., 2017). +#' A comprehensive tutorial to \pkg{mboost} is given in Hofner et al. (2014). +#' +#' The main fitting function is \code{\link{FDboost}}. +#' The model complexity is controlled by the number of boosting iterations (mstop). +#' Like the fitting procedures in \pkg{mboost}, the function \code{FDboost} DOES NOT +#' select an appropriate stopping iteration. This must be chosen by the user. +#' The user can determine an adequate stopping iteration by resampling methods like +#' cross-validation or bootstrap. +#' This can be done using the function \code{\link{applyFolds}}. +#' +#' Aside from common effect surface plots, tensor product factorization via the +#' function \code{\link{factorize}} presents an alternative tool for visualization +#' of estimated effects for non-linear function-on-scalar models +#' (Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). +#' After factorization, effects are decomposed multiple scalar effects into +#' functional main effect directions, which can be separately plotted allowing to +#' visualize more complex effect structures. +#' +#' +#' @references +#' Brockhaus, S., Ruegamer, D. and Greven, S. (2020): +#' Boosting Functional Regression Models with FDboost. +#' Journal of Statistical Software, 94(10), 1–50. +#' +#' +#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +#' The functional linear array model. Statistical Modelling, 15(3), 279-300. +#' +#' Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +#' Boosting flexible functional regression models with a high number of functional historical effects, +#' Statistics and Computing, 27(4), 913-926. +#' +#' Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): +#' Signal regression models for location, scale and shape with an application to stock returns. +#' Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 665-686. +#' +#' Hothorn T., Buehlmann P., Kneib T., Schmid M., and Hofner B. (2017). mboost: Model-Based Boosting, +#' R package version 2.8-1, \url{https://cran.r-project.org/package=mboost} +#' +#' Hofner, B., Mayr, A., Robinzonov, N., Schmid, M. (2014). Model-based Boosting in R: +#' A Hands-on Tutorial Using the R Package mboost. Computational Statistics, 29, 3-35. +#' \url{https://cran.r-project.org/package=mboost/vignettes/mboost_tutorial.pdf} +#' +#' Maier, E.-M., Stoecker, A., Fitzenberger, B., Greven, S. (2021): +#' Additive Density-on-Scalar Regression in Bayes Hilbert Spaces with an Application to Gender Economics. +#' arXiv preprint arXiv:2110.11771. +#' +#' Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). +#' Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. +#' Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. +#' +#' Stoecker A., Steyer L., Greven S. (2022): +#' Functional Additive Models on Manifolds of Planar Shapes and Forms. +#' arXiv preprint arXiv:2109.02624. +#' +#' @author +#' Sarah Brockhaus, David Ruegamer and Almond Stoecker +#' +#' @aliases FDboost_package package-FDboost FDboost-package +#' +#' @seealso +#' \code{\link{FDboost}} for the main fitting function and +#' \code{\link{applyFolds}} for model tuning via resampling methods. +#' +"_PACKAGE" + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost.R new file mode 100644 index 0000000..16b68a6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboost.R @@ -0,0 +1,1240 @@ +################################################################################# +#' Model-based Gradient Boosting for Functional Response +#' +#' Gradient boosting for optimizing arbitrary loss functions, where component-wise models +#' are utilized as base-learners in the case of functional responses. +#' Scalar responses are treated as the special case where each functional response has +#' only one observation. +#' This function is a wrapper for \code{mboost}'s \code{\link[mboost]{mboost}} and its +#' siblings to fit models of the general form +#' \deqn{\xi(Y_i(t) | X_i = x_i) = \sum_{j} h_j(x_i, t), i = 1, ..., N,} +#' with a functional (but not necessarily continuous) response \eqn{Y(t)}, +#' transformation function \eqn{\xi}, e.g., the expectation, the median or some quantile, +#' and partial effects \eqn{h_j(x_i, t)} depending on covariates \eqn{x_i} +#' and the current index of the response \eqn{t}. The index of the response can +#' be for example time. +#' Possible effects are, e.g., a smooth intercept \eqn{\beta_0(t)}, +#' a linear functional effect \eqn{\int x_i(s)\beta(s,t)ds}, +#' potentially with integration limits depending on \eqn{t}, +#' smooth and linear effects of scalar covariates \eqn{f(z_i,t)} or \eqn{z_i \beta(t)}. +#' A hands-on tutorial for the package can be found at . +#' +#' @param formula a symbolic description of the model to be fit. +#' Per default no intercept is added, only a smooth offset, see argument \code{offset}. +#' To add a smooth intercept, use 1, e.g., \code{y ~ 1} for a pure intercept model. +#' @param timeformula one-sided formula for the specification of the effect over the index of the response. +#' For functional response \eqn{Y_i(t)} typically use \code{~ bbs(t)} to obtain smooth +#' effects over \eqn{t}. +#' In the limiting case of \eqn{Y_i} being a scalar response, +#' use \code{~ bols(1)}, which sets up a base-learner for the scalar 1. +#' Or use \code{timeformula = NULL}, then the scalar response is treated as scalar. +#' @param id defaults to NULL which means that all response trajectories are observed +#' on a common grid allowing to represent the response as a matrix. +#' If the response is given in long format for observation-specific grids, \code{id} +#' contains the information which observations belong to the same trajectory and must +#' be supplied as a formula, \code{~ nameid}, where the variable \code{nameid} should +#' contain integers 1, 2, 3, ..., N. +#' @param numInt integration scheme for the integration of the loss function. +#' One of \code{c("equal", "Riemann")} meaning equal weights of 1 or +#' trapezoidal Riemann weights. +#' Alternatively a vector of length \code{ncol(response)} containing +#' positive weights can be specified. +#' @param data a data frame or list containing the variables in the model. +#' @param weights only for internal use to specify resampling weights; +#' per default all weights are equal to 1. +#' @param offset_control parameters for the estimation of the offset, +#' defaults to \code{o_control()}, see \code{\link{o_control}}. +#' @param offset a numeric vector to be used as offset over the index of the response (optional). +#' If no offset is specified, per default \code{offset = NULL} which means that a +#' smooth time-specific offset is computed and used before the model fit to center the data. +#' If you do not want to use a time-specific offset, set \code{offset = "scalar"} to get an overall scalar offset, +#' like in \code{mboost}. +#' @param check0 logical, for response in matrix form, i.e. response that is observed on a common grid, +#' check the fitted effects for the sum-to-zero constraint +#' \eqn{h_j(x_i)(t) = 0} for all \eqn{t} and give a warning if it is not fulfilled. Defaults to \code{FALSE}. +#' @param ... additional arguments passed to \code{\link[mboost]{mboost}}, +#' including, \code{family} and \code{control}. +#' +#' @details In matrix representation of functional response and covariates each row +#' represents one functional observation, e.g., \code{Y[i,t_g]} corresponds to \eqn{Y_i(t_g)}, +#' giving a by matrix. +#' For the model fit, the matrix of the functional +#' response evaluations \eqn{Y_i(t_g)} are stacked internally into one long vector. +#' +#' If it is possible to represent the model as a generalized linear array model +#' (Currie et al., 2006), the array structure is used for an efficient implementation, +#' see \code{\link[mboost]{mboost}}. This is only possible if the design +#' matrix can be written as the Kronecker product of two marginal design +#' matrices yielding a functional linear array model (FLAM), +#' see Brockhaus et al. (2015) for details. +#' The Kronecker product of two marginal bases is implemented in R-package mboost +#' in the function \code{\%O\%}, see \code{\link[mboost:baselearners]{\%O\%}}. +#' +#' When \code{\%O\%} is called with a specification of \code{df} in both base-learners, +#' e.g., \code{bbs(x1, df = df1) \%O\% bbs(t, df = df2)}, the global \code{df} for the +#' Kroneckered base-learner is computed as \code{df = df1 * df2}. +#' And thus the penalty has only one smoothness parameter lambda resulting in an isotropic penalty. +#' A Kronecker product with anisotropic penalty is \code{\%A\%}, allowing for different +#' amount of smoothness in the two directions, see \code{\link{\%A\%}}. +#' If the formula contains base-learners connected by \code{\%O\%}, \code{\%A\%} or \code{\%A0\%}, +#' those effects are not expanded with \code{timeformula}, allowing for model specifications +#' with different effects in time-direction. +#' +#' If the response is observed on curve-specific grids it must be supplied +#' as a vector in long format and the argument \code{id} has +#' to be specified (as formula!) to define which observations belong to which curve. +#' In this case the base-learners are built as row tensor-products of marginal base-learners, +#' see Scheipl et al. (2015) and Brockhaus et al. (2017), for details on how to set up the effects. +#' The row tensor product of two marginal bases is implemented in R-package mboost +#' in the function \code{\%X\%}, see \code{\link[mboost:baselearners]{\%X\%}}. +#' +#' A scalar response can be seen as special case of a functional response with only +#' one time-point, and thus it can be represented as FLAM with basis 1 in +#' time-direction, use \code{timeformula = ~bols(1)}. In this case, a penalty in the +#' time-direction is used, see Brockhaus et al. (2015) for details. +#' Alternatively, the scalar response is fitted as scalar response, like in the function +#' \code{\link[mboost]{mboost}} in package mboost. +#' The advantage of using \code{FDboost} in that case +#' is that methods for the functional base-learners are available, e.g., \code{plot}. +#' +#' The desired regression type is specified by the \code{family}-argument, +#' see the help-page of \code{\link[mboost]{mboost}}. For example a mean regression model is obtained by +#' \code{family = Gaussian()} which is the default or median regression +#' by \code{family = QuantReg()}; +#' see \code{\link[mboost]{Family}} for a list of implemented families. +#' +#' With \code{FDboost} the following covariate effects can be estimated by specifying +#' the following effects in the \code{formula} +#' (similar to function \code{\link[refund]{pffr}} +#' in R-package refund. +#' The \code{timeformula} is used to expand the effects in \code{t}-direction. +#' \itemize{ +#' \item Linear functional effect of scalar (numeric or factor) covariate \eqn{z} that varies +#' smoothly over \eqn{t}, i.e. \eqn{z_i \beta(t)}, specified as +#' \code{bolsc(z)}, see \code{\link{bolsc}}, +#' or for a group effect with mean zero use \code{brandomc(z)}. +#' \item Nonlinear effects of a scalar covariate that vary smoothly over \eqn{t}, +#' i.e. \eqn{f(z_i, t)}, specified as \code{bbsc(z)}, +#' see \code{\link{bbsc}}. +#' \item (Nonlinear) effects of scalar covariates that are constant +#' over \eqn{t}, e.g., \eqn{f(z_i)}, specified as \code{c(bbs(z))}, +#' or \eqn{\beta z_i}, specified as \code{c(bols(z))}. +#' \item Interaction terms between two scalar covariates, e.g., \eqn{z_i1 zi2 \beta(t)}, +#' are specified as \code{bols(z1) \%Xc\% bols(z2)} and +#' an interaction \eqn{z_i1 f(zi2, t)} as \code{bols(z1) \%Xc\% bbs(z2)}, as +#' \code{\%Xc\%} applies the sum-to-zero constraint to the desgin matrix of the tensor product +#' built by \code{\%Xc\%}, see \code{\link{\%Xc\%}}. +#' \item Function-on-function regression terms of functional covariates \code{x}, +#' e.g., \eqn{\int x_i(s)\beta(s,t)ds}, specified as \code{bsignal(x, s = s)}, +#' using P-splines, see \code{\link{bsignal}}. +#' Terms given by \code{\link{bfpc}} provide FPC-based effects of functional +#' covariates, see \code{\link{bfpc}}. +#' \item Function-on-function regression terms of functional covariates \code{x} +#' with integration limits \eqn{[l(t), u(t)]} depending on \eqn{t}, +#' e.g., \eqn{\int_[l(t), u(t)] x_i(s)\beta(s,t)ds}, specified as +#' \code{bhist(x, s = s, time = t, limits)}. The \code{limits} argument defaults to +#' \code{"s<=t"} which yields a historical effect with limits \eqn{[min(t),t]}, +#' see \code{\link{bhist}}. +#' \item Concurrent effects of functional covariates \code{x} +#' measured on the same grid as the response, i.e., \eqn{x_i(s)\beta(t)}, +#' are specified as \code{bconcurrent(x, s = s, time = t)}, +#' see \code{\link{bconcurrent}}. +#' \item Interaction effects can be estimated as tensor product smooth, e.g., +#' \eqn{ z \int x_i(s)\beta(s,t)ds} as \code{bsignal(x, s = s) \%X\% bolsc(z)} +#' \item For interaction effects with historical functional effects, e.g., +#' \eqn{ z_i \int_[l(t),u(t)] x_i(s)\beta(s,t)ds} the base-learner +#' \code{bhistx} should be used instead of \code{bhist}, +#' e.g., \code{bhistx(x, limits) \%X\% bolsc(z)}, see \code{\link{bhistx}}. +#' \item Generally, the \code{c()}-notation can be used to get effects that are +#' constant over the index of the functional response. +#' \item If the \code{formula} in \code{FDboost} contains base-learners connected by +#' \code{\%O\%}, \code{\%A\%} or \code{\%A0\%}, those effects are not expanded with \code{timeformula}, +#' allowing for model specifications with different effects in time-direction. +#' } +#' +#' In order to obtain a fair selection of base-learners, the same degrees of freedom (df) +#' should be specified for all baselearners. If the number of df differs among the base-learners, +#' the selection is biased towards more flexible base-learners with higher df as they are more +#' likely to yield larger improvements of the fit. It is recommended to use +#' a rather small number of df for all base-learners. +#' It is not possible to specify df larger than the rank of the design matrix. +#' For base-learners with rank-deficient penalty, it is not possible to specify df smaller than the +#' rank of the null space of the penalty (e.g., in \code{bbs} unpenalized part of P-splines). +#' The df of the base-learners in an FDboost-object can be checked using \code{extract(object, "df")}, +#' see \code{\link[mboost:methods]{extract}}. +#' +#' The most important tuning parameter of component-wise gradient boosting +#' is the number of boosting iterations. It is recommended to use the number of +#' boosting iterations as only tuning parameter, +#' fixing the step-length at a small value (e.g., nu = 0.1). +#' Note that the default number of boosting iterations is 100 which is arbitrary and in most +#' cases not adequate (the optimal number of boosting iterations can considerably exceed 100). +#' The optimal stopping iteration can be determined by resampling methods like +#' cross-validation or bootstrapping, see the function \code{\link{cvrisk.FDboost}} which searches +#' the optimal stopping iteration on a grid, which in many cases has to be extended. +#' +#' @return An object of class \code{FDboost} that inherits from \code{mboost}. +#' Special \code{\link{predict.FDboost}}, \code{\link{coef.FDboost}} and +#' \code{\link{plot.FDboost}} methods are available. +#' The methods of \code{\link[mboost]{mboost}} are available as well, +#' e.g., \code{\link[mboost:methods]{extract}}. +#' The \code{FDboost}-object is a named list containing: +#' \item{...}{all elements of an \code{mboost}-object} +#' \item{yname}{the name of the response} +#' \item{ydim}{dimension of the response matrix, if the response is represented as such} +#' \item{yind}{the observation (time-)points of the response, i.e. the evaluation points, +#' with its name as attribute} +#' \item{data}{the data that was used for the model fit} +#' \item{id}{the id variable of the response} +#' \item{predictOffset}{the function to predict the smooth offset} +#' \item{offsetFDboost}{offset as specified in call to FDboost} +#' \item{offsetMboost}{offset as given to mboost} +#' \item{call}{the call to \code{FDboost}} +#' \item{callEval}{the evaluated function call to \code{FDboost} without data} +#' \item{numInt}{value of argument \code{numInt} determining the numerical integration scheme} +#' \item{timeformula}{the time-formula} +#' \item{formulaFDboost}{the formula with which \code{FDboost} was called} +#' \item{formulaMboost}{the formula with which \code{mboost} was called within \code{FDboost}} +#' +#' @author Sarah Brockhaus, Torsten Hothorn +#' +#' @seealso Note that \link{FDboost} calls \code{\link[mboost]{mboost}} directly. +#' See, e.g., \code{\link[FDboost]{bsignal}} and \code{\link[FDboost]{bbsc}} +#' for possible base-learners. +#' +#' @keywords models regression nonlinear smooth +#' +#' @references +#' Brockhaus, S., Ruegamer, D. and Greven, S. (2017): +#' Boosting Functional Regression Models with FDboost. +#' +#' +#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +#' The functional linear array model. Statistical Modelling, 15(3), 279-300. +#' +#' Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +#' Boosting flexible functional regression models with a high number of functional historical effects, +#' Statistics and Computing, 27(4), 913-926. +#' +#' Currie, I.D., Durban, M. and Eilers P.H.C. (2006): +#' Generalized linear array models with applications to multidimensional smoothing. +#' Journal of the Royal Statistical Society, Series B-Statistical Methodology, 68(2), 259-280. +#' +#' Scheipl, F., Staicu, A.-M. and Greven, S. (2015): +#' Functional additive mixed models, Journal of Computational and Graphical Statistics, 24(2), 477-501. +#' +#' @examples +#' ######## Example for function-on-scalar-regression +#' data("viscosity", package = "FDboost") +#' ## set time-interval that should be modeled +#' interval <- "101" +#' +#' ## model time until "interval" and take log() of viscosity +#' end <- which(viscosity$timeAll == as.numeric(interval)) +#' viscosity$vis <- log(viscosity$visAll[,1:end]) +#' viscosity$time <- viscosity$timeAll[1:end] +#' # with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) +#' +#' ## fit median regression model with 100 boosting iterations, +#' ## step-length 0.4 and smooth time-specific offset +#' ## the factors are coded such that the effects are zero for each timepoint t +#' ## no integration weights are used! +#' mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df = 2) + bolsc(T_A, df = 2), +#' timeformula = ~ bbs(time, df = 4), +#' numInt = "equal", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 9), +#' data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +#' +#' \donttest{ +#' #### find optimal mstop over 5-fold bootstrap, small number of folds for example +#' #### do the resampling on the level of curves +#' +#' ## possibility 1: smooth offset and transformation matrices are refitted +#' set.seed(123) +#' appl1 <- applyFolds(mod1, folds = cv(rep(1, length(unique(mod1$id))), B = 5), +#' grid = 1:500) +#' ## plot(appl1) +#' mstop(appl1) +#' mod1[mstop(appl1)] +#' +#' ## possibility 2: smooth offset is refitted, +#' ## computes oob-risk and the estimated coefficients on the folds +#' set.seed(123) +#' val1 <- validateFDboost(mod1, folds = cv(rep(1, length(unique(mod1$id))), B = 5), +#' grid = 1:500) +#' ## plot(val1) +#' mstop(val1) +#' mod1[mstop(val1)] +#' +#' ## possibility 3: very efficient +#' ## using the function cvrisk; be careful to do the resampling on the level of curves +#' folds1 <- cvLong(id = mod1$id, weights = model.weights(mod1), B = 5) +#' cvm1 <- cvrisk(mod1, folds = folds1, grid = 1:500) +#' ## plot(cvm1) +#' mstop(cvm1) +#' +#' ## look at the model +#' summary(mod1) +#' coef(mod1) +#' plot(mod1) +#' plotPredicted(mod1, lwdPred = 2) +#' } +#' +#' ######## Example for scalar-on-function-regression +#' data("fuelSubset", package = "FDboost") +#' +#' ## center the functional covariates per observed wavelength +#' fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) +#' fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) +#' +#' ## to make mboost:::df2lambda() happy (all design matrix entries < 10) +#' ## reduce range of argvals to [0,1] to get smaller integration weights +#' fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / +#' (max(uvvis.lambda) - min(uvvis.lambda) )) +#' fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / +#' (max(nir.lambda) - min(nir.lambda) )) +#' +#' ## model fit with scalar response +#' ## include no intercept as all base-learners are centered around 0 +#' mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) +#' + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE), +#' timeformula = NULL, data = fuelSubset, control = boost_control(mstop = 200)) +#' +#' ## additionally include a non-linear effect of the scalar variable h2o +#' mod2s <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) +#' + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE) +#' + bbs(h2o, df = 4), +#' timeformula = NULL, data = fuelSubset, control = boost_control(mstop = 200)) +#' +#' ## alternative model fit as FLAM model with scalar response; as timeformula = ~ bols(1) +#' ## adds a penalty over the index of the response, i.e., here a ridge penalty +#' ## thus, mod2f and mod2 have different penalties +#' mod2f <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) +#' + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE), +#' timeformula = ~ bols(1), data = fuelSubset, control = boost_control(mstop = 200)) +#' +#' \donttest{ +#' ## bootstrap to find optimal mstop takes some time +#' set.seed(123) +#' folds2 <- cv(weights = model.weights(mod2), B = 10) +#' cvm2 <- cvrisk(mod2, folds = folds2, grid = 1:1000) +#' mstop(cvm2) ## mod2[327] +#' summary(mod2) +#' ## plot(mod2) +#' } +#' +#' ## Example for function-on-function-regression +#' if(require(fda)){ +#' +#' data("CanadianWeather", package = "fda") +#' CanadianWeather$l10precip <- t(log(CanadianWeather$monthlyPrecip)) +#' CanadianWeather$temp <- t(CanadianWeather$monthlyTemp) +#' CanadianWeather$region <- factor(CanadianWeather$region) +#' CanadianWeather$month.s <- CanadianWeather$month.t <- 1:12 +#' +#' ## center the temperature curves per time-point +#' CanadianWeather$temp <- scale(CanadianWeather$temp, scale = FALSE) +#' rownames(CanadianWeather$temp) <- NULL ## delete row-names +#' +#' ## fit model with cyclic splines over the year +#' mod3 <- FDboost(l10precip ~ bols(region, df = 2.5, contrasts.arg = "contr.dummy") +#' + bsignal(temp, month.s, knots = 11, cyclic = TRUE, +#' df = 2.5, boundary.knots = c(0.5,12.5), check.ident = FALSE), +#' timeformula = ~ bbs(month.t, knots = 11, cyclic = TRUE, +#' df = 3, boundary.knots = c(0.5, 12.5)), +#' offset = "scalar", offset_control = o_control(k_min = 5), +#' control = boost_control(mstop = 60), +#' data = CanadianWeather) +#' +#' \donttest{ +#' #### find the optimal mstop over 5-fold bootstrap +#' ## using the function applyFolds +#' set.seed(123) +#' folds3 <- cv(rep(1, length(unique(mod3$id))), B = 5) +#' appl3 <- applyFolds(mod3, folds = folds3, grid = 1:200) +#' +#' ## use function cvrisk; be careful to do the resampling on the level of curves +#' set.seed(123) +#' folds3long <- cvLong(id = mod3$id, weights = model.weights(mod3), B = 5) +#' cvm3 <- cvrisk(mod3, folds = folds3long, grid = 1:200) +#' mstop(cvm3) ## mod3[64] +#' +#' summary(mod3) +#' ## plot(mod3, pers = TRUE) +#' } +#' } +#' +#' ######## Example for functional response observed on irregular grid +#' ######## Delete part of observations in viscosity data-set +#' data("viscosity", package = "FDboost") +#' ## set time-interval that should be modeled +#' interval <- "101" +#' +#' ## model time until "interval" and take log() of viscosity +#' end <- which(viscosity$timeAll == as.numeric(interval)) +#' viscosity$vis <- log(viscosity$visAll[,1:end]) +#' viscosity$time <- viscosity$timeAll[1:end] +#' # with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) +#' +#' ## only keep one eighth of the observation points +#' set.seed(123) +#' selectObs <- sort(sample(x = 1:(64*46), size = 64*46/4, replace = FALSE)) +#' dataIrregular <- with(viscosity, list(vis = c(vis)[selectObs], +#' T_A = T_A, T_C = T_C, +#' time = rep(time, each = 64)[selectObs], +#' id = rep(1:64, 46)[selectObs])) +#' +#' ## fit median regression model with 50 boosting iterations, +#' ## step-length 0.4 and smooth time-specific offset +#' ## the factors are in effect coding -1, 1 for the levels +#' ## no integration weights are used! +#' mod4 <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept = FALSE) +#' + bols(T_A, contrasts.arg = "contr.sum", intercept=FALSE), +#' timeformula = ~ bbs(time, lambda = 100), id = ~id, +#' numInt = "Riemann", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 9), +#' data = dataIrregular, control = boost_control(mstop = 50, nu = 0.4)) +#' ## summary(mod4) +#' ## plot(mod4) +#' ## plotPredicted(mod4, lwdPred = 2) +#' +#' \donttest{ +#' ## Find optimal mstop, small grid/low B for a fast example +#' set.seed(123) +#' folds4 <- cv(rep(1, length(unique(mod4$id))), B = 3) +#' appl4 <- applyFolds(mod4, folds = folds4, grid = 1:50) +#' ## val4 <- validateFDboost(mod4, folds = folds4, grid = 1:50) +#' +#' set.seed(123) +#' folds4long <- cvLong(id = mod4$id, weights = model.weights(mod4), B = 3) +#' cvm4 <- cvrisk(mod4, folds = folds4long, grid = 1:50) +#' mstop(cvm4) +#' } +#' +#' ## Be careful if you want to predict newdata with irregular response, +#' ## as the argument index is not considered in the prediction of newdata. +#' ## Thus, all covariates have to be repeated according to the number of observations +#' ## in each response trajectroy. +#' ## Predict four response curves with full time-observations +#' ## for the four combinations of T_A and T_C. +#' newd <- list(T_A = factor(c(1,1,2,2), levels = 1:2, +#' labels = c("low", "high"))[rep(1:4, length(viscosity$time))], +#' T_C = factor(c(1,2,1,2), levels = 1:2, +#' labels = c("low", "high"))[rep(1:4, length(viscosity$time))], +#' time = rep(viscosity$time, 4)) +#' +#' pred <- predict(mod4, newdata = newd) +#' ## funplot(x = rep(viscosity$time, 4), y = pred, id = rep(1:4, length(viscosity$time))) +#' +#' +#' @export +#' @import methods Matrix mboost +#' @importFrom grDevices heat.colors rgb +#' @importFrom graphics abline barplot contour legend lines matplot par persp plot points +#' @importFrom utils relist getS3method packageDescription +#' @importFrom stats setNames approx as.formula coef complete.cases fitted formula lm median model.matrix model.weights na.omit predict quantile sd terms.formula variable.names +#' @importFrom gamboostLSS GaussianLSS GaussianMu GaussianSigma make.grid cvrisk.mboostLSS mboostLSS_fit +#' @importFrom stabs stabsel stabsel_parameters +#' @importFrom splines bs splineDesign +#' @importFrom mgcv gam s +#' @importFrom zoo na.locf +#' @importFrom MASS Null +#' @importFrom parallel mclapply +FDboost <- function(formula, ### response ~ xvars + timeformula, ### time + id = NULL, ### id variable if response is in long format + numInt = "equal", ### option for approximation of integral over loss + data, ### list of response, time, xvars + weights = NULL, ### optional + offset = NULL, ### optional + offset_control = o_control(), ### optional specification of offset model + check0 = FALSE, ### check sum-to-zero-constraint of the fitted effects? + ...) ### goes directly to mboost +{ + dots <- list(...) + + ### save formula of FDboost before it is changed + formulaFDboost <- formula + + tf <- terms.formula(formula, specials = "c") + trmstrings <- attr(tf, "term.labels") + equalBrackets <- NULL + if(length(trmstrings) > 0){ + ## insert id at end of each base-learner + trmstrings2 <- paste0(substr(trmstrings, 1 , nchar(trmstrings)-1), ", index=", id[2],")") + ## check if number of opening brackets is equal to number of closing brackets + equalBrackets <- sapply(seq_along(trmstrings2), function(i) + { + lengths(regmatches(trmstrings2[i], gregexpr("(", trmstrings2[i], fixed = TRUE))) == + lengths(regmatches(trmstrings2[i], gregexpr(")", trmstrings2[i], fixed = TRUE))) + }) + } + + ## check formulas + if(inherits(try(id), "try-error")) stop("id must either be NULL or a formula object.") + if(missing(timeformula) || inherits(try(timeformula), "try-error")) + stop("timeformula must either be NULL or a formula object.") + stopifnot(inherits(formula, "formula")) + if(!is.null(timeformula)) stopifnot(inherits(timeformula, "formula")) + + ## insert the id variable into the formula, to treat it like the other variables + if(!is.null(id)){ + stopifnot(inherits(id, "formula")) + ##tf <- terms.formula(formula, specials = c("c")) + ##trmstrings <- attr(tf, "term.labels") + ##equalBrackets <- NULL + if(length(trmstrings) > 0){ + ## insert index into the other base-learners of the tensor-product as well + for(i in seq_along(trmstrings)){ + if(grepl( "%X", trmstrings2[i], fixed = TRUE)){ + temp <- unlist(strsplit(trmstrings2[i], "%X", fixed = TRUE)) + temp1 <- temp[-length(temp)] + ## http://stackoverflow.com/questions/2261079 + ## delete all trailing whitespace + trim.trailing <- function (x) sub("\\s+$", "", x) + temp1 <- trim.trailing(temp1) + temp1 <- paste0(substr(temp1, 1 , nchar(temp1)-1), ", index=", id[2],")") + trmstrings2[i] <- paste0(paste0(temp1, collapse = " %X"), " %X", temp[length(temp)]) + } + ## do not add index to base-learners bhistx() + if( grepl("bhistx", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] + ## do not add an index if an index is already part of the formula + if( grepl("index[[:blank:]]*=", trmstrings[i]) ) trmstrings2[i] <- trmstrings[i] + ## do not add an index if an index for %A%, %A0%, %O% + if( grepl("%A%", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] + if( grepl("%A0%", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] + if( grepl("%O%", trmstrings[i], fixed = TRUE) ) trmstrings2[i] <- trmstrings[i] + ## do not add an index for base-learner that do not have brackets + if( i %in% which(!equalBrackets) ) trmstrings2[i] <- trmstrings[i] + } + trmstrings <- trmstrings2 + } + xpart <- paste(as.vector(trmstrings), collapse = " + ") + if(xpart != ""){ + if(any(substr(tf[[3]], 1, 1) == "1")) xpart <- paste0("1 + ", xpart) + }else{ + xpart <- 1 + } + formula <- as.formula(paste(tf[[2]], " ~ ", xpart)) + #print(formula) + nameid <- paste(id[2]) + id <- data[[nameid]] + }else{ + nameid <- NULL + } + + ### extract response; a numeric matrix or a vector + yname <- all.vars(formula)[1] + response <- data[[yname]] + if(is.null(response)) stop("The response <", yname, "> is not contained in data.") + data[[yname]] <- NULL + + ### for scalar response ~bols(1) or NULL + scalarResponse <- FALSE + scalarNoFLAM <- FALSE + response_factor <- NULL + if(is.null(timeformula) || timeformula == ~bols(1)){ + + scalarResponse <- TRUE + if(is.null(timeformula)) scalarNoFLAM <- TRUE + + if(grepl("df", formula[3], fixed = TRUE) || !grepl("lambda", formula[3], fixed = TRUE) ){ + timeformula <- ~bols(ONEtime, intercept = FALSE, df = 1) + }else{ + timeformula <- ~bols(ONEtime, intercept = FALSE) + } + + data$ONEtime <- 1 + + # if response is a matrix with one row, convert it to a vector + if(is.matrix(response) && dim(response)[2] == 1){ + response <- c(response) + warning("The scalar response is coerced from a one-column matrix to a vector. ", + "Specify scalar response as vector.") + } + + } + + if(scalarResponse && !identical(numInt,"equal")) + stop("Integration weights numInt must be set to 'equal' for scalar response.") + + ## extract time(s) from timeformula + yind <- all.vars(timeformula) + if(length(yind) == 1) { + yind <- yind[[1]] + nameyind <- yind + assign(yind, data[[yind]]) + time <- data[[yind]] + if(!is.numeric(time)) warning("Non-numeric time variable specified. + 'plot' and other convenience functions potentially not designed for that, yet.") + data[[yind]] <- NULL + attr(time, "nameyind") <- nameyind + } else { + warning("More than one variable specified in time formula, + 'plot' and other convenience functions potentially not designed for that, yet.") + nameyind <- yind + for(yind_ in yind) assign(yind_, data[[yind_]]) + time <- data[yind] + } + + ### extract covariates + # data <- as.data.frame(data) + allCovs <- unique(c(nameid, all.vars(formula))) + if(length(allCovs) > 1){ + data <- data[allCovs[!allCovs %in% c(yname, nameyind)] ] + if( anyNA(names(data)) ) data <- data[ !is.na(names(data)) ] + }else{ + data <- list(NULL) # intercept-model without covariates + } + + ### get covariates that are modeled constant over time + # code of function pffr() of package refund + terms <- sapply(trmstrings, function(trm) as.call(parse(text = trm))[[1]], simplify = FALSE) + # ugly, but getTerms(formula)[-1] does not work for terms like I(x1:x2) + frmlenv <- environment(formula) + where.c <- attr(tf, "specials")$c - 1 # indices of scalar offset terms + + # transform: c(foo) --> foo + if(length(where.c)){ + trmstrings[where.c] <- sapply(trmstrings[where.c], function(x){ + sub("\\)$", "", sub("^c\\(", "", x)) #c(BLA) --> BLA + }) + blconstant <- "bols(ONEtime, intercept = FALSE)" + } + assign("ONEtime", rep(1.0, length(time))) + + if(scalarResponse){ ## scalar response + + nr <- NROW(response) + nobs <- nr # number of observed trajectories + nc <- 1 + dresponse <- response + + }else{ ## functional response + + if(is.null(id)){ + ### check dimensions + ### response has trajectories as rows + stopifnot(is.matrix(response)) + # dataframe is list and can contain time-points of functional covariates of arbitrary length + # if (nrow(data) > 0) stopifnot(nrow(response) == nrow(data)) + nr <- nrow(response) + if(!is.list(time)) + stopifnot(ncol(response) == length(time)) else + stopifnot(all(ncol(response) == lengths(time[sapply(time, is.vector)]))) + nc <- ncol(response) + dresponse <- as.vector(response) # column-wise stacking of response + ## convert characters to factor + if(is.character(dresponse)) dresponse <- factor(dresponse) + ## in case of a scalar factor response, use the original factor as response + if(!is.null(response_factor)) dresponse <- response_factor + nobs <- nr # number of observed trajectories + }else{ + stopifnot(is.null(dim(response))) ## stopifnot(is.vector(response)) + # check length of response and its time and index + if(is.list(time)) + stopifnot(all(length(response) == lengths(time)) & length(response) == length(id)) else + stopifnot(length(response) == length(time) & length(response) == length(id)) + + if(anyNA(response)) warning("For non-grid observations the response should not contain missing values.") + if( !all(sort(unique(id)) == seq_along(unique(id))) ) stop("id has to be integers 1, 2, 3,..., N.") + + nr <- length(response) # total number of observations + nc <- length(unique(id)) # number of trajectories + dresponse <- as.vector(response) # column-wise stacking of response + nobs <- length(unique(id)) # number of observed trajectories + } + + } + + ### save original dimensions of response + ydim <- dim(response) + + ### (pre-)check if length / number of rows of response and + ### functional covariates match + ### (only meaningful for models with no hmatrix) + if(all(!sapply(data, is.hmatrix))){ + + functcov <- sapply(data, NCOL) > 1 + + if(!scalarResponse || any(functcov)) + if(any(ww <- ydim[1] != sapply(data[functcov], NROW))) + stop(paste0("The length of the response and number of observations of ", + names(ww[1]), " do not match.")) + + } + + ### variable to fit smooth intercept + assign("ONEx", rep(1.0, nobs)) + + ##### compose mboost formula + + ## get formula over time + tfm <- paste(deparse(timeformula), collapse = "") + tfm <- strsplit(tfm, "~", fixed = TRUE)[[1]] + tfm <- strsplit(tfm[2], "+", fixed = TRUE)[[1]] + + ## get formula in covariates + cfm <- paste(deparse(formula), collapse = "") + cfm <- strsplit(cfm, "~", fixed = TRUE)[[1]] + cfm0 <- cfm + #xfm <- strsplit(cfm[2], "\\+")[[1]] + xfm <- trmstrings + + ## check that the timevariable in timeformula and in the bhistx-base-learners have the same name + if(any(grepl("bhistx", trmstrings, fixed = TRUE))){ + for(j in seq_along(trmstrings)){ + if(any(grepl("bhistx", trmstrings[j], fixed = TRUE))){ + if(grepl("%X", trmstrings[j], fixed = TRUE) ){ + temp <- strsplit(trmstrings[[j]], "%X.*%")[[1]] + temp <- temp[ grepl("bhistx", temp, fixed = TRUE) ] + ## pryr::standardise_call(quote(bhistx(X1h, df=3))) + temp_name <- all.vars(formula(paste("~", temp)))[1] + }else{ + temp_name <- all.vars(formula(paste("~", trmstrings[[j]])[1]))[1] + } + if(getTimeLab(data[[temp_name]]) != nameyind){ + stop("The timeLab of the hmatrix-object in bhistx(), '", getTimeLab(data[[temp_name]]), + "', must be euqal to the name of the time-variable in timeformula, '", nameyind, "'.") + } + timeLong <- time + ## for response matrix: expand time accordingly + if(!is.null(ydim)) timeLong <- rep(time, each = ydim[1] ) + if( any( abs(getTime(data[[temp_name]]) - timeLong) > .Machine$double.eps*10^10) ){ + stop("The time of the hmatrix-object in bhistx() must match the time-variable in timeformula.") + } + } + } + } + + yfm <- strsplit(cfm[1], "+", fixed = TRUE)[[1]] ## name of response + + ## set up formula for effects constant in time + if(length(where.c) > 0){ + # set c_df to the df/lambda in timeformula + if( grepl("lambda", tfm, fixed = TRUE) || + ( grepl("bols", tfm, fixed = TRUE) && !grepl("df", tfm, fixed = TRUE)) ){ + c_lambda <- eval(parse(text = paste0(tfm, "$dpp(rep(1.0,", length(time), "))$df()")))["lambda"] + cfm <- paste("bols(ONEtime, intercept = FALSE, lambda = ", c_lambda ,")") + } else{ + c_df <- eval(parse(text=paste0(tfm, "$dpp(rep(1.0,", length(time), "))$df()")))["df"] + cfm <- paste("bols(ONEtime, intercept = FALSE, df = ", c_df ,")") + } + } + + # make brackets around timeformula if more than one variable is involved + if(length(all.vars(timeformula)) > 1) tfm <- paste("(", tfm, ")") + + # expand formula as Kronecker or tensor product + if(is.null(id)){ + tmp <- outer(xfm, tfm, function(x, y) paste(x, y, sep = "%O%")) + }else{ + ## expand the bl according to id + # do not expand for terms without brackets, which is equal to having an unequal number of brackets + # in the generation part of trmstrings + if(is.null(equalBrackets)){ # for intercept models y ~ 1 + which_equalBrackets <- 0 + } else{ + which_equalBrackets <- which(equalBrackets) + } + xfmTemp <- paste0(substr(xfm[which_equalBrackets], 1 , + nchar(xfm[which_equalBrackets]) - 1 ), ")") # , index=id is done in the beginning + xfm[which_equalBrackets] <- xfmTemp + rm(xfmTemp) + tmp <- outer(xfm, tfm, function(x, y) paste(x, y, sep = "%X%")) + } + + # do not expand an effect bconcurrent() or bhist() with timeformula + if (any(grepl("bconcurrent|bhis", tmp))) + tmp[c(grep("bconcurrent", tmp, fixed = TRUE), grep("bhist", tmp, fixed = TRUE))] <- xfm[c(grep("bconcurrent", tmp, fixed = TRUE), grep("bhist", tmp, fixed = TRUE))] + + ## do not expand effects in formula including %A% with timeformula + if( any(grepl("%A%", xfm, fixed = TRUE)) ) + tmp[grep("%A%", xfm, fixed = TRUE)] <- xfm[grep("%A%", xfm, fixed = TRUE)] + + ## do not expand effects in formula including %A0% with timeformula + if( any(grepl("%A0%", xfm, fixed = TRUE)) ) + tmp[grep("%A0%", xfm, fixed = TRUE)] <- xfm[grep("%A0%", xfm, fixed = TRUE)] + + ## do not expand effects in formula including %O% with timeformula + if( any(grepl("%O%", xfm, fixed = TRUE)) ) + tmp[grep("%O%", xfm, fixed = TRUE)] <- xfm[grep("%O%", xfm, fixed = TRUE)] + + ## expand with a constant effect in t-direction + if(length(where.c) > 0){ + tmp[where.c] <- outer(xfm[where.c], cfm, function(x, y) paste(x, y, sep = "%O%")) + } + + ## for scalar response without FLAM-model do not use the Kronecker product + if(scalarNoFLAM){ + tmp <- xfm + } + + + ####### find the number of df for each base-learner + ## for a fair selection of bl the df must be equal in all bl + if(is.list(time)) { + warning("For timeformulas with multiple variables dfs are not checked automatically. + Please make sure that all base-learner df are equal to ensure a fair selection.") + bl_df <- NULL + } else { + get_df <- function(bl){ + split_bl <- unlist(strsplit(bl, split = "%.{1,3}%")) + all_df <- c() + for(i in seq_along(split_bl)){ + parti <- parse(text = split_bl[i])[[1]] + parti <- expand.call(definition = get(as.character(parti[[1]])), call = parti) + dfi <- parti$df # df of part i in bl + if(is.symbol(dfi) || (!is.numeric(dfi) && is.numeric(eval(dfi)))) dfi <- eval(dfi) + lambdai <- parti$lambda # if lambda is present, df is ignored + if(is.symbol(lambdai)) lambdai <- eval(lambdai) + if(!is.null(dfi)){ + all_df[i] <- dfi + }else{ ## for df = NULL, the value of lambda is used + if(lambdai == 0){ + all_df[i] <- NCOL(extract(with(data, eval(parti)), "design")) + }else{ + all_df[i] <- "" ## dont know df + } + if(grepl("%X.{0,3}%", bl)){ ## special behaviour of %X% + all_df[i] <- 1 + } + } + } + if(any(all_df == "")){ + ret <- NULL + }else{ + ret <- prod(all_df) # global df for bl is product of all df + if( identical(ret, numeric(0)) ) ret <- NULL + } + return(ret) + } + + #### get the specified df for each base-learner + ## does not take into account base-learners that do not have brackets + if(length(tmp) == 0){ + bl_df <- NULL + }else{ + bl_df <- vector("list", length(tmp)) + bl_df[equalBrackets] <- lapply(tmp[equalBrackets], function(x) try(get_df(x))) + bl_df <- unlist(bl_df[equalBrackets & (!sapply(bl_df, function(x) inherits(x, "try-error")))]) + #print(bl_df) + + if( !is.null(bl_df) && any(abs(bl_df - bl_df[1]) > .Machine$double.eps * 10^10) ){ + warning("The base-learners differ in the degrees of freedom.") + } + + if(!is.null(bl_df)){ + df_timeformula <- get_df(tfm) + df_effects <- min(bl_df) + } + } + } + + ### replace "1" with intercept base learner + formula_intercept <- FALSE + if ( any( gsub(" ", "", strsplit(cfm0[2], "+", fixed = TRUE)[[1]], fixed = TRUE) == "1")){ + formula_intercept <- TRUE + ## use df or lambda as in timeformula + if( any(grepl("lambda", deparse(timeformula), fixed = TRUE)) || + any(( grepl("bols", deparse(timeformula), fixed = TRUE) & !grepl("df", deparse(timeformula), fixed = TRUE))) ){ + tmp <- c("bols(ONEx, intercept = FALSE, lambda = 0)", tmp) + } else{ + tmp <- c("bols(ONEx, intercept = FALSE, df = 1)", tmp) + } + + ## adjust the df in the timeformula + call_tfm <- as.call(parse(text = tfm)[[1]]) + if(!is.null(bl_df)) call_tfm$df <- df_effects + tfm_df <- paste0(deparse(call_tfm), collapse = "") + + ## for FLAM model with %O% use anisotropic Kronecker product for not penalizing in direction of ONEx + ## use %A0%, as smooth intercept has smooting parameter 0 in 1-direction + if(is.null(id)){ + if(!scalarNoFLAM) tmp[[1]] <- paste(tmp[[1]], "%A0%", tfm_df) + }else{ ## response in long format + tmp[[1]] <- tfm_df + } + } + + ####### put together the model formula + xpart <- paste(as.vector(tmp), collapse = " + ") + fm <- as.formula(paste("dresponse ~ ", xpart)) + + ## find variables that are defined in environment(formula) but not in environment(fm) or in data + fm_vars <- all.vars(fm) # all variables of fm + + ## for bhist() the limits argument can be a function; + ## in this case those function arguments should not be included + terms_fm_bhist <- terms(formula, specials = c("bhist", "bhistx")) + + if(any(! sapply(attr(terms_fm_bhist, "specials"), is.null))){ ## occurence of bhist or bhistx + + places_bhist <- c(attr(terms_fm_bhist, "specials")$bhist, + attr(terms_fm_bhist, "specials")$bhistx) + + vars_arg_limits_not_unique <- c() + for(pl in seq_along(places_bhist)){ ## loop over all bhist-bl + + ## get the limits argument + current_bl <- attr(terms_fm_bhist, "variables")[[places_bhist[pl] + 1]] + # for base-learner with interaction, find bhistx / bhist + if(any(grepl("%X", current_bl, fixed = TRUE))){ + #current_bl <- current_bl[ grepl("bhist", current_bl) ] + arg_limits <- eval(as.call(as.list(current_bl[grepl("bhist", current_bl, fixed = TRUE)])[[1]])$limits) + }else{ + # limits argument of bhist / bhistx + arg_limits <- eval(as.call(current_bl)$limits) + } + + if(is.function(arg_limits)){ + ## get the names of the arguments of the limits-function + vars_arg_limits <- names(formals(arg_limits)) + ## check whether the variables uniquely occur in the limits-function + var_occur <- table(all.vars(attr(terms_fm_bhist, "variables")[[places_bhist[pl] + 1]], + unique = FALSE))[vars_arg_limits] == 1 + vars_arg_limits_not_unique <- c(vars_arg_limits_not_unique, vars_arg_limits[var_occur]) + } + } + + if(length(vars_arg_limits_not_unique) > 0){ + delete_var <- table(all.vars(fm, unique = FALSE))[unique(vars_arg_limits_not_unique)] <= + table(vars_arg_limits_not_unique)[unique(vars_arg_limits_not_unique)] + fm_vars <- fm_vars[! fm_vars %in% names(delete_var)[delete_var]] + } + rm(vars_arg_limits_not_unique, places_bhist, arg_limits) + + } + + ## vars_envir_formula <- fm_vars[ ! fm_vars %in% c(names(data), "dresponse" , "ONEx", "ONEtime", yind) ] + # variables that exist in environment(fm) + vars1 <- sapply(fm_vars, exists, envir = environment(fm), inherits = FALSE) + if(!is.null(names(data))){ + vars2 <- sapply(fm_vars, function(x){ x %in% names(data)} ) # variables that exist in data + }else{ + vars2 <- FALSE + } + + # variables that exist neither in environment(fm) nor in data... + vars_envir_formula <- fm_vars[ !(vars1 | vars2) ] + # ... take those from the environment of the formula with which FDboost was called + for(i in seq_along(vars_envir_formula)){ + if(! exists(vars_envir_formula[i], envir = environment(formulaFDboost))) + stop("Variable <", vars_envir_formula[i], "> does not exist.") + tmp <- get(vars_envir_formula[i], envir = environment(formulaFDboost)) + assign(x = vars_envir_formula[i], value = tmp, envir = environment(fm)) + } + rm(tmp) + + # environment(fm) + + ### expand weights for observations + if (is.null(weights)) weights <- rep(1, nr) + w <- weights + if(is.null(id)){ + if (length(w) == nr) w <- rep(w, nc) # expand weights if they are only on the columns + # check dimensions of w + if(length(w) != nc*nr) stop("Dimensions of weights do not match the dimensions of the response.") + } + + ## save the integration weights as data_weights + ## per default the data_weights are all 1 + data_weights <- 1 + + ### multiply integration weights numInt to weights and w + if(is.numeric(numInt)){ + .numInt_len_check <- if(is.list(time)) + all(length(numInt) == lengths(time)) else + length(numInt) == length(time) + if(!.numInt_len_check) + stop("Length of integration weights and time vector are not equal.") + data_weights <- numInt + if(!is.null(ydim)){ ## only blow up for array model + data_weights <- rep(data_weights, each = nr) + } + }else{ + if(!numInt %in% c("equal", "Riemann")) warning("argument numInt is ignored as it is neither numeric nor one of (\"equal\", \"Riemann\")") + if(numInt == "Riemann"){ + if(!is.numeric(time)) + stop("Riemann integration weights only implemented for a single numeric time variable.") + data_weights <- as.vector(integrationWeights(X1 = response, time, id = id)) + } + } + w <- w * data_weights + + ### set weights of missing values to 0 + if(sum(is.na(dresponse)) > 0){ + w[which(is.na(dresponse))] <- 0 + } + + if(all(w == 0)) stop("All weights are zero!") + + ### offset == "scalar", or offset = numeric of length 1, or scalar response + ### -> use one scalar/user-specified offset like in mboost + + ### in case of factor or multiple time variables set offset to 0 and give a warning + if(is.list(time) || !is.numeric(time)) { + .offsetwarning <- is.null(offset) + if(!.offsetwarning) { + .offsetwarning <- (offset == "scalar") + } + if(.offsetwarning) { + offset <- 0 + warning("In case of factor or multiple time variables no default offset implemented, yet. + offset is set to 0.") + } + } + + ## remember the offset-specification of FDboost + offsetFDboost <- offset + + if( scalarResponse || # scalar response + !is.null(offset) && length(offset) == 1 ){ # offset == "scalar" / offset = numeric of length 1 + + if( !is.null(offset) && !is.numeric(offset) && offset != "scalar" ){ + stop("User-specified offset must be numeric or 'scalar' to get a scalar offset as in mboost.") + } + + # use one constant offset in mboost(), as default in mboost + if(!is.null(offset) && offset == "scalar"){ + offsetVec <- NULL + predictOffset <- NULL + offset <- NULL + }else{ # use user-specified offset of length 1 or offset = NULL for scalar response + offsetVec <- offset + tempOffset <- if(length(offset) == 1) offset else NULL + predictOffset <- function(time) tempOffset + } + + ### specify time-specific offset + }else{ + + ## offset for regular and irregular data: handling of missings is different! + if(is.null(id)){ + + ## per default add smooth time-specific offset + if(is.null(offset) && dim(response)[2] > 1 && + any(colMeans(response, na.rm = TRUE) > .Machine$double.eps *10^10)){ + message("Use a smooth offset.") + ### check whether the use of family@offset is correct + if(! "family" %in% names(dots) ){ # get the used family + myfamily <- Gaussian() + } else myfamily <- dots$family + offsetFun <- myfamily@offset + meanY <- c() + # do a linear interpolation of the response to prevent bias because of missing values + # only use responses with less than 90% missings for the calculation of the offset + # only use response curves whose weights are not completely 0 (important for resampling methods) + meanNA <- apply(response, 1, function(x) mean(is.na(x))) + responseInter <- t(apply(response[meanNA < 0.9 & rowSums(matrix(w, ncol = nc)) != 0 , , drop = FALSE], 1, + function(x) approx(time, x, rule = offset_control$rule, xout = time)$y)) + # check whether first or last columns of the response contain solely NA + # then use the values of the next column + if(any(apply(responseInter, 2, function(x) all(is.na(x)) ) )){ + warning("Column of interpolated response contains nothing but NA.") + allNA <- apply(responseInter, 2, function(x) all(is.na(x)) ) + allNAlower <- allNAupper <- allNA + allNAupper[1:round(ncol(responseInter)/2)] <- FALSE # missing columns with low index + allNAlower[round(ncol(responseInter)/2):ncol(responseInter)] <- FALSE # missing columns with high index + responseInter[, allNAlower] <- responseInter[, max(which(allNAlower))+1] + responseInter[, allNAupper] <- responseInter[, min(which(allNAlower))-1] + } + + for(i in 1:nc){ + try(meanY[i] <- offsetFun(responseInter[,i], 1*!is.na(responseInter[,i]) ), silent = TRUE) + } + # meanY <- sapply(1:nc, function(i) offsetFun(responseInter[,i], 1*!is.na(responseInter[,i]))) + + if( is.null(meanY) || anyNA(meanY) ){ + warning("Mean offset cannot be computed by family@offset(). Use a weighted mean instead.") + meanY <- c() + for(i in 1:nc){ + meanY[i] <- Gaussian()@offset(responseInter[,i], 1*!is.na(responseInter[,i]) ) + } + } + rm(responseInter, meanNA) + ## additive model for smooth offset + if(!offset_control$cyclic){ + modOffset <- try( gam(meanY ~ s(time, bs = "ad", + k = min(offset_control$k_min, round(length(time)/2)) ), + knots = offset_control$knots), + silent = offset_control$silent ) + }else{ # use cyclic splines + modOffset <- try( gam(meanY ~ s(time, bs = "cc", + k = min(offset_control$k_min, round(length(time)/2)) ), + knots = offset_control$knots), + silent = offset_control$silent ) + } + + if(inherits(modOffset, "try-error")){ + warning(paste("Could not fit the smooth offset by adaptive splines (default), use a simple spline expansion with 5 df instead.", + if(offset_control$cyclic) "This offset is not cyclic!")) + if(round(length(time)/2) < 8) warning("Most likely because of too few time-points.") + modOffset <- lm(meanY ~ bs(time, df = 5)) + } + offsetVec <- modOffset$fitted.values + predictOffset <- function(time){ + ret <- as.numeric(predict(modOffset, newdata = data.frame(time = time))) + names(ret) <- NULL + ret + } + offset <- as.vector(matrix(offsetVec, ncol = ncol(response), nrow = nrow(response), byrow = TRUE)) + }else{ + ### scalar response or mean-centered response -> one constant offset value is used + if(dim(response)[2] == 1 || all(colMeans(response, na.rm = TRUE) < .Machine$double.eps *10^10)){ + offsetVec <- offset + predictOffset <- offset + }else{ + # expand the offset to the long vector like dresponse + if(length(offset) != nc) stop("Dimensions of offset and response do not match.") + offsetVec <- offset + offset <- as.vector(matrix(offset, ncol = ncol(response), nrow = nrow(response), byrow = TRUE)) + ### Use a more sophisticated model to estimate the time-specific offset? + modOffset <- lm(offsetVec ~ bs(time, df = length(offsetVec)-2)) + predictOffset <- function(time){ + ret <- as.numeric(predict(modOffset, newdata = data.frame(time = time))) + names(ret) <- NULL + ret + } + } + } ## end else{} for no smooth time-specific offset for regular response + + # for irregular data the model for the smooth offset is computed on the available data + }else{ + + ## compute a time-specific smooth offset for irregular data + if(is.null(offset)){ + # only use response curves whose weights are not completely 0 (important for resampling methods) + # do this by setting responses to NA whose weight is zero + responseW <- response + responseW[w == 0] <- NA + message("Use a smooth offset for irregular data.") + if(!offset_control$cyclic){ + modOffset <- try( gam(responseW ~ s(time, bs = "ad", + k = min(offset_control$k_min, round(length(time)/10)) ), + knots = offset_control$knots), + silent = offset_control$silent ) + }else{ # use cyclic splines + modOffset <- try( gam(responseW ~ s(time, bs = "cc", + k = min(offset_control$k_min, round(length(time)/10)) ), + knots = offset_control$knots), + silent = offset_control$silent ) + } + + if(inherits(modOffset, "try-error")){ + warning(paste("Could not fit the smooth offset by adaptive splines (default), use a simple spline expansion with 5 df instead.", + if(offset_control$cyclic) "This offset is not cyclic!")) + if(round(length(time)/2) < 8) warning("Most likely because of too few time-points.") + modOffset <- lm(response ~ bs(time, df = 5)) + } + + offsetVec <- as.numeric(predict(modOffset, newdata = data.frame(time = time))) + predictOffset <- function(time){ + ret <- as.numeric(predict(modOffset, newdata = data.frame(time = time))) + names(ret) <- NULL + ret + } + offset <- offsetVec + + # no time-specific offset -> constant offset is estimated within mboost() + }else{ + if(dots$family@name != "Poisson Likelihood") # allow for Poisson case (survival models) + stop("User specified offset must be of length 1 for irregularly observed response.") + } + + + + } # end else from if(is.null(id)) + + } + + offsetMboost <- offset + + if (length(data) > 0 && !(is.list(data) && length(data) == 1 && is.null(data[[1]]))) { + ### mboost isn't happy with nrow(data) == 0 / list(NULL) + ret <- mboost(fm, data = data, weights = w, offset = offset, ...) + } else { + ret <- mboost(fm, weights = w, offset = offset, ...) + } + + # check sum-to-zero constraints for the fitted effects + # for models with more than one effect and a regular response + # not for scalar response + if(check0 && length(ret$baselearner) > 1 && is.null(id) && dim(response)[2] != 1){ + + # do not check the smooth intercept + if(any( gsub(" ", "", strsplit(cfm[2], "+", fixed = TRUE)[[1]], fixed = TRUE) == "1")){ + effectsToCheck <- 2:length(ret$baselearner) + }else{ + effectsToCheck <- seq_along(ret$baselearner) + } + # predict each effect separately + pred <- predict(ret, which = effectsToCheck) + + # check weather each effect is zero per time-point + meanPerTime <- apply(pred, 2, function(x){ + tapply(x, rep(1:nc, each = nobs), mean) # compute mean per time-point + }) + if(!all(meanPerTime < .Machine$double.eps *10^10)){ + temp <- colSums(meanPerTime > .Machine$double.eps *10^10) != 0 + message("The effects ", names(temp)[temp], " do not sum to zero per time-point.") + } + } + + ### assign new class (e.g., for specialized predictions) + class(ret) <- c("FDboost", class(ret)) + if(!is.null(id)) class(ret) <- c("FDboostLong", class(ret)) + if(scalarResponse) class(ret) <- c("FDboostScalar", class(ret)) + ## generate an id-variable for a regular response + if(is.null(id)){ + if(scalarResponse){ + id <- seq_len(NROW(response)) + }else{ + id <- rep(1:ydim[1], times = ydim[2]) + } + } + + ### reset weights for cvrisk etc., expanding works OK in bl_lin_matrix! + # ret$"(weights)" <- weights + # do not reset weights as than the integration weights are lost + + ret$yname <- yname + ret$ydim <- ydim + ret$yind <- time + ret$data <- data + ret$id <- id + attr(ret$id, "nameid") <- nameid + + # if the offset is just an integer the prediction gives back this integer + ret$predictOffset <- predictOffset + if(is.null(offset)) ret$predictOffset <- function(time) ret$offset + + ret$offsetFDboost <- offsetFDboost # offset as specified in call to FDboost + ret$offsetMboost <- offsetMboost # offset as given to mboost + + # information whether the model contains an itercept + ret$withIntercept <- formula_intercept + + # save the call + ret$call <- match.call() + + # save the evaluated call + ret$callEval <- ret$call + ret$callEval[-1] <- lapply(ret$call[-1], function(x){ + eval(x, parent.frame(3)) # use the environment of the call to FDboost() + }) + ret$callEval$data <- NULL # do not save data and weights in callEval to save memory + ret$callEval$weights <- NULL + + ## save value of numInt + ret$numInt <- numInt + + # save formulas as character strings to save memory + ret$timeformula <- paste(deparse(timeformula), collapse = "") + if(scalarNoFLAM) ret$timeformula <- "" + ret$formulaFDboost <- paste(deparse(formulaFDboost), collapse = "") + ret$formulaMboost <- paste(deparse(fm), collapse = "") + + ret +} + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboostLSS.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboostLSS.R new file mode 100644 index 0000000..f8461fb --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/FDboostLSS.R @@ -0,0 +1,227 @@ +################################################################################# +#' Model-based Gradient Boosting for Functional GAMLSS +#' +#' Function for fitting generalized additive models for location, scale and shape (GAMLSS) +#' with functional data using component-wise gradient boosting, for details see +#' Brockhaus et al. (2018). +#' +#' @param formula a symbolic description of the model to be fit. +#' If \code{formula} is a single formula, the same formula is used for all distribution parameters. +#' \code{formula} can also be a (named) list, where each list element corresponds to one distribution +#' parameter of the GAMLSS distribution. The names must be the same as in the \code{families}. +#' @param timeformula one-sided formula for the expansion over the index of the response. +#' For a functional response \eqn{Y_i(t)} typically \code{~bbs(t)} to obtain a smooth +#' expansion of the effects along \code{t}. In the limiting case that \eqn{Y_i} is a scalar response +#' use \code{~bols(1)}, which sets up a base-learner for the scalar 1. +#' Or you can use \code{timeformula=NULL}, then the scalar response is treated as scalar. +#' Analogously to \code{formula}, \code{timeformula} can either be a one-sided formula or +#' a named list of one-sided formulas. +#' @param data a data frame or list containing the variables in the model. +#' @param families an object of class \code{families}. It can be either one of the pre-defined distributions +#' that come along with the package \code{gamboostLSS} or a new distribution specified by the user +#' (see \code{\link[gamboostLSS]{Families}} for details). +#' Per default, the two-parametric \code{\link[gamboostLSS]{GaussianLSS}} family is used. +#' @param control a list of parameters controlling the algorithm. +#' For more details see \code{\link[mboost]{boost_control}}. +#' @param weights does not work! +#' @param method fitting method, currently two methods are supported: +#' \code{"cyclic"} (see Mayr et al., 2012) and \code{"noncyclic"} +#' (algorithm with inner loss of Thomas et al., 2018). +#' @param ... additional arguments passed to \code{\link[FDboost]{FDboost}}, +#' including, \code{family} and \code{control}. +#' +#' @details For details on the theory of GAMLSS, see Rigby and Stasinopoulos (2005). +#' \code{FDboostLSS} calls \code{FDboost} to fit the distribution parameters of a GAMLSS - +#' a functional boosting model is fitted for each parameter of the response distribution. +#' In \code{\link[gamboostLSS]{mboostLSS}}, details on boosting of GAMLSS based on +#' Mayr et al. (2012) and Thomas et al. (2018) are given. +#' In \code{\link{FDboost}}, details on boosting regression models with functional variables +#' are given (Brockhaus et al., 2015, Brockhaus et al., 2017). +#' +#' @return An object of class \code{FDboostLSS} that inherits from \code{mboostLSS}. +#' The \code{FDboostLSS}-object is a named list containing one list entry per distribution parameter +#' and some attributes. The list is named like the parameters, e.g. mu and sigma, +#' if the parameters mu and sigma are modeled. Each list-element is an object of class \code{FDboost}. +#' +#' @author Sarah Brockhaus +#' +#' @seealso Note that \code{FDboostLSS} calls \code{\link{FDboost}} directly. +#' +#' @keywords models regression nonlinear smooth +#' +#' @references +#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015). +#' The functional linear array model. Statistical Modelling, 15(3), 279-300. +#' +#' Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +#' Boosting flexible functional regression models with a high number of functional historical effects, +#' Statistics and Computing, 27(4), 913-926. +#' +#' Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): +#' Signal regression models for location, scale and shape with an application to stock returns. +#' Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 665-686. +#' +#' Mayr, A., Fenske, N., Hofner, B., Kneib, T. and Schmid, M. (2012): +#' Generalized additive models for location, scale and shape for high-dimensional +#' data - a flexible approach based on boosting. +#' Journal of the Royal Statistical Society: Series C (Applied Statistics), 61(3), 403-427. +#' +#' Rigby, R. A. and D. M. Stasinopoulos (2005): +#' Generalized additive models for location, scale and shape (with discussion). +#' Journal of the Royal Statistical Society: Series C (Applied Statistics), 54(3), 507-554. +#' +#' Thomas, J., Mayr, A., Bischl, B., Schmid, M., Smith, A., and Hofner, B. (2018), +#' Gradient boosting for distributional regression - faster tuning and improved +#' variable selection via noncyclical updates. +#' Statistics and Computing, 28, 673-687. +#' +#' Stoecker, A., Brockhaus, S., Schaffer, S., von Bronk, B., Opitz, M., and Greven, S. (2019): +#' Boosting Functional Response Models for Location, Scale and Shape with an Application to Bacterial Competition. +#' \url{https://arxiv.org/abs/1809.09881} +#' +#' @examples +#' ########### simulate Gaussian scalar-on-function data +#' n <- 500 ## number of observations +#' G <- 120 ## number of observations per functional covariate +#' set.seed(123) ## ensure reproducibility +#' z <- runif(n) ## scalar covariate +#' z <- z - mean(z) +#' s <- seq(0, 1, l=G) ## index of functional covariate +#' ## generate functional covariate +#' if(require(splines)){ +#' x <- t(replicate(n, drop(bs(s, df = 5, int = TRUE) %*% runif(5, min = -1, max = 1)))) +#' }else{ +#' x <- matrix(rnorm(n*G), ncol = G, nrow = n) +#' } +#' x <- scale(x, center = TRUE, scale = FALSE) ## center x per observation point +#' +#' mu <- 2 + 0.5*z + (1/G*x) %*% sin(s*pi)*5 ## true functions for expectation +#' sigma <- exp(0.5*z - (1/G*x) %*% cos(s*pi)*2) ## for standard deviation +#' +#' y <- rnorm(mean = mu, sd = sigma, n = n) ## draw respone y_i ~ N(mu_i, sigma_i) +#' +#' ## save data as list containing s as well +#' dat_list <- list(y = y, z = z, x = I(x), s = s) +#' +#' ## model fit with noncyclic algorithm assuming Gaussian location scale model +#' m_boost <- FDboostLSS(list(mu = y ~ bols(z, df = 2) + bsignal(x, s, df = 2, knots = 16), +#' sigma = y ~ bols(z, df = 2) + bsignal(x, s, df = 2, knots = 16)), +#' timeformula = NULL, data = dat_list, method = "noncyclic") +#' summary(m_boost) +#' +#' \donttest{ +#' if(require(gamboostLSS)){ +#' ## find optimal number of boosting iterations on a grid in 1:1000 +#' ## using 5-fold bootstrap +#' ## takes some time, easy to parallelize on Linux +#' set.seed(123) +#' cvr <- cvrisk(m_boost, folds = cv(model.weights(m_boost[[1]]), B = 5), +#' grid = 1:1000, trace = FALSE) +#' ## use model at optimal stopping iterations +#' m_boost <- m_boost[mstop(cvr)] ## 832 +#' +#' ## plot smooth effects of functional covariates for mu and sigma +#' oldpar <- par(mfrow = c(1,2)) +#' plot(m_boost$mu, which = 2, ylim = c(0,5)) +#' lines(s, sin(s*pi)*5, col = 3, lwd = 2) +#' plot(m_boost$sigma, which = 2, ylim = c(-2.5,2.5)) +#' lines(s, -cos(s*pi)*2, col = 3, lwd = 2) +#' par(oldpar) +#' } +#' } +#' @export +## function that calls FDboost for each distribution parameter +FDboostLSS <- function(formula, timeformula, data = list(), families = GaussianLSS(), + control = boost_control(), weights = NULL, + method = c("cyclic", "noncyclic"), ...){ + + cl <- match.call() + if(is.null(cl$families)) cl$families <- families + + ## warnings for functional response are irrelevant for scalar response + if( !is.null(timeformula) && timeformula != ~bols(1) ){ + message("No smooth offsets over time are used, just global scalar offsets.") + message("No integration weights are used to compute the loss for the functional response.") + } + method <- match.arg(method) + + fit <- mboostLSS_fit(formula = formula, timeformula = timeformula, + data = data, families = families, + control = control, weights = weights, ..., + fun = FDboost, funchar = "FDboost", call = cl, + method = method) + + ## make sure that the first class of the model object is 'FDboostLSS' + class(fit) <- class(fit)[class(fit) != "FDboostLSS"] + class(fit) <- c("FDboostLSS", class(fit)) + + return(fit) +} + + +################################################################################# +#' Cross-validation for FDboostLSS +#' +#' Multidimensional cross-validated estimation of the empirical risk for hyper-parameter selection, +#' for an object of class \code{FDboostLSS} setting the folds per default to resampling curves. +#' +#' @param object an object of class \code{FDboostLSS}. +#' @param folds a weight matrix a weight matrix with number of rows equal to the number of observations. +#' The number of columns corresponds to the number of cross-validation runs, +#' defaults to 25 bootstrap samples, resampling whole curves +#' @param grid defaults to a grid up to the current number of boosting iterations. +#' The default generates the grid according to the defaults of +#' \code{\link[gamboostLSS]{cvrisk.mboostLSS}} which are different for models with cyclic or noncyclic fitting. +#' @param papply (parallel) apply function, defaults to \code{\link[parallel]{mclapply}}, +#' see \code{\link[gamboostLSS]{cvrisk.mboostLSS}} for details. +#' @param trace print status information during cross-validation? Defaults to \code{TRUE}. +#' @param fun if \code{fun} is \code{NULL}, the out-of-sample risk is returned. +#' \code{fun}, as a function of \code{object}, +#' may extract any other characteristic of the cross-validated models. These are returned as is. +#' @param ... additional arguments passed to \code{\link[parallel]{mclapply}}. +#' +#' @details The function \code{cvrisk.FDboostLSS} is a wrapper for +#' \code{cvrisk.mboostLSS} in package \code{gamboostLSS}. +#' It overrides the default for the folds, so that the folds are sampled on the level of curves +#' (not on the level of single observations, which does not make sense for functional response). +#' +#' @return An object of class \code{cvriskLSS} (when \code{fun} was not specified), +#' basically a matrix containing estimates of the empirical risk for a varying number +#' of bootstrap iterations. \code{plot} and \code{print} methods are available as well as an +#' \code{mstop} method, see \code{\link[gamboostLSS]{cvrisk.mboostLSS}}. +#' +#' @seealso \code{\link[gamboostLSS]{cvrisk.mboostLSS}} in +#' package \code{gamboostLSS}. +#' +#' @export +## wrapper for cvrisk of gamboostLSS, specifying folds on the level of curves +cvrisk.FDboostLSS <- function(object, folds = cvLong(id = object[[1]]$id, + weights = model.weights(object[[1]])), + grid = NULL, + papply = mclapply, trace = TRUE, + fun = NULL, ...){ + + ## message not necessary as currently only a scalar offset is possible for FDboostLSS-models + ## if(!length(unique(object$offset)) == 1) message("The smooth offset is fixed over all folds.") + + class(object) <- class(object)[class(object) != "FDboostLSS"] + + ## set up grid according to defaults of cvrisk.nc_mboostLSS and cvrisk.mboostLSS + if(is.null(grid)){ + + if(inherits(object, "nc_mboostLSS")){ + grid <- 1:sum(mstop(object)) + }else{ + grid <- make.grid(mstop(object)) + } + + } + + ## call cvrisk.nc_mboostLSS or cvrisk.mboostLSS + ret <- cvrisk(object = object, folds = folds, + grid = grid, + papply = papply, trace = trace, + fun = fun, ...) + return(ret) +} + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/aaa.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/aaa.R new file mode 100644 index 0000000..a5a59e7 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/aaa.R @@ -0,0 +1,18 @@ +.onAttach <- function(libname, pkgname) { + + ## get package version + vers <- packageDescription("FDboost")[["Version"]] + + packageStartupMessage("This is FDboost ", vers, ". ", + appendLF = TRUE) + return(TRUE) +} + +.onLoad <- function(libname, pkgname) { + options("mboost_indexmin" = +Inf) ### in FDboost, do not use ties in the data +} + +.onUnload <- function(libpath) { + if (is.infinite(options("mboost_indexmin")[[1]]) ) + options("mboost_indexmin" = 10000) ### use mboost-default to use ties again +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/baselearners.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/baselearners.R new file mode 100644 index 0000000..1844c62 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/baselearners.R @@ -0,0 +1,2602 @@ + +#' Functions to compute integration weights +#' +#' Computes trapezoidal integration weights (Riemann sums) for a functional variable +#' \code{X1} that has evaluation points \code{xind}. +#' +#' @param X1 for functional data that is observed on one common grid, +#' a matrix containing the observations of the functional variable. +#' For a functional variable that is observed on curve specific grids, a long vector. +#' @param xind evaluation points (index) of functional variable +#' @param id defaults to \code{NULL}. Only necessary for response in long format. +#' In this case \code{id} specifies which curves belong together. +#' @param leftWeight one of \code{c("mean", "first", "zero")}. With left Riemann sums +#' different assumptions for the weight of the first observation are possible. +#' The default is to use the mean over all integration weights, \code{"mean"}. +#' Alternatively one can use the first integration weight, \code{"first"}, or +#' use the distance to zero, \code{"zero"}. +#' +#' @aliases integrationWeightsLeft +#' +#' @details The function \code{integrationWeights()} computes trapezoidal integration weights, +#' that are symmetric. Per default those weights are used in the \code{\link{bsignal}}-base-learner. +#' In the special case of evaluation points (\code{xind}) with equal distances, +#' all integration weights are equal. +#' +#' The function \code{integrationWeightsLeft()} computes weights, +#' that take into account only the distance to the prior observation point. +#' Thus one has to decide what to do with the first observation. +#' The left weights are adequate for historical effects like in \code{\link{bhist}}. +#' +#' @seealso \code{\link{bsignal}} and \code{\link{bhist}} for the base-learners. +#' +#' @examples +#' ## Example for trapezoidal integration weights +#' xind0 <- seq(0,1,l = 5) +#' xind <- c(0, 0.1, 0.3, 0.7, 1) +#' X1 <- matrix(xind^2, ncol = length(xind0), nrow = 2) +#' +#' # Regualar observation points +#' integrationWeights(X1, xind0) +#' # Irregular observation points +#' integrationWeights(X1, xind) +#' +#' # with missing value +#' X1[1,2] <- NA +#' integrationWeights(X1, xind0) +#' integrationWeights(X1, xind) +#' +#' ## Example for left integration weights +#' xind0 <- seq(0,1,l = 5) +#' xind <- c(0, 0.1, 0.3, 0.7, 1) +#' X1 <- matrix(xind^2, ncol = length(xind0), nrow = 2) +#' +#' # Regular observation points +#' integrationWeightsLeft(X1, xind0, leftWeight = "mean") +#' integrationWeightsLeft(X1, xind0, leftWeight = "first") +#' integrationWeightsLeft(X1, xind0, leftWeight = "zero") +#' +#' # Irregular observation points +#' integrationWeightsLeft(X1, xind, leftWeight = "mean") +#' integrationWeightsLeft(X1, xind, leftWeight = "first") +#' integrationWeightsLeft(X1, xind, leftWeight = "zero") +#' +#' # obervation points that do not start with 0 +#' xind2 <- xind + 0.5 +#' integrationWeightsLeft(X1, xind2, leftWeight = "zero") +#' +#' @return Matrix with integration +#' @export +################################# +# Trapezoidal integration weights for a functional variable X1 on grid xind +# corresponds to mean of left and right Riemann integration sum +integrationWeights <- function(X1, xind, id = NULL){ + + if(is.null(id)) if(ncol(X1) != length(xind) ) stop("Dimension of xind and X1 do not match") + + # compute integraion weights for irregular data in long format + if(!is.null(id)){ + Lneu <- tapply(xind, id, FUN = function(x) { + unsorted <- is.unsorted(x, strictly = FALSE) + if(unsorted) {xorder <- order(x) + x <- sort(x)} + w <- colMeans(rbind(c(0, diff(x)), c(diff(x), 0))) + if(unsorted) w[order(xorder)] else w} ) # re-order if necessary + Lneu <- unlist(Lneu) + names(Lneu) <- NULL + return(Lneu) + } + + # sort xind values while calculating the weights + unsorted <- is.unsorted(xind, strictly = FALSE) + if(unsorted) { + xorder <- order(xind) + X1 <- X1[, xorder] + xind <- sort(xind) + } + ## special case that grid has equal distances = regular grid + if(all( abs(diff(xind) - mean(diff(xind))) < .Machine$double.eps *10^10 )){ + ## use the first difference + L <- matrix(diff(xind)[1], nrow=nrow(X1), ncol=ncol(X1)) + ##L <- matrix( 1/length(xind)*( max(xind)-min(xind) ), nrow=nrow(X1), ncol=ncol(X1)) + + }else{ ## case with irregular grid + + #Li <- c(diff(xind)[1]/2, diff(xind)[2:(length(xind)-1)], diff(xind)[length(xind)-1]/2) + + # Riemann integration weights: mean weights between left and right sum + # \int^b_a f(t) dt = sum_i (t_i-t_{i-1})*(f(t_i)) (left sum) + # Li <- c(0,diff(xind)) + + # trapezoidal + # \int^b_a f(t) dt = .5* sum_i (t_i - t_{i-1}) f(t_i) + f(t_{i-1}) = + # (t_2 - t_1)/2 * f(a=t_1) + sum^{nx-1}_{i=2} ((t_i - t_{i-1})/2 + (t_{i+1} - t_i)/2) * f(t_i) + # + (t_{nx} - t_{nx-1})/2 * f(b=t_{nx}) + Li <- colMeans(rbind(c(0,diff(xind)), c(diff(xind), 0))) + + # alternative calculation of trapezoidal weights + #diffs <- diff(xind) + #nxgrid <- length(xind) + #Li <- 0.5 * c(diffs[1], filter(diffs, filter=c(1,1))[-(nxgrid-1)], diffs[(nxgrid-1)] ) + + L <- matrix(Li, nrow=nrow(X1), ncol=ncol(X1), byrow=TRUE) + + } + + # taking into account missing values + if(anyNA(X1)){ + Lneu <- sapply(seq_len(nrow(X1)), function(i){ + x <- X1[i,] + + if(!anyNA(x)){ + l <- L[i, ] # no missing values in curve i + }else{ + xindL <- xind # lower + xindL[is.na(x)] <- NA + xindU <- xindL # upper + + if(is.na(xindL[1])){ # first observation is missing + xindL[1] <- xind[1] - diff(c(xind[1], xind[2])) + } + if(is.na(xindU[length(xind)])){ # last observation is missing + xindU[length(xind)] <- xind[length(xind)] + diff(c(xind[length(xind)-1], xind[length(xind)])) + } + + xindL <- na.locf(xindL, na.rm=FALSE) # index for lower sum + xindU <- na.locf(xindU, fromLast=TRUE, na.rm=FALSE) # index for upper sum + + l <- colMeans(rbind(c(0,diff(xindL)), c(diff(xindU), 0))) # weight is 0 for missing values + } + return(l) + } + ) + + if(unsorted) return(t(Lneu)[,order(xorder)]) else return(t(Lneu)) + + }else{ + if(unsorted) return(L[,order(xorder)]) else return(L) + } +} + + +#### Computes Riemann-weights that only take into account the distance to the previous +# observation point +# important for bhist() + +#' @rdname integrationWeights +#' @export +integrationWeightsLeft <- function(X1, xind, leftWeight = c("first", "mean", "zero")){ + + if(ncol(X1) != length(xind)) stop("Dimension of xind and X1 do not match") + unsorted <- is.unsorted(xind, strictly = FALSE) # is xind sorted? + if(unsorted) { + xorder <- order(xind) + X1 <- X1[, xorder] + xind <- sort(xind) + } + + leftWeight <- match.arg(leftWeight) + + # use lower/left Riemann sum + Li <- diff(xind) + # assume delta(xind_0) = avg. delta + Li <- switch(leftWeight, + mean = c(mean(Li), Li), + first = c(Li[1], Li), + zero = c(xind[1], Li) + ) + + L <- matrix(Li, nrow=nrow(X1), ncol=ncol(X1), byrow=TRUE) + + if(unsorted) return(L[,order(xorder)]) else return(L) # re-order if necessary +} + + +################################################################################ +### syntax for base learners is modified code of the package mboost, see bl.R + + + +################################################################################ +################################################################################ +# Base-learners for functional covariates + +### hyper parameters for signal baselearner with P-splines +hyper_signal <- function(mf, vary, inS="smooth", knots = 10, boundary.knots = NULL, degree = 3, + differences = 1, df = 4, lambda = NULL, center = FALSE, + cyclic = FALSE, constraint = "none", deriv = 0L, + Z=NULL, penalty = "ps", check.ident = FALSE, + s=NULL) { + + knotf <- function(x, knots, boundary.knots) { + if (is.null(boundary.knots)) + boundary.knots <- range(x, na.rm = TRUE) + ## At the moment only NULL or 2 boundary knots can be specified. + ## Knot expansion is done automatically on an equidistand grid. + if ((length(boundary.knots) != 2) || !boundary.knots[1] < boundary.knots[2]) + stop("boundary.knots must be a vector (or a list of vectors) ", + "of length 2 in increasing order") + if (length(knots) == 1) { + knots <- seq(from = boundary.knots[1], + to = boundary.knots[2], length = knots + 2) + knots <- knots[2:(length(knots) - 1)] + } + list(knots = knots, boundary.knots = boundary.knots) + } + + # nm <- colnames(mf)[colnames(mf) != vary] + # if (is.list(knots)) if(!all(names(knots) %in% nm)) + # stop("variable names and knot names must be the same") + # if (is.list(boundary.knots)) if(!all(names(boundary.knots) %in% nm)) + # stop("variable names and boundary.knot names must be the same") + if (!isFALSE(center) && cyclic) + stop("centering of cyclic covariates not yet implemented") + # ret <- vector(mode = "list", length = length(nm)) + # names(ret) <- nm + + ret <- knotf(s, knots, boundary.knots) + + if (cyclic && constraint != "none") + stop("constraints not implemented for cyclic B-splines") + stopifnot(is.numeric(deriv) & length(deriv) == 1) + + ## prediction is usually set in/by newX() + list(knots = ret, degree = degree, differences = differences, + df = df, lambda = lambda, center = center, cyclic = cyclic, + Ts_constraint = constraint, deriv = deriv, prediction = FALSE, + Z = Z, penalty = penalty, check.ident = check.ident, s=s, inS=inS) +} + + +### model.matrix for P-splines base-learner of signal matrix mf +### with index/time as attribute +X_bsignal <- function(mf, vary, args) { + + stopifnot(is.data.frame(mf)) + xname <- names(mf) + X1 <- as.matrix(mf) + xind <- attr(mf[[1]], "signalIndex") + if(is.null(xind)) xind <- args$s # if the attribute is NULL use the s of the model fit + + if(ncol(X1)!=length(xind)) stop(xname, ": Dimension of signal matrix and its index do not match.") + + # compute design-matrix in s-direction + Bs <- switch(args$inS, + # B-spline basis of specified degree + # "smooth" = bsplines(xind, knots=args$knots$knots, + # boundary.knots=args$knots$boundary.knots, + # degree=args$degree), + "smooth" = mboost_intern(xind, knots = args$knots$knots, + boundary.knots = args$knots$boundary.knots, + degree = args$degree, + fun = "bsplines"), + "linear" = matrix(c(rep(1, length(xind)), xind), ncol=2), + "constant"= matrix(c(rep(1, length(xind))), ncol=1)) + + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) + + + # use cyclic splines + if (args$cyclic) { + if(args$inS != "smooth") stop("Cyclic splines are only meaningful for a smooth effect.") + # Bs <- cbs(xind, knots = args$knots$knots, + # boundary.knots = args$knots$boundary.knots, + # degree = args$degree) + Bs <- mboost_intern(xind, knots = args$knots$knots, + boundary.knots = args$knots$boundary.knots, + degree = args$degree, + fun = "cbs") + } + + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) + + ### Penalty matrix: product differences matrix + if (args$differences > 0){ + if (!args$cyclic) { + K <- diff(diag(ncol(Bs)), differences = args$differences) + } else { + ## cyclic P-splines + differences <- args$differences + K <- diff(diag(ncol(Bs) + differences), + differences = differences) + tmp <- K[,(1:differences)] # save first "differences" columns + K <- K[,-(1:differences)] # drop first "differences" columns + indx <- (ncol(Bs) - differences + 1):(ncol(Bs)) + K[,indx] <- K[,indx] + tmp # add first "differences" columns + } + } else { + if (args$differences != 0) + stop(sQuote("differences"), " must be an non-negative integer") + K <- diag(ncol(Bs)) + } + + ### penalty matrix is squared difference matrix + K <- crossprod(K) + + if(args$inS != "smooth"){ + K <- diag(ncol(Bs)) + } + + #---------------------------------- + ### Calculate constraints if necessary + ### use the transformation matrix Z if necessary + ### Check whether integral over trajectories is different, then centering is advisable + ## as arbitrary constants can be added to the coefficient surface + if(is.null(args$Z) && + all( abs(rowMeans(X1, na.rm = TRUE)-mean(rowMeans(X1, na.rm = TRUE))) < .Machine$double.eps *10^10)){ + C <- t(Bs) %*% rep(1, nrow(Bs)) + Q <- qr.Q(qr(C), complete=TRUE) # orthonormal matrix of QR decomposition + args$Z <- Q[ , 2:ncol(Q)] # only keep last columns + }else{ # nicer solution that Z not produced for prediction with new data with mean 0? + args$Z <- diag(x=1, ncol=ncol(Bs), nrow=ncol(Bs)) + } + + if(!is.null(args$Z)){ + ### Transform design and penalty matrix + Bs <- Bs %*% args$Z + K <- t(args$Z) %*% K %*% args$Z + } + #---------------------------------- + + ### Weighting with matrix of functional covariate + L <- integrationWeights(X1=X1, xind=xind) + # Design matrix is product of weighted X1 and basis expansion over xind + X <- (L*X1) %*% Bs + + colnames(X) <- paste0(xname, seq_len(ncol(X))) + + ## see Scheipl and Greven (2016): + ## Identifiability in penalized function-on-function regression models + if(args$check.ident){ + res_check <- check_ident(X1=X1, L=L, Bs=Bs, K=K, xname=xname, + penalty=args$penalty) + args$penalty <- res_check$penalty + args$logCondDs <- res_check$logCondDs + args$overlapKe <- res_check$overlapKe + args$maxK <- res_check$maxK + } + + if(args$penalty == "pss"){ + # instead of using 0.1, allow for flexible shrinkage parameter in penalty_pss()? + K <- penalty_pss(K = K, difference = args$difference, shrink = 0.1) + } + + ##################################################### + ####### K <- crossprod(K) has been computed before! + if (!isFALSE(args$center)) { + + ### L = \Gamma \Omega^1/2 in Section 2.3. of + ### Fahrmeir et al. (2004, Stat Sinica); "spectralDecomp" + SVD <- eigen(K, symmetric = TRUE) + ev <- SVD$vector[, 1:(ncol(X) - args$differences), drop = FALSE] + ew <- SVD$values[1:(ncol(X) - args$differences), drop = FALSE] + # penalized part of X: X L (L^t L)^-1 + X <- X %*% ev %*% diag(1/sqrt(ew)) + + ## unpenalized part of X: + ## for differences = 2 gives equivalent results to specifying inS='linear' + # X <- X %*% Null(K) + + # attributes(X)[c("degree", "knots", "Boundary.knots")] <- tmp + K <- diag(ncol(X)) + } + ##################################################### + + ## compare specified degrees of freedom to dimension of null space + if (!is.null(args$df)){ + rns <- ncol(K) - qr(as.matrix(K))$rank # compute rank of null space + if (rns == args$df) + warning( sQuote("df"), " equal to rank of null space ", + "(unpenalized part of P-spline);\n ", + "Consider larger value for ", sQuote("df"), + ## " or set ", sQuote("center = TRUE"), + ".", immediate.=TRUE) + if (rns > args$df) + stop("not possible to specify ", sQuote("df"), + " smaller than the rank of the null space\n ", + "(unpenalized part of P-spline). Use larger value for ", + sQuote("df"), + ## " or set ", sQuote("center = TRUE"), + ".") + } + return(list(X = X, K = K, args=args)) +} + +############################################################################### + +#' Base-learners for Functional Covariates +#' +#' Base-learners that fit effects of functional covariates. +#' +#' @param x matrix of functional variable x(s). The functional covariate has to be +#' supplied as n by matrix, i.e., each row is one functional observation. +#' @param s vector for the index of the functional variable x(s) giving the +#' measurement points of the functional covariate. +#' @param time vector for the index of the functional response y(time) +#' giving the measurement points of the functional response. +#' @param index a vector of integers for expanding the covariate in \code{x} +#' For example, \code{bsignal(X, s, index = index)} is equal to \code{bsignal(X[index,], s)}, +#' where index is an integer of length greater or equal to \code{NROW(x)}. +#' @param knots either the number of knots or a vector of the positions +#' of the interior knots (for more details see \code{\link[mboost:baselearners]{bbs}}). +#' @param boundary.knots boundary points at which to anchor the B-spline basis +#' (default the range of the data). A vector (of length 2) +#' for the lower and the upper boundary knot can be specified. +#' @param degree degree of the regression spline. +#' @param differences a non-negative integer, typically 1, 2 or 3. Defaults to 1. +#' If \code{differences} = \emph{k}, \emph{k}-th-order differences are used as +#' a penalty (\emph{0}-th order differences specify a ridge penalty). +#' @param df trace of the hat matrix for the base-learner defining the +#' base-learner complexity. Low values of \code{df} correspond to a +#' large amount of smoothing and thus to "weaker" base-learners. +#' @param lambda smoothing parameter of the penalty, computed from \code{df} when \code{df} is specified. +#' @param center See \code{\link[mboost:baselearners]{bbs}}. +#' The effect is re-parameterized such that the unpenalized part of the fit is subtracted and only +#' the penalized effect is fitted, using a spectral decomposition of the penalty matrix. +#' The unpenalized, parametric part has then to be included in separate +#' base-learners using \code{bsignal(..., inS = 'constant')} or \code{bsignal(..., inS = 'linear')} +#' for first (\code{difference = 1}) and second (\code{difference = 2}) order difference penalty respectively. +#' See the help on the argument \code{center} of \code{\link[mboost:baselearners]{bbs}}. +#' @param cyclic if \code{cyclic = TRUE} the fitted coefficient function coincides at the boundaries +#' (useful for cyclic covariates such as day time etc.). +#' @param Z a transformation matrix for the design-matrix over the index of the covariate. +#' \code{Z} can be calculated as the transformation matrix for a sum-to-zero constraint in the case +#' that all trajectories have the same mean +#' (then a shift in the coefficient function is not identifiable). +#' @param penalty for \code{bsignal}, by default, \code{penalty = "ps"}, the difference penalty for P-splines is used, +#' for \code{penalty = "pss"} the penalty matrix is transformed to have full rank, +#' so called shrinkage approach by Marra and Wood (2011). +#' For \code{bfpc} the penalty can be either \code{"identity"} for a ridge penalty +#' (the default) or \code{"inverse"} to use the matrix with the inverse eigenvalues +#' on the diagonal as penalty matrix or \code{"no"} for no penalty. +#' @param check.ident use checks for identifiability of the effect, based on Scheipl and Greven (2016) +#' for linear functional effect using \code{bsignal} and +#' based on Brockhaus et al. (2017) for historical effects using \code{bhist} +#' @param standard the historical effect can be standardized with a factor. +#' "no" means no standardization, "time" standardizes with the current value of time and +#' "length" standardizes with the length of the integral +#' @param intFun specify the function that is used to compute integration weights in \code{s} +#' over the functional covariate \eqn{x(s)} +#' @param inS the functional effect can be smooth, linear or constant in s, +#' which is the index of the functional covariates x(s). +#' @param inTime the historical effect can be smooth, linear or constant in time, +#' which is the index of the functional response y(time). +#' @param limits defaults to \code{"s<=t"} for an historical effect with s<=t; +#' either one of \code{"s 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_vary = function() vary, + get_names = function(){ + attr(xname, "indname") <- indname + xname + #c(xname, indname) + }, #colnames(mf), + set_names = function(value) { + #if(length(value) != length(colnames(mf))) + if(length(value) != names(mf[1])) + stop(sQuote("value"), " must have same length as ", + sQuote("names(mf[1])")) + for (i in seq_along(value)){ + cll[[i+1]] <<- as.name(value[i]) + } + attr(mf, "names") <<- value + }) + class(ret) <- "blg" + + #print("bsignal") + #print(Z) + + # ret$dpp <- bl_lin(ret, Xfun = X_bsignal, args = temp$args) + ret$dpp <- mboost_intern(ret, Xfun = X_bsignal, args = temp$args, fun = "bl_lin") + + ## function that comoutes a design matrix such that new_des %*% hat{theta} = beta(s) + ## use ng equally spaced observation points + ret$get_des <- function(ng = 40){ + + ## use a new grid of s-values with ng grid points + s_grid <- seq(min(s), max(s), l = ng) + ## matrix with inverse integraion weights + dummyX <- I(diag(length(s_grid)) / integrationWeights(diag(length(s_grid)), s_grid )) + + ## setup for X_signal + attr(dummyX, "signalIndex") <- s_grid + attr(dummyX, "xname") <- xname + attr(dummyX, "indname") <- indname + + new_mf <- data.frame("z" = I(dummyX)) + names(new_mf) <- xname + + ## use vary and args like in bl + new_des <- X_bsignal(mf = new_mf, vary = vary, args = temp$args)$X + + ## give arguments to new_des for easier use in the plot-function + attr(new_des, "x") <- s_grid + attr(new_des, "xlab") <- indname + attr(new_des, "varname") <- xname + + return(new_des) + } + + # rm(temp) + temp$X <- NULL + temp$K <- NULL + + return(ret) +} + +# testX <- I(matrix(rnorm(40), ncol=5)) +# s <- seq(0,1,l=5) +# test <- bsignal(testX, s) +# test$get_names() +# test$get_data() +# names(test$dpp(rep(1,nrow(testX)))) +######################## + + +################################# +# Base-learner for concurrent effect of functional covariate + +### model.matrix for P-splines base-learner of signal matrix mf +X_conc <- function(mf, vary, args) { + + stopifnot(is.data.frame(mf)) + xname <- names(mf) + X1 <- as.matrix(mf) + class(X1) <- "matrix" + xind <- attr(mf[[1]], "signalIndex") + yind <- attr(mf[[1]], "indexY") + if(is.null(xind)) xind <- args$s # if the attribute is NULL use the s of the model fit + if(is.null(yind)) yind <- args$time # if the attribute is NULL use the time of the model fit + + nobs <- nrow(X1) + + # get id-variable + id <- attr(mf[,xname], "id") # for data in long format + # id is NULL for regular response + # id has values 1, 2, 3, ... for response in long format + + ## is that line still necessary? + ## important for prediction, otherwise id=NULL and yind is multiplied accordingly + if(is.null(id)) id <- seq_len(nrow(X1)) + + ## check yind + if(args$format=="long" && length(yind)!=length(id)) stop(xname, ": Index of response and id do not have the same length") + ## check dimensions of s and x(s) + if(args$format=="wide" && ncol(X1)!=length(xind)) stop(xname, ": Dimension of signal matrix and its index do not match.") + if(args$format=="long" && nrow(X1)!=length(xind)) stop(xname, ": Dimension of signal matrix and its index do not match.") + + # compute design-matrix in s-direction + Bs <- switch(args$inS, + # B-spline basis of specified degree + # "smooth" = bsplines(xind, knots=args$knots$s$knots, + # boundary.knots=args$knots$s$boundary.knots, + # degree=args$degree), + "smooth" = mboost_intern(xind, knots = args$knots$s$knots, + boundary.knots = args$knots$s$boundary.knots, + degree = args$degree, + fun = "bsplines"), + "linear" = matrix(c(rep(1, length(xind)), xind), ncol = 2), + "constant"= matrix(c(rep(1, length(xind))), ncol = 1)) + + # use cyclic splines + if (args$cyclic) { + if(args$inS != "smooth") stop("Cyclic splines are only meaningful for a smooth effect.") + Bs <- mboost_intern(xind, knots = args$knots$s$knots, + boundary.knots = args$knots$s$boundary.knots, + degree = args$degree, + fun = "cbs") + } + + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) + + # set up design matrix for concurrent model + if(args$format=="wide"){ + listCol <- list() + for(i in seq_len(ncol(X1))){ + listCol[[i]] <- X1[,i] + } + X1des <- as.matrix(bdiag(listCol)) + # Design matrix is product of expanded X1 and basis expansion over xind + X <- (X1des) %*% Bs + rm(X1des, listCol) + }else{ + # Design matrix contains rows x_i(t_{ig_i})*Bs[at row t_{ig_i},] + X <- X1[,1]*Bs + } + + ### Penalty matrix: product differences matrix + differenceMatrix <- diff(diag(ncol(X)), differences = args$differences) + K <- crossprod(differenceMatrix) + + ## compare specified degrees of freedom to dimension of null space + if (!is.null(args$df)){ + rns <- ncol(K) - qr(as.matrix(K))$rank # compute rank of null space + if (rns == args$df) + warning( sQuote("df"), " equal to rank of null space ", + "(unpenalized part of P-spline);\n ", + "Consider larger value for ", sQuote("df"), + ## " or set ", sQuote("center = TRUE"), + ".", immediate.=TRUE) + if (rns > args$df) + stop("not possible to specify ", sQuote("df"), + " smaller than the rank of the null space\n ", + "(unpenalized part of P-spline). Use larger value for ", + sQuote("df"), + ## " or set ", sQuote("center = TRUE"), + ".") + } + + # tidy up workspace + rm(X1) + + return(list(X = X, K = K, args = args)) +} + +#' @rdname bsignal +#' @export +### P-spline base learner for signal matrix with index vector +bconcurrent <- function(x, s, time, index = NULL, #by = NULL, + knots = 10, boundary.knots = NULL, degree = 3, differences = 1, df = 4, + lambda = NULL, #center = FALSE, + cyclic = FALSE +){ + + if (!is.null(lambda)) df <- NULL + + cll <- match.call() + cll[[1]] <- as.name("bconcurrent") + #print(cll) + + if(!mboost_intern(x, fun = "isMATRIX") && is.null(index)) stop("signal has to be a matrix for regular response") + if( mboost_intern(x, fun = "isMATRIX") && NCOL(x)!=length(s)) stop("Dimension of x and s do not match.") + if(!mboost_intern(x, fun = "isMATRIX") && length(x)!=length(s)) stop("Dimension of x and s do not match.") + + varnames <- all.vars(cll) + + if(!is.atomic(s)) stop("index of signal has to be a vector") + if(!is.atomic(time)) stop("index of response has to be a vector") + + if(substitute(time)==substitute(s)){ + #warning("Do not use the same variable t as time-variable in y(t) and in x(t).") + warning("Do not use the same variable for s and time in bconcurrent().") + } + + # compare range of index signal and index response + # the index of the signal s, has to contain all values of time + if( !all(s %in% time) ) stop("Index s of functional variable has to contain all values of time.") + + # Reshape mfL so that it is the dataframe of the signal with the index as attribute + xname <- varnames[1] + indname <- varnames[2] + indnameY <- varnames[3] + if(length(varnames)==2) indnameY <- varnames[2] + attr(x, "indexY") <- time + attr(x, "indnameY") <- indnameY + attr(x, "id") <- index + + if(mboost_intern(x, fun = "isMATRIX") && + is.null(colnames(x))) colnames(x) <- paste(xname, seq_len(ncol(x)), sep="_") + attr(x, "signalIndex") <- s + attr(x, "xname") <- xname + attr(x, "indname") <- indname + + mf <- data.frame("z"=I(x)) + names(mf) <- xname + + # if(all(round(colSums(mf, na.rm = TRUE), 4)!=0)){ + # warning(xname, " is not centered. + # Functional covariates should be mean-centered in each measurement point.") + # } + + # mf <- mfL + # names(mf) <- varnames + + vary <- "" + + # CC <- all(Complete.cases(mf)) + CC <- all(mboost_intern(mf, fun = "Complete.cases")) + if (!CC) + warning("base-learner contains missing values;\n", + "missing values are excluded per base-learner, ", + "i.e., base-learners may depend on different", + " numbers of observations.") + + #index <- NULL + + if(is.null(index)){ + ### X_conc for data in wide format with regular response + temp <- X_conc(mf, vary, + args = hyper_hist(mf, vary, knots = knots, boundary.knots = boundary.knots, + degree = degree, differences = differences, + df = df, lambda = lambda, center = FALSE, cyclic = cyclic, + s = s, time=time, limits = NULL, + inS = "smooth", inTime = "smooth", + penalty = "ps", check.ident = FALSE, + format="wide")) + }else{ + ### X_conc for data in long format with irregular response + temp <- X_conc(mf, vary, + args = hyper_hist(mf, vary, knots = knots, boundary.knots = boundary.knots, + degree = degree, differences = differences, + df = df, lambda = lambda, center = FALSE, cyclic = cyclic, + s = s, time=time, limits = NULL, + inS = "smooth", inTime = "smooth", + penalty = "ps", check.ident = FALSE, + format="long")) + } + + ret <- list(model.frame = function() + if (is.null(index)) return(mf) else{ + mftemp <- mf + mf <- mftemp[index,,drop = FALSE] # this is necessary to pass the attributes + attributes(mftemp[,xname]) + attr(mf[,xname], "signalIndex") <- attr(mftemp[,xname], "signalIndex") + attr(mf[,xname], "xname") <- attr(mftemp[,xname], "xname") + attr(mf[,xname], "indname") <- attr(mftemp[,xname], "indname") + attr(mf[,xname], "indexY") <- attr(mftemp[,xname], "indexY") + attr(mf[,xname], "indnameY") <- attr(mftemp[,xname], "indnameY") + attr(mf[,xname], "id") <- attr(mftemp[,xname], "id") + return(mf) + }, + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + ## set index to NULL, as the index is treated within X_conc() + ##get_index = function() index, + get_index = function() NULL, + get_vary = function() vary, + get_names = function(){ + attr(xname, "indname") <- indname + attr(xname, "indnameY") <- indnameY + xname + }, #colnames(mf), + set_names = function(value) { + #if(length(value) != length(colnames(mf))) + if(length(value) != names(mf[1])) + stop(sQuote("value"), " must have same length as ", + sQuote("names(mf[1])")) + for (i in seq_along(value)){ + cll[[i+1]] <<- as.name(value[i]) + } + attr(mf, "names") <<- value + }) + class(ret) <- "blg" + + # ret$dpp <- bl_lin(ret, Xfun = X_conc, args = temp$args) + ret$dpp <- mboost_intern(ret, Xfun = X_conc, args = temp$args, fun = "bl_lin") + + return(ret) +} + +# testX <- I(matrix(rnorm(40), ncol=5)) +# s <- seq(0,1,l=5) +# test <- bconcurrent(testX, s) +# test$get_names() +# test$get_data() +# names(test$dpp(rep(1,nrow(testX)))) + + + + + + +################################# +#### Base-learner for historic effect of functional covariate +### with integral over specific limits, e.g. s<=t + +### hyper parameters for signal baselearner with P-splines +hyper_hist <- function(mf, vary, knots = 10, boundary.knots = NULL, degree = 3, + differences = 1, df = 4, lambda = NULL, center = FALSE, + cyclic = FALSE, constraint = "none", deriv = 0L, + Z=NULL, s=NULL, time=NULL, limits=NULL, + standard="no", intFun=integrationWeightsLeft, + inS="smooth", inTime="smooth", + penalty = "ps", check.ident = FALSE, + format="long") { + + knotf <- function(x, knots, boundary.knots) { + if (is.null(boundary.knots)) + boundary.knots <- range(x, na.rm = TRUE) + ## At the moment only NULL or 2 boundary knots can be specified. + ## Knot expansion is done automatically on an equidistand grid. + if ((length(boundary.knots) != 2) || !boundary.knots[1] < boundary.knots[2]) + stop("boundary.knots must be a vector (or a list of vectors) ", + "of length 2 in increasing order") + if (length(knots) == 1) { + knots <- seq(from = boundary.knots[1], + to = boundary.knots[2], length = knots + 2) + knots <- knots[2:(length(knots) - 1)] + } + list(knots = knots, boundary.knots = boundary.knots) + } + + # nm <- colnames(mf)[colnames(mf) != vary] + # if (is.list(knots)) if(!all(names(knots) %in% nm)) + # stop("variable names and knot names must be the same") + # if (is.list(boundary.knots)) if(!all(names(boundary.knots) %in% nm)) + # stop("variable names and boundary.knot names must be the same") + if (!isFALSE(center) && cyclic) + stop("centering of cyclic covariates not yet implemented") + # ret <- vector(mode = "list", length = length(nm)) + # names(ret) <- nm + + ret <- vector(mode = "list", length = 2) + indVars <- c("s","time") + names(ret) <- indVars + for (n in 1:2) ret[[n]] <- knotf(get(indVars[[n]]), if (is.list(knots)) + knots[[n]] + else knots, if (is.list(boundary.knots)) + boundary.knots[[n]] + else boundary.knots) + + if (cyclic && constraint != "none") + stop("constraints not implemented for cyclic B-splines") + stopifnot(is.numeric(deriv) & length(deriv) == 1) + + ## prediction is usually set in/by newX() + list(knots = ret, degree = degree, differences = differences, + df = df, lambda = lambda, center = center, cyclic = cyclic, + Ts_constraint = constraint, deriv = deriv, prediction = FALSE, + Z = Z, s = s, time = time, limits = limits, + standard = standard, intFun = intFun, + inS = inS, inTime = inTime, + penalty = penalty, check.ident = check.ident, format = format) +} + + +### model.matrix for P-splines base-learner of signal matrix mf +### for response observed over a common grid, args$format="wide" +### or irregularly observed reponse, args$format="long" +X_hist <- function(mf, vary, args) { + + stopifnot(is.data.frame(mf)) + xname <- names(mf) + X1 <- as.matrix(mf) + class(X1) <- "matrix" + xind <- attr(mf[[1]], "signalIndex") + yind <- attr(mf[[1]], "indexY") + + if(is.null(xind)) xind <- args$s # if the attribute is NULL use the s of the model fit + if(is.null(yind)) yind <- args$time # if the attribute is NULL use the time of the model fit + + nobs <- nrow(X1) + + # get id-variable + id <- attr(mf[,xname], "id") # for data in long format + # id is NULL for regular response + # id has values 1, 2, 3, ... for response in long format + + ## is that line still necessary? should it be there in long and wide format? + ###### EXTRA LINE in comparison to X_hist + ## important for prediction, otherwise id=NULL and yind is multiplied accordingly + if(is.null(id)) id <- seq_len(nrow(X1)) + + ## check yind + if(args$format=="long" && length(yind)!=length(id)) stop(xname, ": Index of response and id do not have the same length") + ## check dimensions of s and x(s) + if(ncol(X1)!=length(xind)) stop(xname, ": Dimension of signal matrix and its index do not match.") + + # compute design-matrix in s-direction + Bs <- switch(args$inS, + # B-spline basis of specified degree + #"smooth" = bsplines(xind, knots=args$knots$s$knots, + # boundary.knots=args$knots$s$boundary.knots, + # degree=args$degree), + "smooth" = mboost_intern(xind, knots = args$knots$s$knots, + boundary.knots = args$knots$s$boundary.knots, + degree = args$degree, + fun = "bsplines"), + "linear" = matrix(c(rep(1, length(xind)), xind), ncol = 2), + "constant"= matrix(c(rep(1, length(xind))), ncol = 1)) + + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) + + # integration weights + L <- args$intFun(X1=X1, xind=xind) + # print(L[1,]) + + ## Weighting with matrix of functional covariate + #X1 <- L*X1 ## -> do the integration weights more sophisticated!! + + # # set up design matrix for historical model and s<=t with s and t equal to xind + # # expand matrix of original observations to lower triangular matrix + # X1des0 <- matrix(0, ncol=ncol(X1), nrow=ncol(X1)*nrow(X1)) + # for(i in seq_len(ncol(X1des0))){ + # #print(nrow(X1)*(i-1)+1) + # X1des0[(nrow(X1)*(i-1)+1):nrow(X1des0) ,i] <- X1[,i] # use fun. variable * integration weights + # } + + ## set up design matrix for historical model according to args$limits() + # use the argument limits (Code taken of function ff(), package refund) + limits <- args$limits + if (!is.null(limits)) { + if (!is.function(limits)) { + if (!(limits %in% c("s argument unknown") + } + if (limits == "s argument cannot be NULL.") + } + + ## save the limits function in the arguments + args$limits <- limits + + ### use function limits to set up design matrix according to function limits + ### by setting 0 at the time-points that should not be used + if(args$format == "wide"){ + ## expand yind by replication to the yind of all observations together + ind0 <- !t(outer( xind, rep(yind, each=nobs), limits) ) + yindHelp <- rep(yind, each=nobs) + }else{ + ## yind is over all observations in long format + ind0 <- !t(outer( xind, yind, limits) ) + yindHelp <- yind + } + + ### Compute the design matrix as sparse or normal matrix + ### depending on dimensions of the final design matrix + MATRIX <- any(c(nrow(ind0), ncol(Bs)) > c(50, 50)) #MATRIX <- any(dim(X) > c(500, 50)) + MATRIX <- MATRIX && options("mboost_useMatrix")$mboost_useMatrix + + if(MATRIX){ + #message("use sparse matrix in X_hist") + diag <- Diagonal + ###### more efficient construction of X1des directly as sparse matrix + # ### compute the design matrix as sparse matrix + # if(args$format == "wide"){ + # tempIndexDesign <- which(!ind0, arr.ind=TRUE) + # tempIndexX1 <- cbind(rep(1:nobs, length.out=nrow(tempIndexDesign)), tempIndexDesign[,2] ) + # X1des <- sparseMatrix(i=tempIndexDesign[,1], j=tempIndexDesign[,2], + # x=X1[tempIndexX1], dims=dim(ind0)) + # # object.size(X1des) + # rm(tempIndexX1, tempIndexDesign) + # }else{ # long format + # tempj <- unlist(apply(!ind0, 1, which)) # in which columns are the values? + # ## i: row numbers: one row number per observation of response, + # # repeat the row number for each entry + # X1des <- sparseMatrix(i=rep(seq_along(id), times=rowSums(!ind0)), j=tempj, + # x=X1[cbind(rep(id, t=rowSums(!ind0)), tempj)], dims=dim(ind0)) + # # object.size(X1des) + # rm(tempj) + # } + + ###### instead: build the matrix as dense matrix and convert it into a sparse matrix + if(args$format == "wide"){ + ### expand the design matrix for all observations (yind is equal for all observations!) + ### the response is a vector (y1(t1), y2(t1), ... , yn(t1), yn(tG)) + X1des <- X1[rep(1:nobs, times=length(yind)), ] + } else{ # yind is over all observations in long format + X1des <- X1[id, ] + } + X1des[ind0] <- 0 + X1des <- Matrix(X1des, sparse=TRUE) # convert into sparse matrix + + }else{ # small matrices: do not use Matrix + if(args$format == "wide"){ + ### expand the design matrix for all observations (yind is equal for all observations!) + ### the response is a vector (y1(t1), y2(t1), ... , yn(t1), yn(tG)) + X1des <- X1[rep(1:nobs, times=length(yind)), ] + } else{ # yind is over all observations in long format + X1des <- X1[id, ] + } + X1des[ind0] <- 0 + } + + ## set up matrix with adequate integration and standardization weights + ## start with a matrix of integration weights + ## case of "no" standardization + Lnew <- args$intFun(X1des, xind) + Lnew[ind0] <- 0 + + ## Standardize with exact length of integration interval + ## (1/t-t0) \int_{t0}^t f(s) ds + if(args$standard == "length"){ + ## use fundamental theorem of calculus + ## \lim t->t0- (1/t-t0) \int_{t0}^t f(s) ds = f(t0) + ## -> integration weight in s-direction should be 1 + ## integration weights in s-direction always sum exactly to 1, + ## good for small number of observations! + args$vecStand <- rowSums(Lnew) + args$vecStand[args$vecStand==0] <- 1 ## cannnot divide 0/0, instead divide 0/1 + Lnew <- Lnew * 1/args$vecStand + } + + ## use time of current observation for standardization + ## (1/t) \int_{t0}^t f(s) ds + if(args$standard=="time"){ + if(any(yindHelp <= 0)) stop("For standardization with time, time must be positive.") + ## Lnew <- matrix(1, ncol=ncol(X1des), nrow=nrow(X1des)) + ## Lnew[ind0] <- 0 + ## use fundamental theorem of calculus + ## \lim t->0+ (1/t) \int_0^t f(s) ds = f(0), if necessary + ## (as previously X*L, use now X*(1/L) for cases with one single point) + yindHelp[yindHelp==0] <- L[1,1] # impossible! + # standFact <- 1/yindHelp + args$vecStand <- yindHelp + Lnew <- Lnew * 1/yindHelp + } + ## print(round(Lnew, 2)) + ## print(rowSums(Lnew)) + ## print(args$vecStand) + + # multiply design matrix with integration weights and standardization weights + X1des <- X1des * Lnew + + # Design matrix is product of expanded X1 and basis expansion over xind + X1des <- X1des %*% Bs + + + ## see Scheipl and Greven (2016): Identifiability in penalized function-on-function regression models + if(args$check.ident && args$inS == "smooth"){ + K1 <- diff(diag(ncol(Bs)), differences = args$differences) + K1 <- crossprod(K1) + # use the limits function to compute check measures on corresponding subsets of x(s) and B_j + res_check <- check_ident(X1 = X1, L = L, Bs = Bs, K = K1, xname = xname, + penalty = args$penalty, + limits = args$limits, + yind = yindHelp, id = id, # yind in long format + X1des = X1des, ind0 = ind0, xind = xind) + args$penalty <- res_check$penalty + args$logCondDs <- res_check$logCondDs + args$logCondDs_hist <- res_check$logCondDs_hist + args$overlapKe <- res_check$overlapKe + args$cumOverlapKe <- res_check$cumOverlapKe + args$maxK <- res_check$maxK + } + + # wide: design matrix over index of response for one response + # long: design matrix over index of response (yind has long format!) + Bt <- switch(args$inTime, + # B-spline basis of specified degree + #"smooth" = bsplines(yind, knots=args$knots$time$knots, + # boundary.knots=args$knots$time$boundary.knots, + # degree=args$degree), + "smooth" = mboost_intern(yind, knots = args$knots$time$knots, + boundary.knots = args$knots$time$boundary.knots, + degree = args$degree, + fun = "bsplines"), + "linear" = matrix(c(rep(1, length(yind)), yind), ncol = 2), + "constant"= matrix(c(rep(1, length(yind))), ncol = 1)) + + # stack design-matrix of response nobs times in wide format + if(args$format == "wide"){ + Bt <- Bt[rep(seq_along(yind), each=nobs), ] + } + + if(! mboost_intern(Bt, fun = "isMATRIX") ) Bt <- matrix(Bt, ncol=1) + + # calculate row-tensor + # X <- (X1 %x% t(rep(1, ncol(X2))) ) * ( t(rep(1, ncol(X1))) %x% X2 ) + dimnames(Bt) <- NULL # otherwise warning "dimnames [2] mismatch..." + X <- X1des[, rep(seq_len(ncol(Bs)), each=ncol(Bt))] * Bt[, rep(seq_len(ncol(Bt)), times=ncol(Bs))] + + if(! mboost_intern(X, fun = "isMATRIX") ) X <- matrix(X, ncol=1) + + colnames(X) <- paste0(xname, seq_len(ncol(X))) + + ### Penalty matrix: product differences matrix for smooth effect + if(args$inS == "smooth"){ + K1 <- diff(diag(ncol(Bs)), differences = args$differences) + K1 <- crossprod(K1) + if(args$penalty == "pss"){ + # instead of using 0.1, allow for flexible shrinkage parameter in penalty_pss()? + K1 <- penalty_pss(K = K1, difference = args$difference, shrink = 0.1) + } + }else{ # Ridge-penalty + K1 <- diag(ncol(Bs)) + } + #K1 <- matrix(0, ncol=ncol(Bs), nrow=ncol(Bs)) + #print(args$penalty) + + if(args$inTime == "smooth"){ + K2 <- diff(diag(ncol(Bt)), differences = args$differences) + K2 <- crossprod(K2) + }else{ + K2 <- diag(ncol(Bt)) + } + + # compute penalty matrix for the whole effect + suppressMessages(K <- kronecker(K1, diag(ncol(Bt))) + + kronecker(diag(ncol(Bs)), K2)) + + ## compare specified degrees of freedom to dimension of null space + if (!is.null(args$df)){ + rns <- ncol(K) - qr(as.matrix(K))$rank # compute rank of null space + if (rns == args$df) + warning( sQuote("df"), " equal to rank of null space ", + "(unpenalized part of P-spline);\n ", + "Consider larger value for ", sQuote("df"), + ## " or set ", sQuote("center = TRUE"), + ".", immediate.=TRUE) + if (rns > args$df) + stop("not possible to specify ", sQuote("df"), + " smaller than the rank of the null space\n ", + "(unpenalized part of P-spline). Use larger value for ", + sQuote("df"), + ## " or set ", sQuote("center = TRUE"), + ".") + } + + # save matrices to compute identifiability checks + args$Bs <- Bs + args$X1des <- X1des + args$K1 <- K1 + args$L <- L + + # tidy up workspace + rm(Bs, Bt, ind0, X1des, X1, L) + + return(list(X = X, K = K, args = args)) +} + + + +### P-spline base learner for signal matrix with index vector +### for historical model according to function limit, defaults to s<=t +#' @rdname bsignal +#' @export +bhist <- function(x, s, time, index = NULL, #by = NULL, + limits="s<=t", standard=c("no", "time", "length"), ##, "transform" + intFun=integrationWeightsLeft, + inS=c("smooth","linear","constant"), inTime=c("smooth","linear","constant"), + knots = 10, boundary.knots = NULL, degree = 3, differences = 1, df = 4, + lambda = NULL, #center = FALSE, cyclic = FALSE + penalty = c("ps", "pss"), check.ident = FALSE +){ + + if (!is.null(lambda)) df <- NULL + + cll <- match.call() + cll[[1]] <- as.name("bhist") + #print(cll) + penalty <- match.arg(penalty) + #print(penalty) + + standard <- match.arg(standard) + + inS <- match.arg(inS) + inTime <- match.arg(inTime) + #print(inS) + + if(! mboost_intern(x, fun = "isMATRIX") ) stop("signal has to be a matrix") + if(ncol(x) != length(s)) stop("Dimension of x and s do not match.") + + varnames <- all.vars(cll) + + if(!is.atomic(s)) stop("index of signal has to be a vector") + if(!is.atomic(time)) stop("index of response has to be a vector") + + if(substitute(time)==substitute(s)){ + #warning("Do not use the same variable t as time-variable in y(t) and in x(t).") + warning("Do not use the same variable for s and time in bhist().") + } + + # compare range of index signal and index response + # minimal value of the signal-index has to be smaller than the response-index + if(!is.function(limits)){ + if(limits=="s<=t" && min(s) > min(time) ) stop("Index of response has values before index of signal.") + } + + # Reshape mfL so that it is the dataframe of the signal with + # the index of the signal and the index of the response as attributes + xname <- varnames[1] + indname <- varnames[2] + indnameY <- varnames[3] + if(length(varnames)==2) indnameY <- varnames[2] + if(is.null(colnames(x))) colnames(x) <- paste(xname, seq_len(ncol(x)), sep="_") + attr(x, "signalIndex") <- s + attr(x, "xname") <- xname + attr(x, "indname") <- indname + attr(x, "indexY") <- time + attr(x, "indnameY") <- indnameY + attr(x, "id") <- index + + mf <- data.frame("z"=I(x)) + names(mf) <- xname + + if(!all( abs(colMeans(x, na.rm = TRUE)) < .Machine$double.eps*10^10)){ + message(xname, " is not centered per column, inducing a non-centered effect.") + } + + # mf <- mfL + # names(mf) <- varnames + + vary <- "" + + # CC <- all(Complete.cases(mf)) + CC <- all(mboost_intern(mf, fun = "Complete.cases")) + if (!CC) + warning("base-learner contains missing values;\n", + "missing values are excluded per base-learner, ", + "i.e., base-learners may depend on different", + " numbers of observations.") + + #index <- NULL + + ## call X_hist in oder to compute parameter settings, e.g. + ## the transformation matrix Z, shrinkage penalty, identifiability problems... + if(is.null(index)){ + ### X_hist for data in wide format with regular response + temp <- X_hist(mf, vary, + args = hyper_hist(mf, vary, knots = knots, boundary.knots = boundary.knots, + degree = degree, differences = differences, + df = df, lambda = lambda, center = FALSE, cyclic = FALSE, + s = s, time=time, limits = limits, + standard = standard, intFun = intFun, + inS = inS, inTime = inTime, + penalty = penalty, check.ident = check.ident, + format="wide")) + }else{ + ### X_hist for data in long format with irregular response + temp <- X_hist(mf, vary, + args = hyper_hist(mf, vary, knots = knots, boundary.knots = boundary.knots, + degree = degree, differences = differences, + df = df, lambda = lambda, center = FALSE, cyclic = FALSE, + s = s, time=time, limits = limits, + standard = standard, intFun = intFun, + inS = inS, inTime = inTime, + penalty = penalty, check.ident = check.ident, + format="long")) + } + temp$args$check.ident <- FALSE + + ret <- list(model.frame = function() + if (is.null(index)) return(mf) else{ + mftemp <- mf + mf <- mftemp[index,,drop = FALSE] # this is necessary to pass the attributes + attributes(mftemp[,xname]) + attr(mf[,xname], "signalIndex") <- attr(mftemp[,xname], "signalIndex") + attr(mf[,xname], "xname") <- attr(mftemp[,xname], "xname") + attr(mf[,xname], "indname") <- attr(mftemp[,xname], "indname") + attr(mf[,xname], "indexY") <- attr(mftemp[,xname], "indexY") + attr(mf[,xname], "indnameY") <- attr(mftemp[,xname], "indnameY") + attr(mf[,xname], "id") <- attr(mftemp[,xname], "id") + return(mf) + } , + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + ## set index to NULL, as the index is treated within X_hist() + ##get_index = function() index, + get_index = function() NULL, + get_vary = function() vary, + get_names = function(){ + attr(xname, "indname") <- indname + attr(xname, "indnameY") <- indnameY + xname + }, #colnames(mf), + set_names = function(value) { + #if(length(value) != length(colnames(mf))) + if(length(value) != names(mf[1])) + stop(sQuote("value"), " must have same length as ", + sQuote("names(mf[1])")) + for (i in seq_along(value)){ + cll[[i+1]] <<- as.name(value[i]) + } + attr(mf, "names") <<- value + }) + class(ret) <- "blg" + + ### X_hist is for data in wide format with regular response + # ret$dpp <- bl_lin(ret, Xfun = X_hist, args = temp$args) + ret$dpp <- mboost_intern(ret, Xfun = X_hist, args = temp$args, fun = "bl_lin") + + # ## function that comoutes a design matrix such that new_des %*% hat{theta} = beta(s) + # ## use ng equally spaced observation points + # ret$get_des <- function(ng = 40){ + # + # ## use a new grid of s-values with ng grid points + # s_grid <- seq(min(s), max(s), l = ng) + # time_grid <- seq(min(time), max(time), l = ng) + # ## matrix with inverse integraion weights + # dummyX <- I( diag(length(s_grid)) / intFun(diag(length(s_grid)), s_grid ) ) + # + # ## setup for X_signal + # attr(dummyX, "signalIndex") <- s_grid + # attr(dummyX, "xname") <- xname + # attr(dummyX, "indname") <- indname + # attr(x, "indexY") <- time_grid + # attr(x, "indnameY") <- indnameY + # attr(x, "id") <- index + # + # new_mf <- data.frame("z" = I(dummyX)) + # names(new_mf) <- xname + # + # ## use vary and args like in bl + # new_des <- X_hist(mf = new_mf, vary = vary, args = temp$args)$X + # + # ## give arguments to new_des for easier use in the plot-function + # attr(new_des, "x") <- s_grid + # attr(new_des, "xlab") <- indname + # attr(new_des, "y") <- time_grid + # attr(new_des, "ylab") <- indnameY + # attr(new_des, "varname") <- xname + # + # return(new_des) + # } + + return(ret) +} + +# testX <- I(matrix(rnorm(40), ncol=5)) +# s <- seq(0,1,l=5) +# time <- s +# test <- bhist(testX, s, time, knots=5, df=5) +# test$get_names() +# test$get_data() +# names(test$dpp(rep(1,nrow(testX)))) +# extract(test)[1:10, 1:20] + + +### hyper parameters for signal baselearner with eigenfunctions as bases, FPCA-based +hyper_fpc <- function(mf, vary, df = 4, lambda = NULL, + pve = 0.99, npc = NULL, npc.max = 15, getEigen=TRUE, + s=NULL, penalty = "identity") { + ## prediction is usually set in/by newX() + list(df = df, lambda = lambda, pve = pve, npc = npc, npc.max = npc.max, + getEigen = getEigen, s = s, penalty = penalty, prediction = FALSE) +} + +### model.matrix for FPCA based functional base-learner +X_fpc <- function(mf, vary, args) { + + stopifnot(is.data.frame(mf)) + xname <- names(mf) + X1 <- as.matrix(mf) + xind <- attr(mf[[1]], "signalIndex") + if(is.null(xind)) xind <- args$s # if the attribute is NULL use the s of the model fit + #print(xind) + + if(ncol(X1) != length(xind)) stop(xname, ": Dimension of signal matrix and its index do not match.") + + ## do FPCA on X1 (code of refund::ffpc adapted) using xind as argvals + if(is.null(args$klX)){ + + decomppars <- list(argvals = xind, pve = args$pve, npc = args$npc, useSymm = TRUE) + decomppars$Y <- X1 + ## functional covariate is per default centered per time-point + klX <- do.call(refund::fpca.sc, decomppars) + + ## add the solution of the decomposition to args + args$klX <- klX + args$klX$xind <- xind + + ## only use part of the eigen-functions! + args$subset <- seq_len(min(ncol(klX$scores), args$npc.max)) + ## args$a <- max(xind) - min(xind) + + ## scores \xi_{ik}: rows i=1,..., N and columns k=1,...,K + ## are the design matrix + X <- klX$scores[ , args$subset, drop = FALSE] + + ## scores can be computed as \xi_{ik}=\int X1cen_i(s) \phi_k(s) ds + ## all(round(klX$scores,6) == round(scale(X1, center=klX$mu, scale=FALSE) %*% klX$efunctions, 6)) + + }else{ + + klX <- args$klX + ## compute scores on new X1 observations + if(ncol(X1) == length(klX$mu) && all(args$s == xind)){ + ## is the same as "X <- klX$scores[ , args$subset, drop = FALSE]" if klX is FPCA on X1 + X <- (scale(X1, center=klX$mu, scale=FALSE) %*% klX$efunctions)[ , args$subset, drop = FALSE] + ## use integration weights? + # X <- 1/args$a*(scale(X1, center=klX$mu, scale=FALSE) %*% klX$efunctions)[ , args$subset, drop = FALSE] + }else{ + ##stop("In bfpc the grid for the functional covariate has to be the same as in the model fit!") + ## linear interpolation of the basis functions + approxEfunctions <- matrix(NA, nrow=length(xind), ncol=length(args$subset)) + for(i in seq_len(ncol(klX$efunctions[, args$subset, drop = FALSE]))){ + approxEfunctions[,i] <- approx(x=args$klX$xind, y=klX$efunctions[,i], xout=xind)$y + } + approxMu <- approx(x=args$klX$xind, y=klX$mu, xout=xind)$y + X <-(scale(X1, center=approxMu, scale=FALSE) %*% approxEfunctions) + ## use integration weights? + # X <- 1/args$a*(scale(X1, center=approxMu, scale=FALSE) %*% approxEfunctions) + } + + } + + colnames(X) <- paste0(xname, ".PC", seq_len(ncol(X))) + + ## set up the penalty matrix + K <- switch(args$penalty, + ### use the identity matrix for penalization + ### all eigenfunctions are penalized with the same strength + identity = diag(rep(1, length = length(args$subset))), + ## Penalty matrix: diagonal matrix of inverse eigen-values + ## implicit assumption: important eigen-functions of X process + ## are more important in shape of beta + inverse = diag(1 / klX$evalues[args$subset]), + ### no penalty at all, as regularization is done by truncating the number of PCs used + ### gives bad estimates + no = matrix(0, ncol = length(args$subset), nrow = length(args$subset)) + ) + + return(list(X = X, K = K, args = args)) +} + + + +############################################################################### +### FPCA based base-learner for signal matrix with index vector +### inspired by refund::fpca.sc +#' @rdname bsignal +#' @export +bfpc <- function(x, s, index = NULL, df = 4, + lambda = NULL, penalty = c("identity", "inverse", "no"), + pve = 0.99, npc = NULL, npc.max = 15, getEigen=TRUE +){ + + if (!is.null(lambda)) df <- NULL + + cll <- match.call() + cll[[1]] <- as.name("bfpc") + penalty <- match.arg(penalty) + + if (!requireNamespace("refund", quietly = TRUE)) + stop("The package refund is needed for the function 'fpca.sc'.\nTo use the bfpc baseleaner, please install the package 'refund'.") + if(! mboost_intern(x, fun = "isMATRIX") ) + stop("signal has to be a matrix") + + varnames <- all.vars(cll) + + # Reshape mfL so that it is the dataframe of the signal with the index as attribute + xname <- varnames[1] + indname <- varnames[2] + if(is.null(colnames(x))) colnames(x) <- paste(xname, seq_len(ncol(x)), sep="_") + attr(x, "signalIndex") <- s + attr(x, "xname") <- xname + attr(x, "indname") <- indname + + mf <- data.frame("z"=I(x)) + names(mf) <- xname + + vary <- "" + + ## improvement: for a FPCA based base-learner the X can contain missings! + # CC <- all(Complete.cases(mf)) + CC <- all(mboost_intern(mf, fun = "Complete.cases")) + if (!CC) + warning("base-learner contains missing values;\n", + "missing values are excluded per base-learner, ", + "i.e., base-learners may depend on different", + " numbers of observations.") + + #index <- NULL + + ## call X_fpc in oder to compute parameter settings, e.g. + ## the basis functions, based on FPCA + temp <- X_fpc(mf, vary, + args = hyper_fpc(mf, vary, df = df, lambda = lambda, + pve = pve, npc = npc, npc.max = npc.max, + s = s, penalty = penalty)) + ## save the FPCA in args + ##str(temp$args) + + ret <- list(model.frame = function() + if (is.null(index)) return(mf) else{ + mftemp <- mf + mf <- mftemp[index,,drop = FALSE] # this is necessary to pass the attributes + attributes(mftemp[,xname]) + attr(mf[,xname], "signalIndex") <- attr(mftemp[,xname], "signalIndex") + attr(mf[,xname], "xname") <- attr(mftemp[,xname], "xname") + attr(mf[,xname], "indname") <- attr(mftemp[,xname], "indname") + return(mf) + } , + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_vary = function() vary, + get_names = function(){ + attr(xname, "indname") <- indname + xname + }, #colnames(mf), + set_names = function(value) { + #if(length(value) != length(colnames(mf))) + if(length(value) != names(mf[1])) + stop(sQuote("value"), " must have same length as ", + sQuote("names(mf[1])")) + for (i in seq_along(value)){ + cll[[i+1]] <<- as.name(value[i]) + } + attr(mf, "names") <<- value + }) + class(ret) <- "blg" + + # ret$dpp <- bl_lin(ret, Xfun = X_fpc, args = temp$args) + ret$dpp <- mboost_intern(ret, Xfun = X_fpc, args = temp$args, fun = "bl_lin") + + rm(temp) + + return(ret) +} + + + + + + +####################################################################################### +# Base-learner with constraints for smooth varying scalar covariate + +### almost equal to X_bbs() of package mboost +### difference: implements sum-to-zero-constraint over index of response +X_bbsc <- function(mf, vary, args) { + + stopifnot(is.data.frame(mf)) + mm <- lapply(which(colnames(mf) != vary), function(i) { + # X <- bsplines(mf[[i]], + # knots = args$knots[[i]]$knots, + # boundary.knots = args$knots[[i]]$boundary.knots, + # degree = args$degree, + # Ts_constraint = args$Ts_constraint, + # deriv = args$deriv) + X <- mboost_intern(mf[[i]], + knots = args$knots[[i]]$knots, + boundary.knots = args$knots[[i]]$boundary.knots, + degree = args$degree, + Ts_constraint = args$Ts_constraint, + deriv = args$deriv, extrapolation = args$prediction, + fun = "bsplines") + if (args$cyclic) { + # X <- cbs(mf[[i]], + # knots = args$knots[[i]]$knots, + # boundary.knots = args$knots[[i]]$boundary.knots, + # degree = args$degree, + # deriv = args$deriv) + X <- mboost_intern(mf[[i]], + knots = args$knots[[i]]$knots, + boundary.knots = args$knots[[i]]$boundary.knots, + degree = args$degree, + deriv = args$deriv, + fun = "cbs") + } + class(X) <- "matrix" + return(X) + }) ### options + MATRIX <- any(sapply(mm, dim) > c(500, 50)) || (length(mm) > 1) + MATRIX <- MATRIX && options("mboost_useMatrix")$mboost_useMatrix + if (MATRIX) { + diag <- Diagonal + for (i in seq_along(mm)){ + tmp <- attributes(mm[[i]])[c("degree", "knots", "Boundary.knots")] + mm[[i]] <- Matrix(mm[[i]]) + attributes(mm[[i]])[c("degree", "knots", "Boundary.knots")] <- tmp + } + } + + if (length(mm) == 1) { + X <- mm[[1]] + if (vary != "") { + by <- model.matrix(as.formula(paste("~", vary, collapse = "")), + data = mf)[ , -1, drop = FALSE] # drop intercept + DM <- lapply(seq_len(ncol(by)), function(i) { + ret <- X * by[, i] + colnames(ret) <- paste(colnames(ret), colnames(by)[i], sep = ":") + ret + }) + X <- do.call("cbind", DM) + } + if (args$differences > 0){ + if (!args$cyclic) { + K <- diff(diag(ncol(mm[[1]])), differences = args$differences) + } else { + ## cyclic P-splines + differences <- args$differences + K <- diff(diag(ncol(mm[[1]]) + differences), + differences = differences) + tmp <- K[,(1:differences)] # save first "differences" columns + K <- K[,-(1:differences)] # drop first "differences" columns + indx <- (ncol(mm[[1]]) - differences + 1):(ncol(mm[[1]])) + K[,indx] <- K[,indx] + tmp # add first "differences" columns + } + } else { + if (args$differences != 0) + stop(sQuote("differences"), " must be an non-neative integer") + K <- diag(ncol(mm[[1]])) + } + + if (vary != "" && ncol(by) > 1){ # build block diagonal penalty + suppressMessages(K <- kronecker(diag(ncol(by)), K)) + } + if (args$center) { + tmp <- attributes(X)[c("degree", "knots", "Boundary.knots")] + center <- match.arg(as.character(args$center), + choices = c("TRUE", "differenceMatrix", "spectralDecomp")) + if (center == "TRUE") center <- "differenceMatrix" + X <- switch(center, + ### L = t(D) in Section 2.3. of Fahrmeir et al. (2004, Stat Sinica) + "differenceMatrix" = tcrossprod(X, K) %*% solve(tcrossprod(K)), + ### L = \Gamma \Omega^1/2 in Section 2.3. of + ### Fahrmeir et al. (2004, Stat Sinica) + "spectralDecomp" = { + SVD <- eigen(crossprod(K), symmetric = TRUE) + ev <- SVD$vector[, 1:(ncol(X) - args$differences), drop = FALSE] + ew <- SVD$values[1:(ncol(X) - args$differences), drop = FALSE] + X %*% ev %*% diag(1/sqrt(ew)) + } + ) + attributes(X)[c("degree", "knots", "Boundary.knots")] <- tmp + K <- diag(ncol(X)) + } else { + K <- crossprod(K) + } + if (!is.null(attr(X, "Ts_constraint"))) { + D <- attr(X, "D") + K <- crossprod(D, K) %*% D + } + } + + if (length(mm) == 2) { + suppressMessages( + X <- kronecker(mm[[1]], matrix(1, ncol = ncol(mm[[2]]))) * + kronecker(matrix(1, ncol = ncol(mm[[1]])), mm[[2]]) + ) + if (vary != "") { + by <- model.matrix(as.formula(paste("~", vary, collapse = "")), + data = mf)[ , -1, drop = FALSE] # drop intercept + DM <- X * by[,1] + if (ncol(by) > 1){ + for (i in 2:ncol(by)) + DM <- cbind(DM, (X * by[,i])) + } + X <- DM + ### Names of X if by is given + } + if (args$differences > 0){ + if (!args$cyclic) { + Kx <- diff(diag(ncol(mm[[1]])), differences = args$differences) + Ky <- diff(diag(ncol(mm[[2]])), differences = args$differences) + } else { + ## cyclic P-splines + differences <- args$differences + Kx <- diff(diag(ncol(mm[[1]]) + differences), + differences = differences) + Ky <- diff(diag(ncol(mm[[2]]) + differences), + differences = differences) + + tmp <- Kx[,(1:differences)] # save first "differences" columns + Kx <- Kx[,-(1:differences)] # drop first "differences" columns + indx <- (ncol(mm[[1]]) - differences + 1):(ncol(mm[[1]])) + Kx[,indx] <- Kx[,indx] + tmp # add first "differences" columns + + tmp <- Ky[,(1:differences)] # save first "differences" columns + Ky <- Ky[,-(1:differences)] # drop first "differences" columns + indx <- (ncol(mm[[2]]) - differences + 1):(ncol(mm[[2]])) + Ky[,indx] <- Ky[,indx] + tmp # add first "differences" columns + } + } else { + if (args$differences != 0) + stop(sQuote("differences"), " must be an non-negative integer") + Kx <- diag(ncol(mm[[1]])) + Ky <- diag(ncol(mm[[2]])) + } + + Kx <- crossprod(Kx) + Ky <- crossprod(Ky) + suppressMessages( + K <- kronecker(Kx, diag(ncol(mm[[2]]))) + + kronecker(diag(ncol(mm[[1]])), Ky) + ) + if (vary != "" && ncol(by) > 1){ # build block diagonal penalty + suppressMessages(K <- kronecker(diag(ncol(by)), K)) + } + if (!isFALSE(args$center)) { + ### L = \Gamma \Omega^1/2 in Section 2.3. of Fahrmeir et al. + ### (2004, Stat Sinica), always + L <- eigen(K, symmetric = TRUE) + L$vectors <- L$vectors[,1:(ncol(X) - args$differences^2), drop = FALSE] + L$values <- sqrt(L$values[1:(ncol(X) - args$differences^2), drop = FALSE]) + L <- L$vectors %*% (diag(length(L$values)) * (1/L$values)) + X <- as(X %*% L, "matrix") + K <- as(diag(ncol(X)), "matrix") + } + } + + if (length(mm) > 2) + stop("not possible to specify more than two variables in ", + sQuote("..."), " argument of smooth base-learners") + + #---------------------------------- + ### Calculate constraints + + ## for center = TRUE, design matrix does not contain constant part + if(!isFALSE(args$center)){ + + ## center the columns of the design matrix + ## Z contains column means + # If the argument Z is not NULL use the given Z (important for prediction!) + if(is.null(args$Z)){ + args$Z <- colMeans(X) + } + + ### Transform design and penalty matrix + ## use column means of original design matrix + X <- scale(X, center = args$Z, scale = FALSE) + + }else{ + ## sum-to-zero constraint - orthogonal to constant part, + ## cf. Web Appendix A of Brockhaus et al. 2015 + + # If the argument Z is not NULL use the given Z (important for prediction!) + if(is.null(args$Z)){ + C <- t(X) %*% rep(1, nrow(X)) + Q <- qr.Q(qr(C), complete=TRUE) # orthonormal matrix of QR decomposition + args$Z <- Q[ , 2:ncol(Q)] # only keep last columns + } + + ### Transform design and penalty matrix + X <- X %*% args$Z + K <- t(args$Z) %*% K %*% args$Z + #print(args$Z) + } + + #---------------------------------- + + ## compare specified degrees of freedom to dimension of null space + if (!is.null(args$df)){ + rns <- ncol(K) - qr(as.matrix(K))$rank # compute rank of null space + if (rns == args$df) + warning( sQuote("df"), " equal to rank of null space ", + "(unpenalized part of P-spline);\n ", + "Consider larger value for ", sQuote("df"), + " or set ", sQuote("center != FALSE"), ".", immediate.=TRUE) + if (rns > args$df) + stop("not possible to specify ", sQuote("df"), + " smaller than the rank of the null space\n ", + "(unpenalized part of P-spline). Use larger value for ", + sQuote("df"), " or set ", sQuote("center != FALSE"), ".") + } + + return(list(X = X, K = K, args = args)) +} + +## add the parameter Z to the arguments of hyper_bbs() +hyper_bbsc <- function(Z, ...){ + ret <- c(mboost_intern(..., fun = "hyper_bbs"), list(Z=Z)) + return(ret) +} + + +############################################################################### + +#' Constrained Base-learners for Scalar Covariates +#' +#' Constrained base-learners for fitting effects of scalar covariates in models +#' with functional response +#' +#' @param ... one or more predictor variables or one matrix or data +#' frame of predictor variables. +#' @param by an optional variable defining varying coefficients, +#' either a factor or numeric variable. +#' @param index a vector of integers for expanding the variables in \code{...}. +#' @param knots either the number of knots or a vector of the positions +#' of the interior knots (for more details see \code{\link[mboost:baselearners]{bbs}}). +#' @param boundary.knots boundary points at which to anchor the B-spline basis +#' (default the range of the data). A vector (of length 2) +#' for the lower and the upper boundary knot can be specified. +#' @param degree degree of the regression spline. +#' @param differences a non-negative integer, typically 1, 2 or 3. +#' If \code{differences} = \emph{k}, \emph{k}-th-order differences are used as +#' a penalty (\emph{0}-th order differences specify a ridge penalty). +#' @param df trace of the hat matrix for the base-learner defining the +#' base-learner complexity. Low values of \code{df} correspond to a +#' large amount of smoothing and thus to "weaker" base-learners. +#' @param lambda smoothing parameter of the penalty, computed from \code{df} when +#' \code{df} is specified. +#' @param K in \code{bolsc} it is possible to specify the penalty matrix K +#' @param weights experiemtnal! weights that are used for the computation of the transformation matrix Z. +#' @param center See \code{\link[mboost:baselearners]{bbs}}. +#' @param cyclic if \code{cyclic = TRUE} the fitted values coincide at +#' the boundaries (useful for cyclic covariates such as day time etc.). +#' @param contrasts.arg Note that a special \code{contrasts.arg} exists in +#' package \code{mboost}, namely "contr.dummy". This contrast is used per default +#' in \code{brandomc}. It leads to a +#' dummy coding as returned by \code{model.matrix(~ x - 1)} were the +#' intercept is implicitly included but each factor level gets a +#' separate effect estimate (for more details see \code{\link[mboost:baselearners]{brandom}}). +#' @param intercept if \code{intercept = TRUE} an intercept is added to the design matrix +#' of a linear base-learner. +#' +#' @details The base-learners \code{bbsc}, \code{bolsc} and \code{brandomc} are +#' the base-learners \code{\link[mboost:baselearners]{bbs}}, \code{\link[mboost:baselearners]{bols}} and +#' \code{\link[mboost:baselearners]{brandom}} with additional identifiability constraints. +#' The constraints enforce that +#' \eqn{\sum_{i} \hat h(x_i, t) = 0} for all \eqn{t}, so that +#' effects varying over \eqn{t} can be interpreted as deviations +#' from the global functional intercept, see Web Appendix A of +#' Scheipl et al. (2015). +#' The constraint is enforced by a basis transformation of the design and penalty matrix. +#' In particular, it is sufficient to apply the constraint on the covariate-part of the design +#' and penalty matrix and thus, it is not necessary to change the basis in $t$-direction. +#' See Appendix A of Brockhaus et al. (2015) for technical details on how to enforce this sum-to-zero constraint. +#' +#' Cannot deal with any missing values in the covariates. +#' +#' @return Equally to the base-learners of package \code{mboost}: +#' +#' An object of class \code{blg} (base-learner generator) with a +#' \code{dpp} function (data pre-processing) and other functions. +#' +#' The call to \code{dpp} returns an object of class +#' \code{bl} (base-learner) with a \code{fit} function. The call to +#' \code{fit} finally returns an object of class \code{bm} (base-model). +#' +#' @seealso \code{\link{FDboost}} for the model fit. +#' \code{\link[mboost:baselearners]{bbs}}, \code{\link[mboost:baselearners]{bols}} +#' and \code{\link[mboost:baselearners]{brandom}} for the +#' corresponding base-learners in \code{mboost}. +#' +#' @references +#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +#' The functional linear array model. Statistical Modelling, 15(3), 279-300. +#' +#' Scheipl, F., Staicu, A.-M. and Greven, S. (2015): +#' Functional Additive Mixed Models, Journal of Computational and Graphical Statistics, 24(2), 477-501. +#' +#' @author Sarah Brockhaus, Almond Stoecker +#' +#' @examples +#' #### simulate data with functional response and scalar covariate (functional ANOVA) +#' n <- 60 ## number of cases +#' Gy <- 27 ## number of observation poionts per response curve +#' dat <- list() +#' dat$t <- (1:Gy-1)^2/(Gy-1)^2 +#' set.seed(123) +#' dat$z1 <- rep(c(-1, 1), length = n) +#' dat$z1_fac <- factor(dat$z1, levels = c(-1, 1), labels = c("1", "2")) +#' # dat$z1 <- runif(n) +#' # dat$z1 <- dat$z1 - mean(dat$z1) +#' +#' # mean and standard deviation for the functional response +#' mut <- matrix(2*sin(pi*dat$t), ncol = Gy, nrow = n, byrow = TRUE) + +#' outer(dat$z1, dat$t, function(z1, t) z1*cos(pi*t) ) # true linear predictor +#' sigma <- 0.1 +#' +#' # draw respone y_i(t) ~ N(mu_i(t), sigma) +#' dat$y <- apply(mut, 2, function(x) rnorm(mean = x, sd = sigma, n = n)) +#' +#' ## fit function-on-scalar model with a linear effect of z1 +#' m1 <- FDboost(y ~ 1 + bolsc(z1_fac, df = 1), timeformula = ~ bbs(t, df = 6), data = dat) +#' +#' # look for optimal mSTOP using cvrisk() or validateFDboost() +#' \donttest{ +#' cvm <- cvrisk(m1, grid = 1:500) +#' m1[mstop(cvm)] +#' } +#' m1[200] # use 200 boosting iterations +#' +#' # plot true and estimated coefficients +#' plot(dat$t, 2*sin(pi*dat$t), col = 2, type = "l", main = "intercept") +#' plot(m1, which = 1, lty = 2, add = TRUE) +#' +#' plot(dat$t, 1*cos(pi*dat$t), col = 2, type = "l", main = "effect of z1") +#' lines(dat$t, -1*cos(pi*dat$t), col = 2, type = "l") +#' plot(m1, which = 2, lty = 2, col = 1, add = TRUE) +#' +#' +#' @keywords models +#' @aliases brandomc bolsc +#' @export +bbsc <- function(..., by = NULL, index = NULL, knots = 10, boundary.knots = NULL, + degree = 3, differences = 2, df = 4, lambda = NULL, center = FALSE, + cyclic = FALSE) { + + #---------------------------------- + ## arguments constraint and dervi of bbs() are set to their defaults + ## i.e. no constraints and no derivatives + # constraint <- match.arg(constraint) + constraint <- "none" + deriv <- 0 + #---------------------------------- + + if (!is.null(lambda)) df <- NULL + + cll <- match.call() + cll[[1]] <- as.name("bbsc") + + mf <- list(...) + if (length(mf) == 1 && ((is.matrix(mf[[1]]) || is.data.frame(mf[[1]])) && + ncol(mf[[1]]) > 1 )) { + mf <- as.data.frame(mf[[1]]) + } else { + mf <- as.data.frame(mf) + cl <- as.list(match.call(expand.dots = FALSE))[2][[1]] + colnames(mf) <- sapply(cl, function(x) deparse(x)) + } + stopifnot(is.data.frame(mf)) + if(!(all(sapply(mf, is.numeric)))) { + if (ncol(mf) == 1){ + warning("cannot compute ", sQuote("bbsc"), + " for non-numeric variables; used ", + sQuote("bols"), " instead.") + return(bols(mf, by = by, index = index)) + } + stop("cannot compute bbsc for non-numeric variables") + } + vary <- "" + if (!is.null(by)){ + mf <- cbind(mf, by) + colnames(mf)[ncol(mf)] <- vary <- deparse(substitute(by)) + } + + # CC <- all(Complete.cases(mf)) + CC <- all(mboost_intern(mf, fun = "Complete.cases")) + if (!CC) + warning("base-learner contains missing values;\n", + "missing values are excluded per base-learner, ", + "i.e., base-learners may depend on different", + " numbers of observations.") + + ################# do not use the index option as then Z is always computed as for balanced data + ################# make an option available for this? as this means centering per group + ### option + DOINDEX <- (nrow(mf) > options("mboost_indexmin")[[1]]) + if (is.null(index)) { + if (!CC || DOINDEX) { + # index <- get_index(mf) + index <- mboost_intern(mf, fun = "get_index") + mf <- mf[index[[1]],,drop = FALSE] + index <- index[[2]] + } + } + + ## call X_bbsc in oder to compute the transformation matrix Z + if(is.null(index)){ + temp <- X_bbsc(mf, vary, + args = hyper_bbsc(mf, vary, knots = knots, boundary.knots = + boundary.knots, degree = degree, differences = differences, + df = df, lambda = lambda, center = center, cyclic = cyclic, + constraint = constraint, deriv = deriv, + Z = NULL)) + }else{ + temp <- X_bbsc(mf, vary, + args = hyper_bbsc(mf[index,,drop = FALSE], vary, knots = knots, boundary.knots = + boundary.knots, degree = degree, differences = differences, + df = df, lambda = lambda, center = center, cyclic = cyclic, + constraint = constraint, deriv = deriv, + Z = NULL)) + } + + Z <- temp$args$Z + + ret <- list(model.frame = function() + if (is.null(index)) return(mf) else return(mf[index,,drop = FALSE]), + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_vary = function() vary, + get_names = function() colnames(mf), + set_names = function(value) { + if(length(value) != length(colnames(mf))) + stop(sQuote("value"), " must have same length as ", + sQuote("colnames(mf)")) + for (i in seq_along(value)){ + cll[[i+1]] <<- as.name(value[i]) + } + attr(mf, "names") <<- value + }) + class(ret) <- "blg" + + # ret$dpp <- bl_lin(ret, Xfun = X_bbsc, args = temp$args) + ret$dpp <- mboost_intern(ret, Xfun = X_bbsc, args = temp$args, fun = "bl_lin") + + # ## function that comoutes a design matrix such that new_des %*% hat{theta} = beta(s) + # ## use ng equally spaced observation points + # ret$get_des <- function(ng = 40){ + # + # if(ncol(mf) > 1) stop("get_des() in bbsc() is only implemented for one variable.") + # + # ## use a new grid of x-values with ng grid points + # x_grid <- seq(min(mf[ , 1]), max(mf[ , 1]), l = ng) + # + # new_mf <- data.frame("z" = I(x_grid)) + # names(new_mf) <- names(mf)[1] + # + # ## use vary and args like in bl + # new_des <- X_bbsc(mf = new_mf, vary = vary, args = temp$args)$X + # + # ## give arguments to new_des for easier use in the plot-function + # attr(new_des, "x") <- new_mf[ , 1] + # attr(new_des, "xlab") <- names(new_mf)[1] + # + # return(new_des) + # } + + return(ret) +} + + +# z2 <- rnorm(17) +# blz <- bbsc(z=z2, df=3) +# blz$get_call() +# blz$get_names() +# str(blz$get_data()) +# str(blz$dpp(weights=rep(1,17))) + +################# +### model.matrix for constrained ols base-learner with penalty matrix K +X_olsc <- function(mf, vary, args) { + + if ( mboost_intern(mf, fun = "isMATRIX") ) { + X <- mf + contr <- NULL + } else { + ### set up model matrix + fm <- paste0("~ ", paste(colnames(mf)[colnames(mf) != vary], + collapse = "+")) + fac <- sapply(mf[colnames(mf) != vary], is.factor) + DUMMY <- FALSE + if (any(fac)){ + if (!is.list(args$contrasts.arg)){ + ## first part needed to prevent warnings from calls such as + ## contrasts.arg = contr.treatment(4, base = 1): + if (DUMMY <- (is.character(args$contrasts.arg) && + args$contrasts.arg == "contr.dummy")){ + if (!args$intercept) + stop('"contr.dummy" can only be used with ', + sQuote("intercept = TRUE")) + fm <- paste(fm, "-1") + args$contrasts.arg <- "contr.treatment" + } + txt <- paste("list(", paste(colnames(mf)[colnames(mf) != vary][fac], + "= args$contrasts.arg", collapse = ", "),")") + args$contrasts.arg <- eval(parse(text=txt)) + } else { + ## if contrasts are given as list check if "contr.dummy" is specified + if (any(args$contrasts.arg == "contr.dummy")) + stop('"contr.dummy"', + " can only be used for all factors at the same time.\n", + "Use ", sQuote('contrasts.arg = "contr.dummy"'), + " to achieve this.") + } + } else { + args$contrasts.arg <- NULL + } + X <- model.matrix(as.formula(fm), data = mf, contrasts.arg = args$contrasts.arg) + if (DUMMY) { + attr(X, "contrasts") <- lapply(attr(X, "contrasts"), + function(x) x <- "contr.dummy") + args$contrasts.arg <- "contr.dummy" + } + contr <- attr(X, "contrasts") + if (!args$intercept) + X <- X[ , -1, drop = FALSE] + MATRIX <- any(dim(X) > c(500, 50)) && any(fac) + MATRIX <- MATRIX && options("mboost_useMatrix")$mboost_useMatrix + if (MATRIX) { + diag <- Diagonal + if (!is(X, "Matrix")) + X <- Matrix(X) + } + if (vary != "") { + by <- model.matrix(as.formula(paste("~", vary, collapse = "")), + data = mf)[ , -1, drop = FALSE] # drop intercept + DM <- lapply(seq_len(ncol(by)), function(i) { + ret <- X * by[, i] + colnames(ret) <- paste(colnames(ret), colnames(by)[i], sep = ":") + ret + }) + X <- do.call("cbind", DM) + } + } + + #---------------------------------- + ## use given penalty-matrix K + if(is.null(args$K)){ + ### penalize intercepts??? + ### set up penalty matrix + ANOVA <- (!is.null(contr) && (length(contr) == 1)) && (ncol(mf) == 1) + K <- diag(ncol(X)) + ### for ordered factors use difference penalty + if (ANOVA && any(sapply(mf[, names(contr), drop = FALSE], is.ordered))) { + K <- diff(diag(ncol(X) + 1), differences = 1)[, -1, drop = FALSE] + if (vary != "" && ncol(by) > 1){ # build block diagonal penalty + suppressMessages(K <- kronecker(diag(ncol(by)), K)) + } + K <- crossprod(K) + } + }else{ + ## check dimensions of given K + stopifnot(dim(args$K)==rep(ncol(X), 2)) + K <- args$K + } + #---------------------------------- + + #---------------------------------- + ### Calculate constraints + + # Only compute Z in model fit, not in model prediction + #if(!args$prediction){ ## computes Z 3 times during model fit + if(is.null(args$Z)){ + C <- t(X) %*% rep(1, nrow(X)) + Q <- qr.Q(qr(C), complete=TRUE) # orthonormal matrix of QR decomposition + args$Z <- Q[ , 2:ncol(Q)] # only keep last columns + } + + ### Transform design and penalty matrix + X <- X %*% args$Z + K <- t(args$Z) %*% K %*% args$Z + + #---------------------------------- + + if (is(X, "Matrix") && !is(K, "Matrix")) + K <- Matrix(K) + + ### return the transformation matrix Z as well + list(X = X, K = K, args = args) +} + + +#' @rdname bbsc +#' @export +### Linear base-learner, potentially Ridge-penalized (but not by default) +### one can specify the penalty matrix K +### with sum-to-zero constraint over index of response +bolsc <- function(..., by = NULL, index = NULL, intercept = TRUE, df = NULL, + lambda = 0, K = NULL, weights = NULL, contrasts.arg = "contr.treatment") { + + if (!is.null(df)) lambda <- NULL + + cll <- match.call() + cll[[1]] <- as.name("bolsc") + + mf <- list(...) + + if(!intercept && length(mf)==1) stop("Intercept has to be TRUE for bolsc with one covariate.") + + if (length(mf) == 1 && (( mboost_intern(mf[[1]], fun = "isMATRIX") || + is.data.frame(mf[[1]])) && + ncol(mf[[1]]) > 1 )) { + mf <- mf[[1]] + ### spline bases should be matrices + if ( mboost_intern(mf, fun = "isMATRIX") && !is(mf, "Matrix")) + class(mf) <- "matrix" + } else { + mf <- as.data.frame(mf) + cl <- as.list(match.call(expand.dots = FALSE))[2][[1]] + colnames(mf) <- sapply(cl, function(x) as.character(x)) + } + if(!intercept && !any(sapply(mf, is.factor)) && + !any(sapply(mf, function(x){uni <- unique(x); + length(uni[!is.na(uni)])}) == 1)){ + ## if no intercept is used and no covariate is a factor + ## and if no intercept is specified (i.e. mf[[i]] is constant) + if (any(sapply(mf, function(x) abs(mean(x, na.rm=TRUE) / sd(x,na.rm=TRUE))) > 0.1)) + ## if covariate mean is not near zero + warning("covariates should be (mean-) centered if ", + sQuote("intercept = FALSE")) + } + vary <- "" + if (!is.null(by)){ + stopifnot(is.data.frame(mf)) + mf <- cbind(mf, by) + colnames(mf)[ncol(mf)] <- vary <- deparse(substitute(by)) + } + + # CC <- all(Complete.cases(mf)) + CC <- all(mboost_intern(mf, fun = "Complete.cases")) + if (!CC) + warning("base-learner contains missing values;\n", + "missing values are excluded per base-learner, ", + "i.e., base-learners may depend on different", + " numbers of observations.") + + ### option + DOINDEX <- is.data.frame(mf) && + (nrow(mf) > options("mboost_indexmin")[[1]] || is.factor(mf[[1]])) + if (is.null(index)) { + ### try to remove duplicated observations or + ### observations with missings + if (!CC || DOINDEX) { + # index <- get_index(mf) + index <- mboost_intern(mf, fun = "get_index") + mf <- mf[index[[1]],,drop = FALSE] + index <- index[[2]] + } + } + + ### call X_olsc in order to compute the transformation matrix Z, + ## Z is saved in args$Z and is used after the model fit. + ### use index, as otherwise Z is computed as for one observation per factor level/ per unique observation + ## this is equivalent to the same number of observations in each factor level + ### use weights, as otherwise the weights are not used for the computation of Z, + ## but weights here are NOT the weights in model call as they are an argument to bolsc() + if(is.null(index)){ + + if(is.null(weights)){ ## use weights + w <- seq_len(nrow(mf)) + }else{ + w <- rep(seq_len(nrow(mf)), weights) + } + + temp <- X_olsc(mf[w, , drop = FALSE], vary, + args = hyper_olsc(df = df, lambda = lambda, + intercept = intercept, contrasts.arg = contrasts.arg, + K = K, Z = NULL)) + }else{ + + if(is.null(weights)){ ## use weights + w <- seq_len(nrow(mf[index, , drop = FALSE])) + }else{ + w <- rep(seq_len(nrow(mf[index, , drop = FALSE])), weights) + } + + temp <- X_olsc(mf = (mf[index, , drop = FALSE])[w, , drop = FALSE], vary = vary, + args = hyper_olsc(df = df, lambda = lambda, + intercept = intercept, contrasts.arg = contrasts.arg, + K = K, Z = NULL)) + } + + + ret <- list(model.frame = function() + if (is.null(index)) return(mf) else return(mf[index,,drop = FALSE]), + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_names = function() colnames(mf), + get_vary = function() vary, + set_names = function(value) { + if(length(value) != length(colnames(mf))) + stop(sQuote("value"), " must have same length as ", + sQuote("colnames(mf)")) + for (i in seq_along(value)){ + cll[[i+1]] <<- as.name(value[i]) + } + attr(mf, "names") <<- value + }) + class(ret) <- "blg" + + # ret$dpp <- bl_lin(ret, Xfun = X_olsc, args = temp$args) + ret$dpp <- mboost_intern(ret, Xfun = X_olsc, args = temp$args, fun = "bl_lin") + return(ret) +} + + +### hyper parameters for olsc base-learner +## add the parameter Z and K to the arguments of hyper_ols() +hyper_olsc <- function(Z = NULL, K = NULL, ...){ + + ## prediction is usually set in/by newX() + ret <- c(mboost_intern(..., fun = "hyper_ols"), list(Z = Z, K = K, prediction = FALSE)) + + return(ret) +} + + +#' @rdname bbsc +#' @export +# random-effects (Ridge-penalized ANOVA) base-learner +# almost equal to brandom, but with sum-to-zero-constraint over index of t +brandomc <- function (..., contrasts.arg = "contr.dummy", df = 4) { + cl <- cltmp <- match.call() + if (is.null(cl$df)) + cl$df <- df + if (is.null(cl$contrasts.arg)) + cl$contrasts.arg <- contrasts.arg + cl[[1L]] <- as.name("bolsc") + ret <- eval(cl, parent.frame()) + cltmp[[1]] <- as.name("brandomc") + assign("cll", cltmp, envir = environment(ret$get_call)) + ret +} + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/baselearnersX.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/baselearnersX.R new file mode 100644 index 0000000..eb8ceb6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/baselearnersX.R @@ -0,0 +1,537 @@ +#### Base-learner for historic effect of functional covariate +### with integral over specific limits, e.g. s<=t + +### hyper parameters for signal baselearner with P-splines +hyper_histx <- function(mf, vary, knots = 10, boundary.knots = NULL, degree = 3, + differences = 1, df = 4, lambda = NULL, center = FALSE, + cyclic = FALSE, constraint = "none", deriv = 0L, + Z=NULL, limits=NULL, + standard="no", intFun=integrationWeightsLeft, + inS="smooth", inTime="smooth", + penalty = "ps", check.ident = FALSE, + format="long") { + + knotf <- function(x, knots, boundary.knots) { + if (is.null(boundary.knots)) + boundary.knots <- range(x, na.rm = TRUE) + ## At the moment only NULL or 2 boundary knots can be specified. + ## Knot expansion is done automatically on an equidistand grid. + if ((length(boundary.knots) != 2) || !boundary.knots[1] < boundary.knots[2]) + stop("boundary.knots must be a vector (or a list of vectors) ", + "of length 2 in increasing order") + if (length(knots) == 1) { + knots <- seq(from = boundary.knots[1], + to = boundary.knots[2], length = knots + 2) + knots <- knots[2:(length(knots) - 1)] + } + list(knots = knots, boundary.knots = boundary.knots) + } + + nm <- colnames(mf)[colnames(mf) != vary] + if (is.list(knots)) if(!all(names(knots) %in% nm)) + stop("variable names and knot names must be the same") + if (is.list(boundary.knots)) if(!all(names(boundary.knots) %in% nm)) + stop("variable names and boundary.knot names must be the same") + if (!isFALSE(center) && cyclic) + stop("centering of cyclic covariates not yet implemented") + ret <- vector(mode = "list", length = length(nm)) + names(ret) <- nm + for (n in nm) + ret[[n]] <- knotf(getTime(mf[[n]]), + knots=if(is.list(knots)) knots[[n]] else knots, + boundary.knots = if(is.list(boundary.knots)) boundary.knots[[n]] else boundary.knots) + if (cyclic && constraint != "none") + stop("constraints not implemented for cyclic B-splines") + stopifnot(is.numeric(deriv) & length(deriv) == 1) + + ## prediction is usually set in/by newX() + list(knots = ret, degree = degree, differences = differences, + df = df, lambda = lambda, center = center, cyclic = cyclic, + Ts_constraint = constraint, deriv = deriv, + Z = Z, limits = limits, + standard = standard, intFun = intFun, + inS = inS, inTime = inTime, + penalty = penalty, check.ident = check.ident, format = format, + prediction = FALSE) +} + + +### model.matrix for P-splines base-learner of signal matrix mf +### for response observed over a common grid, args$format="wide" +### or irregularly observed reponse, args$format="long" +X_histx <- function(mf, vary, args) { + + stopifnot(is.data.frame(mf)) + varnames <- names(mf) + + xname <- getXLab(mf[[1]]) + X1 <- getX(mf[[1]]) + xind <- getArgvals(mf[[1]]) + yind <- getTime(mf[[1]]) + + # force user to supply indices + #if(is.null(xind)) xind <- args$s # if the attribute is NULL use the s of the model fit + #if(is.null(yind)) yind <- args$time # if the attribute is NULL use the time of the model fit + + nobs <- nrow(X1) + + ## get id-variable + id <- getId(mf[[1]]) ### id is always there, in long and wide format!!! + ## id has values 1, 2, 3, ... for response in long format + + # compute design-matrix in s-direction + Bs <- switch(args$inS, + # B-spline basis of specified degree + #"smooth" = bsplines(xind, knots=args$knots[[varnames]]$knots, + # boundary.knots=args$knots[[varnames]]$boundary.knots, + # degree=args$degree), + "smooth" = mboost_intern(xind, knots = args$knots[[varnames]]$knots, + boundary.knots = args$knots[[varnames]]$boundary.knots, + degree = args$degree, + fun = "bsplines"), + "linear" = matrix(c(rep(1, length(xind)), xind), ncol = 2), + "constant"= matrix(c(rep(1, length(xind))), ncol = 1)) + + colnames(Bs) <- paste0(xname, seq_len(ncol(Bs))) + + # integration weights + L <- args$intFun(X1=X1, xind=xind) + + ## set up design matrix for historical model according to args$limits() + # use the argument limits (Code taken of function ff(), package refund) + limits <- args$limits + if (!is.null(limits)) { + if (!is.function(limits)) { + if (!(limits %in% c("s argument unknown") + } + if (limits == "s argument cannot be NULL.") + } + + ## save the limits function in the arguments + args$limits <- limits + + # use function limits to set up design matrix according to function limits + # by setting 0 at the time-points that should not be used + # yind is over all observations in long format + ind0 <- !t(outer( xind, yind, limits) ) + yindHelp <- yind + # } + + ### Compute the design matrix as sparse or normal matrix + ### depending on dimensions of the final design matrix + MATRIX <- any(c(nrow(ind0), ncol(Bs)) > c(500, 50)) #MATRIX <- any(dim(X) > c(500, 50)) + MATRIX <- MATRIX && options("mboost_useMatrix")$mboost_useMatrix + + if(MATRIX){ + # message("use sparse matrix in X_hist") + diag <- Diagonal + + ## it would be nicer to construct the matrix directly as sparse matrix + + X1des <- X1[id, ] + X1des[ind0] <- 0 + X1des <- Matrix(X1des, sparse=TRUE) # convert into sparse matrix + + }else{ # small matrices: do not use Matrix + + X1des <- X1[id, ] + X1des[ind0] <- 0 + + } + + ## set up matrix with adequate integration and standardization weights + ## start with a matrix of integration weights + ## case of "no" standardization + Lnew <- args$intFun(X1des, xind) + Lnew[ind0] <- 0 + + ## Standardize with exact length of integration interval + ## (1/t-t0) \int_{t0}^t f(s) ds + if(args$standard == "length"){ + ## use fundamental theorem of calculus + ## \lim t->t0- (1/t-t0) \int_{t0}^t f(s) ds = f(t0) + ## -> integration weight in s-direction should be 1 + ## integration weights in s-direction always sum exactly to 1, + ## good for small number of observations! + args$vecStand <- rowSums(Lnew) + args$vecStand[args$vecStand==0] <- 1 ## cannnot divide 0/0, instead divide 0/1 + Lnew <- Lnew * 1/args$vecStand + } + + ## use time of current observation for standardization + ## (1/t) \int_{t0}^t f(s) ds + if(args$standard=="time"){ + if(any(yindHelp <= 0)) stop("For standardization with time, time must be positive.") + ## Lnew <- matrix(1, ncol=ncol(X1des), nrow=nrow(X1des)) + ## Lnew[ind0] <- 0 + ## use fundamental theorem of calculus + ## \lim t->0+ (1/t) \int_0^t f(s) ds = f(0), if necessary + ## (as previously X*L, use now X*(1/L) for cases with one single point) + yindHelp[yindHelp==0] <- L[1,1] # impossible! + # standFact <- 1/yindHelp + args$vecStand <- yindHelp + Lnew <- Lnew * 1/yindHelp + } + ## print(round(Lnew, 2)) + ## print(rowSums(Lnew)) + ## print(args$vecStand) + + # multiply design matrix with integration weights and standardization weights + X1des <- X1des * Lnew + + # Design matrix is product of expanded X1 and basis expansion over xind + X1des <- X1des %*% Bs + + ## see Scheipl and Greven (2016) Identifiability in penalized function-on-function regression models + if(args$check.ident && args$inS == "smooth"){ + K1 <- diff(diag(ncol(Bs)), differences = args$differences) + K1 <- crossprod(K1) + # use the limits function to compute check measures on corresponding subsets of x(s) and B_j + res_check <- check_ident(X1 = X1, L = L, Bs = Bs, K = K1, xname = xname, + penalty = args$penalty, + limits = args$limits, + yind = yind, id = id, # yind is always in long format + X1des = X1des, ind0 = ind0, xind = xind) + args$penalty <- res_check$penalty + args$logCondDs <- res_check$logCondDs + args$logCondDs_hist <- res_check$logCondDs_hist + args$overlapKe <- res_check$overlapKe + args$cumOverlapKe <- res_check$cumOverlapKe + args$maxK <- res_check$maxK + } + + # wide: design matrix over index of response for one response + # long: design matrix over index of response (yind has long format!) + Bt <- switch(args$inTime, + # B-spline basis of specified degree + # "smooth" = bsplines(yind, knots=args$knots[[varnames]]$knots, + # boundary.knots=args$knots[[varnames]]$boundary.knots, + # degree=args$degree), + "smooth" = mboost_intern(yind, knots = args$knots[[varnames]]$knots, + boundary.knots = args$knots[[varnames]]$boundary.knots, + degree = args$degree, + fun = "bsplines"), + "linear" = matrix(c(rep(1, length(yind)), yind), ncol=2), + "constant"= matrix(c(rep(1, length(yind))), ncol=1)) + + if(! mboost_intern(Bt, fun = "isMATRIX") ) Bt <- matrix(Bt, ncol=1) + + # calculate row-tensor + # X <- (X1 %x% t(rep(1, ncol(X2))) ) * ( t(rep(1, ncol(X1))) %x% X2 ) + dimnames(Bt) <- NULL # otherwise warning "dimnames [2] mismatch..." + X <- X1des[, rep(seq_len(ncol(Bs)), each=ncol(Bt))] * Bt[, rep(seq_len(ncol(Bt)), times=ncol(Bs))] + + if(! mboost_intern(X, fun = "isMATRIX") ) X <- matrix(X, ncol=1) + + colnames(X) <- paste0(xname, seq_len(ncol(X))) + + ### Penalty matrix: product differences matrix for smooth effect + if(args$inS == "smooth"){ + K1 <- diff(diag(ncol(Bs)), differences = args$differences) + K1 <- crossprod(K1) + if(args$penalty == "pss"){ + # instead of using 0.1, allow for flexible shrinkage parameter in penalty_pss()? + K1 <- penalty_pss(K = K1, difference = args$difference, shrink = 0.1) + } + }else{ # Ridge-penalty + K1 <- diag(ncol(Bs)) + } + #K1 <- matrix(0, ncol=ncol(Bs), nrow=ncol(Bs)) + #print(args$penalty) + + if(args$inTime == "smooth"){ + K2 <- diff(diag(ncol(Bt)), differences = args$differences) + K2 <- crossprod(K2) + }else{ + K2 <- diag(ncol(Bt)) + } + + # compute penalty matrix for the whole effect + suppressMessages(K <- kronecker(K1, diag(ncol(Bt))) + + kronecker(diag(ncol(Bs)), K2)) + + ## compare specified degrees of freedom to dimension of null space + if (!is.null(args$df)){ + rns <- ncol(K) - qr(as.matrix(K))$rank # compute rank of null space + if (rns == args$df) + warning( sQuote("df"), " equal to rank of null space ", + "(unpenalized part of P-spline);\n ", + "Consider larger value for ", sQuote("df"), + " or set ", sQuote("center = TRUE"), ".", immediate.=TRUE) + if (rns > args$df) + stop("not possible to specify ", sQuote("df"), + " smaller than the rank of the null space\n ", + "(unpenalized part of P-spline). Use larger value for ", + sQuote("df"), " or set ", sQuote("center = TRUE"), ".") + } + + # save matrices to compute numbers for identifiability checks + args$Bs <- Bs + args$X1des <- X1des + args$K1 <- K1 + args$L <- L + + # tidy up workspace + rm(Bs, Bt, ind0, X1des, X1, L) + + return(list(X = X, K = K, args = args)) +} + + + +############################################################################### + +#' Base-learners for Functional Covariates +#' +#' Base-learners that fit historical functional effects that can be used with the +#' tensor product, as, e.g., \code{hbistx(...) \%X\% bolsc(...)}, to form interaction +#' effects (Ruegamer et al., 2018). +#' For expert use only! May show unexpected behavior +#' compared to other base-learners for functional data! +#' +#' @param x object of type \code{hmatrix} containing time, index and functional covariate; +#' note that \code{timeLab} in the \code{hmatrix}-object must be equal to +#' the name of the time-variable in \code{timeformula} in the \code{FDboost}-call +#' @param knots either the number of knots or a vector of the positions +#' of the interior knots (for more details see \code{\link[mboost:baselearners]{bbs})}. +#' @param boundary.knots boundary points at which to anchor the B-spline basis +#' (default the range of the data). A vector (of length 2) +#' for the lower and the upper boundary knot can be specified. +#' @param degree degree of the regression spline. +#' @param differences a non-negative integer, typically 1, 2 or 3. Defaults to 1. +#' If \code{differences} = \emph{k}, \emph{k}-th-order differences are used as +#' a penalty (\emph{0}-th order differences specify a ridge penalty). +#' @param df trace of the hat matrix for the base-learner defining the +#' base-learner complexity. Low values of \code{df} correspond to a +#' large amount of smoothing and thus to "weaker" base-learners. +#' @param lambda smoothing parameter of the penalty, computed from \code{df} when \code{df} is specified. +#' @param penalty by default, \code{penalty="ps"}, the difference penalty for P-splines is used, +#' for \code{penalty="pss"} the penalty matrix is transformed to have full rank, +#' so called shrinkage approach by Marra and Wood (2011) +#' @param check.ident use checks for identifiability of the effect, based on Scheipl and Greven (2016); +#' see Brockhaus et al. (2017) for identifiability checks that take into account the integration limits +#' @param standard the historical effect can be standardized with a factor. +#' "no" means no standardization, "time" standardizes with the current value of time and +#' "lenght" standardizes with the lenght of the integral +#' @param intFun specify the function that is used to compute integration weights in \code{s} +#' over the functional covariate \eqn{x(s)} +#' @param inS historical effect can be smooth, linear or constant in s, +#' which is the index of the functional covariates x(s). +#' @param inTime historical effect can be smooth, linear or constant in time, +#' which is the index of the functional response y(time). +#' @param limits defaults to \code{"s<=t"} for an historical effect with s<=t; +#' either one of \code{"s 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + ## set index to NULL, as the index is treated within X_hist() + ## get_index = function() index, + get_index = function() NULL, + get_vary = function() vary, + get_names = function(){ + varnames + }, #colnames(mf), + set_names = function(value) { + #if(length(value) != length(colnames(mf))) + if(length(value) != names(mf[1])) + stop(sQuote("value"), " must have same length as ", + sQuote("names(mf[1])")) + for (i in seq_along(value)){ + cll[[i+1]] <<- as.name(value[i]) + } + attr(mf, "names") <<- value + }) + class(ret) <- "blg" + + ### call fitter with X_histx + # ret$dpp <- bl_lin(ret, Xfun = X_histx, args = temp$args) + ret$dpp <- mboost_intern(ret, Xfun = X_histx, args = temp$args, fun = "bl_lin") + + return(ret) +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/bootstrapCIs.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/bootstrapCIs.R new file mode 100644 index 0000000..f83c90f --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/bootstrapCIs.R @@ -0,0 +1,616 @@ +#' Function to compute bootstrap confidence intervals +#' +#' The model is fitted on bootstrapped samples of the data to compute bootstrapped +#' coefficient estimates. To determine the optimal stopping iteration an inner bootstrap +#' is run within each bootstrap fold. +#' As estimation by boosting shrinks the coefficient estimates towards zero, +#' to bootstrap confidence intervals are biased towards zero. +#' +#' @param object a fitted model object of class \code{FDboost}, +#' for which the confidence intervals should be computed. +#' @param which a subset of base-learners to take into account for +#' computing confidence intervals. +#' @param resampling_fun_outer function for the outer resampling procedure. +#' \code{resampling_fun_outer} must be a function with arguments \code{object} +#' and \code{fun}, where \code{object} corresponds to the fitted +#' \code{FDboost} object and \code{fun} is passed to the \code{fun} +#' argument of the resampling function (see examples). +#' If \code{NULL}, \code{\link{applyFolds}} is used with 100-fold boostrap. +#' Further arguments to \code{\link{applyFolds}} can be passed via \code{...}. +#' Although the function can be defined very flexible, it is recommended +#' to use \code{applyFolds} and, in particular, not \code{cvrisk}, +#' as in this case, weights of the inner and outer +#' fold will interact, probably causing the inner +#' resampling to crash. For bootstrapped confidence intervals +#' the outer function should usually be a bootstrap type of resampling. +#' @param resampling_fun_inner function for the inner resampling procudure, +#' which determines the optimal stopping iteration in each fold of the +#' outer resampling procedure. Should be a function with one argument +#' \code{object} for the fitted \code{FDboost} object. +#' If \code{NULL}, \code{cvrisk} is used with 25-fold bootstrap. +#' @param B_outer Number of resampling folds in the outer loop. +#' Argument is overwritten, when a custom \code{resampling_fun_outer} +#' is supplied. +#' @param B_inner Number of resampling folds in the inner loop. +#' Argument is overwritten, when a custom \code{resampling_fun_inner} +#' is supplied. +#' @param type_inner character argument for specifying the cross-validation method for +#' the inner resampling level. Default is \code{"bootstrap"}. Currently +#' bootstrap, k-fold cross-validation and subsampling are implemented. +#' @param levels the confidence levels required. If NULL, the +#' raw results are returned. +#' @param verbose if \code{TRUE}, information will be printed in the console +#' @param ... further arguments passed to \code{\link{applyFolds}} if +#' the default for \code{resampling_fun_outer} is used +#' +#' @author David Ruegamer, Sarah Brockhaus +#' +#' @note Note that parallelization can be achieved by defining +#' the \code{resampling_fun_outer} or \code{_inner} accordingly. +#' See, e.g., \code{\link[mboost]{cvrisk}} on how to parallelize resampling +#' functions or the examples below. Also note that by defining +#' a custum inner or outer resampling function the respective +#' argument \code{B_inner} or \code{B_outer} is ignored. +#' For models with complex baselearners, e.g., created by combining +#' several baselearners with the Kronecker or row-wise tensor product, +#' it is also recommended to use \code{levels = NULL} in order to +#' let the function return the raw results and then manually compute +#' confidence intervals. +#' If a baselearner is not selected in any fold, the function +#' treats its effect as constantly zero. +#' +#' +#' @return A list containing the elements \code{raw_results}, the +#' \code{quantiles} and \code{mstops}. +#' In \code{raw_results} and \code{quantiles}, each baselearner +#' selected with \code{which} in turn corresponds to a list +#' element. The quantiles are given as vector, matrix or list of +#' matrices depending on the nature of the effect. In case of functional +#' effects the list element in\code{quantiles} is a \code{length(levels)} times +#' \code{length(effect)} matrix, i.e. the rows correspond to the quantiles. +#' In case of coefficient surfaces, \code{quantiles} comprises a list of matrices, +#' where each list element corresponds to a quantile. +#' +#' @examples +#' if(require(refund)){ +#' ######### +#' # model with linear functional effect, use bsignal() +#' # Y(t) = f(t) + \int X1(s)\beta(s,t)ds + eps +#' set.seed(2121) +#' data1 <- suppressWarnings(pffrSim(scenario = "ff", n = 40)) +#' data1$X1 <- scale(data1$X1, scale = FALSE) +#' dat_list <- as.list(data1) +#' dat_list$t <- attr(data1, "yindex") +#' dat_list$s <- attr(data1, "xindex") +#' +#' ## model fit by FDboost +#' m1 <- FDboost(Y ~ 1 + bsignal(x = X1, s = s, knots = 8, df = 3), +#' timeformula = ~ bbs(t, knots = 8), data = dat_list) +#' +#'} +#' +#' \donttest{ +#' # a short toy example with to few folds +#' # and up to 200 boosting iterations +#' bootCIs <- bootstrapCI(m1[200], B_inner = 2, B_outer = 5) +#' +#' # look at stopping iterations +#' bootCIs$mstops +#' +#' # plot bootstrapped coefficient estimates +#' plot(bootCIs, ask = FALSE) +#' } +#' +#' my_inner_fun <- function(object){ +#' cvrisk(object, folds = cvLong(id = object$id, weights = +#' model.weights(object), B = 2) # 10-fold for inner resampling +#' ) +#' } +#' +#' \donttest{ +#' bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, +#' B_outer = 5) # small B_outer to speed up +#' } +#' +#' ## We can also use the ... argument to parallelize the applyFolds +#' ## function in the outer resampling +#' +#' \donttest{ +#' bootCIs <- bootstrapCI(m1, B_inner = 5, B_outer = 3) +#' } +#' +#' ## Now let's parallelize the outer resampling and use +#' ## crossvalidation instead of bootstrap for the inner resampling +#' +#' my_inner_fun <- function(object){ +#' cvrisk(object, folds = cvLong(id = object$id, weights = +#' model.weights(object), type = "kfold", # use CV +#' B = 5, # 5-fold for inner resampling +#' )) # use five cores +#' } +#' +#' # use applyFolds for outer function to avoid messing up weights +#' my_outer_fun <- function(object, fun){ +#' applyFolds(object = object, +#' folds = cv(rep(1, length(unique(object$id))), +#' type = "bootstrap", B = 10), fun = fun) # parallelize on 10 cores +#' } +#' +#' \donttest{ +#' bootCIs <- bootstrapCI(m1, resampling_fun_inner = my_inner_fun, +#' resampling_fun_outer = my_outer_fun, +#' B_inner = 5, B_outer = 10) +#' } +#' +#' ######## Example for scalar-on-function-regression with bsignal() +#' data("fuelSubset", package = "FDboost") +#' +#' ## center the functional covariates per observed wavelength +#' fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) +#' fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) +#' +#' ## to make mboost:::df2lambda() happy (all design matrix entries < 10) +#' ## reduce range of argvals to [0,1] to get smaller integration weights +#' fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / +#' (max(uvvis.lambda) - min(uvvis.lambda) )) +#' fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / +#' (max(nir.lambda) - min(nir.lambda) )) +#' +#' ## model fit with scalar response and two functional linear effects +#' ## include no intercept as all base-learners are centered around 0 +#' +#' mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) +#' + bsignal(NIR, nir.lambda, knots = 40, df=4, check.ident = FALSE), +#' timeformula = NULL, data = fuelSubset) +#' +#' +#' \donttest{ +#' # takes some time, because of defaults: B_outer = 100, B_inner = 25 +#' bootCIs <- bootstrapCI(mod2, B_outer = 10, B_inner = 5) +#' # in practice, rather set B_outer = 1000 +#' } +#' +#' +#' @export +bootstrapCI <- function(object, which = NULL, + resampling_fun_outer = NULL, + resampling_fun_inner = NULL, + B_outer = 100, + B_inner = 25, + type_inner = c("bootstrap", "kfold", "subsampling"), + levels = c(0.05, 0.95), + verbose = TRUE, + ...) +{ + + type_inner <- match.arg(type_inner) + + ########## check for scalar response ######### + scalarResp <- inherits(object, "FDboostScalar") + + ########## define outer resampling function if NULL ######### + if(is.null(resampling_fun_outer)){ + + resampling_fun_outer <- function(object, fun) applyFolds(object = object, + folds = cv(rep(1, length(unique(object$id))), type = + "bootstrap", B = B_outer), fun = fun, + compress = FALSE, ...) + + }else{ + + message("B_outer is ignored as resampling_fun_outer is not NULL.") + + } + + ########## define inner resampling function if NULL ######### + if(is.null(resampling_fun_inner)){ + + if(scalarResp){ + + resampling_fun_inner <- function(object) cvrisk(object, folds = cvLong(id = object$id, weights = + model.weights(object), B = B_inner, + type = type_inner)) + + }else{ + + resampling_fun_inner <- function(object) applyFolds(object, folds = cv(rep(1, length(unique(object$id))), + B = B_inner, + type = type_inner)) + + } + + + }else{ + + message("B_inner is ignored as resampling_fun_inner is not NULL.") + + } + + # 'catch' error caused by using the cvrisk function for inner and outer resampling + if(identical(resampling_fun_outer, cvrisk) && + identical(resampling_fun_inner, cvrisk)) + stop("Please specify a different outer resampling function.") + + ########## get coefficients ########## + if(verbose) cat("Start computing bootstrap confidence intervals... \n") + + results <- resampling_fun_outer(object, + fun = function(mod) + { + ms <- mstop( resampling_fun_inner(mod) ) + coefs <- coef( mod[ms], which = which ) + return(list(coefs = coefs, ms = ms)) + } + ) + + if(verbose) cat("\n") + + coefs <- lapply(results, "[[", "coefs") + mstops <- sapply(results, "[[", "ms") + offsets <- t(sapply(coefs, function(x) x$offset$value)) + + ########## format coefficients ######### + # number of baselearners + nrEffects <- max(sapply(seq_along(coefs), + function(i) length(coefs[[i]]$smterms))) + + isFacSpecEffect <- sapply(1:nrEffects, + function(i) "numberLevels" %in% names(coefs[[1]]$smterms[[i]])) + # check for time-varying factor effects + isFacEffect <- sapply(1:nrEffects, function(i) is.factor(coefs[[1]]$smterms[[i]]$x)) + + # check for intercept + withIntercept <- any(names(coefs[[1]]) == "intercept") + + if(withIntercept){ + intercept <- sapply(coefs, "[[", "intercept") + if(!is.matrix(intercept)) intercept <- matrix(intercept, ncol = 1) + } + + # extract values + listOfCoefs <- lapply(1:nrEffects, function(i) + { + if(isFacSpecEffect[i]){ + # factor specific effect + lapply(seq_along(coefs), function(j) lapply(1:(coefs[[1]]$smterms[[i]]$numberLevels), + function(k) coefs[[j]]$smterms[[i]][[k]]$value)) + }else{ + lapply(seq_along(coefs), function(j) coefs[[j]]$smterms[[i]]$value) + } + }) + + nnob <- names(object$baselearner) + # exclude intercept in names + names(listOfCoefs) <- nnob[(1+withIntercept):length(nnob)] + + # check for effect surfaces + isSurface <- sapply(1:nrEffects, function(i) !is.null(coefs[[1]]$smterms[[i]]$y) ) + # do not treat time-varying factor effects as surfaces + isSurface[isFacEffect] <- FALSE + + # reduce lists for non surface effects + listOfCoefs[!isFacSpecEffect & !isSurface & !isFacEffect] <- + lapply(listOfCoefs[!isFacSpecEffect & !isSurface & !isFacEffect], + function(x) do.call("rbind", x)) + + listOfCoefs[isFacSpecEffect | isSurface] <- + lapply(listOfCoefs[isFacSpecEffect | isSurface], + function(x) lapply(x, function(y) do.call("rbind", lapply(y, c)))) + + # add information about the values of the covariate + # and change format + for(i in seq_along(listOfCoefs)){ + + if(isFacSpecEffect[i]){ + + atx <- coefs[[1]]$smterms[[i]][[1]]$x + + }else{ + + atx <- coefs[[1]]$smterms[[i]]$x + + } + + aty <- NA + if(isSurface[i] || isFacEffect[i]) aty <- coefs[[1]]$smterms[[i]]$y + if(isFacSpecEffect[i]) aty <- coefs[[1]]$smterms[[i]][[1]]$y + + # format functional factors + if(is.list(listOfCoefs[[i]]) && is.factor(atx)){ + + # combine each factor level + listOfCoefs[[i]] <- lapply(seq_along(levels(droplevels(atx))), + function(faclevnr) t(sapply(listOfCoefs[[i]], function(x) x[faclevnr,]))) + isSurface[i] <- FALSE + + }else if(is.list(listOfCoefs[[i]]) && !isFacSpecEffect[i]){ # effect surfaces + + listOfCoefs[[i]] <- do.call("rbind", lapply(listOfCoefs[[i]],c)) + + } + + attr(listOfCoefs[[i]], "x") <- atx + if(!is.na(sum(aty))) attr(listOfCoefs[[i]], "y") <- aty + + # add all plotting infos as attribute + my_plot_info <- coefs[[1]]$smterms[[i]] + my_plot_info$value <- NA + attr(listOfCoefs[[i]], "plot_info") <- my_plot_info + + } + + # add intercept and offset separately + if(withIntercept){ + + listOfCoefs <- c(offsets = list(offsets), + intercept = list(intercept), + listOfCoefs) + + }else{ + + listOfCoefs <- c(offsets = list(offsets), + listOfCoefs) + + } + + my_plot_info <- coefs[[1]]$offset + my_plot_info$value <- NA + attr(listOfCoefs[[1]], "plot_info") <- my_plot_info + attr(listOfCoefs[[1]], "x") <- coefs[[1]]$offset$x + if(withIntercept){ + # for functional response, the intercept is a vector + attr(listOfCoefs[[2]], "plot_info") <- list(dim = 1) + # for scalar response, the intercept is a scalar + if(class(object)[1] == "FDboostScalar") attr(listOfCoefs[[2]], "plot_info") <- list(dim = 0) + } + + # return raw results + if(is.null(levels)) return(listOfCoefs) + + # define isSurface for quantile calculations + isSurface <- c(rep(FALSE, 1 + withIntercept), isSurface) + + ########## calculate quantiles ######### + # create list for quantiles + listOfQuantiles <- vector("list", length(listOfCoefs)) + + # calculate quantiles + for(i in seq_along(listOfCoefs)){ + + # for matrix object + if(is.matrix(listOfCoefs[[i]]) && !is.list(listOfCoefs[[i]])){ + + listOfQuantiles[[i]] <- apply(listOfCoefs[[i]], 2, quantile, probs = levels) + attr(listOfQuantiles[[i]], "x") <- attr(listOfCoefs[[i]], "x") + if(!is.null(attr(listOfCoefs[[i]], "y"))) + attr(listOfQuantiles[[i]], "y") <- attr(listOfCoefs[[i]], "y") + + }else if(is.list(listOfCoefs[[i]])){ # functional factor variables + + listOfQuantiles[[i]] <- lapply(listOfCoefs[[i]], function(x) apply(t(x), 1, quantile, probs = levels)) + + }else{# scalar case + + listOfQuantiles[[i]] <- quantile(listOfCoefs[[i]], probs = levels) + + } + + } + + # since coefficient surfaces are saved as vectors, reconstruct quantiles + # as coefficient surfaces and return a list of matrices, where each + # matrix corresponds to a quantile in levels + if(sum(isSurface)!=0) listOfQuantiles[which(isSurface)] <- + lapply(listOfQuantiles[isSurface], + function(x){ + + retL <- lapply(seq_len(nrow(x)), function(i) + matrix(x[i,], nrow = length(attr(x, "y")))) + names(retL) <- levels + return(retL) + + }) + + # name rows of the matrices for non-surface effects + if(sum(!isSurface)!=0) listOfQuantiles[which(!isSurface)] <- + lapply(listOfQuantiles[!isSurface], + function(x){ + + if(is.list(x)){ + + for(j in seq_along(x)){ + + if(!is.null(dim(x[[j]]))){ + rownames(x[[j]]) <- levels + }else{ + names(x[[j]]) <- levels + } + + } + + }else{ + + if(!is.null(dim(x))){ + rownames(x) <- levels + }else{ + names(x) <- levels + } + + } + + return(x) + + }) + + # save names of baselearners + names(listOfQuantiles) <- names(listOfCoefs) + + + ########## return results ######### + ret <- list(raw_results = listOfCoefs, + quantiles = listOfQuantiles, + mstops = mstops, + resampling_fun_outer = resampling_fun_outer, + resampling_fun_inner = resampling_fun_inner, + B_outer = B_outer, + B_inner = B_inner, + which = which, + levels = levels, + yind = object$yind, + family = object$family@name) + + class(ret) <- "bootstrapCI" + + return(ret) + +} + + + +#' Methods for objects of class bootstrapCI +#' +#' Methods for objects that are fitted to compute bootstrap confidence intervals. +#' +#' @param x an object of class \code{bootstrapCI}. +#' @param which base-learners that are plotted +#' @param pers plot coefficient surfaces as persp-plots? Defaults to \code{TRUE}. +#' @param commonRange, plot predicted coefficients on a common range, defaults to \code{TRUE}. +#' @param showQuantiles plot the 0.05 and the 0.95 Quantile of coefficients in 1-dim effects. +#' @param showNumbers show number of curve in plot of predicted coefficients, defaults to \code{FALSE} +#' @param ask defaults to \code{TRUE}, ask for next plot using \code{par(ask = ask)}? +#' @param probs vector of quantiles to be used in the plotting of 2-dimensional coefficients surfaces, +#' defaults to \code{probs = c(0.25, 0.5, 0.75)} +#' @param ylim values for limits of y-axis +#' @param ... additional arguments passed to callies. +#' +#' @details \code{plot.bootstrapCI} plots the bootstrapped coefficients. +#' +#' @aliases print.bootstrapCI +#' @return No return value (plot method) or \code{x} itself (print method) +#' @method plot bootstrapCI +#' +#' @export +#' +plot.bootstrapCI <- function(x, which = NULL, pers = TRUE, + commonRange = TRUE, showNumbers = FALSE, showQuantiles = TRUE, + ask = TRUE, + probs = c(0.25, 0.5, 0.75), + ylim = NULL, ...) +{ + + stopifnot(inherits(x, "bootstrapCI")) + + boot_offset <- 0 + + if( names(x$raw_results)[1] == "offsets" ){ + + boot_offset <- t(x$raw_results$offsets) + x$raw_results$offsets <- NULL + + ## for scalar response, keep only one value per offset + if(length(x$yind) == 1) boot_offset <- boot_offset[1, ] + + } + + if(is.null(which)) which <- seq_along(x$raw_results) + + oldpar <- par(no.readonly = TRUE) + on.exit(par(oldpar)) + + if(length(which)>1) par(ask=ask) + + # find common range for all effects + if(commonRange && is.null(ylim)){ + ylim <- range(x$raw_results) + if(any(is.infinite(ylim))) ylim <- NULL + } + + for(l in which){ # loop over effects + + ### prepare objects + # coef() of a certain term + temp_CI <- x$raw_results[[l]] + + temp <- attr(temp_CI, "plot_info") + + ## for interaction effects like "bhistx(x) %X% bolsc(z)" + if(!is.null(temp$numberLevels)){ + temp <- temp[[1]] + warning("Of the composed base-learner ", l, " only the first effect is plotted.") + } + + ## write the rows of the matrix into a list, + ## i.e., coefficients of each fold are one list entry + if(!is.list(temp_CI)){ + + if(temp$dim >= 2){ + temp$value <- split(temp_CI, seq_len(nrow(temp_CI))) + }else{ + ## temp$dim == 1 like in scalar response with bsignal() + ## put each fold into one list entry + if(length(x$yind) <= 1 && x$family != "Binomial Distribution (similar to glm)"){ + # scalar response and not Binomial + temp$value <- split(temp_CI, rep(1:x$B_outer, each = length(temp_CI)/x$B_outer)) + }else{ + temp$value <- split(temp_CI, rep(1:x$B_outer, length(temp_CI)/x$B_outer)) + } + + } + + }else{ + + if(is.null(temp$numberLevels) && is.factor(temp$x)){ + + ## for time-varying factor effects + temp$value <- temp_CI + + }else{ + + ## for interaction effects like "bhistx(x) %X% bolsc(z)" + ## the values are already a list + temp$value <- lapply(temp_CI, function(x) x[1, ]) + + } + } + + if(!is.null(temp$dim) && temp$dim == 2 && !is.factor(temp$x)){ + temp$value <- lapply(temp$value, function(xx) + matrix(xx, ncol = sqrt(length(xx)), nrow = sqrt(length(xx)), byrow = FALSE) ) + } + + plot_bootstrapped_coef(temp = temp, l = l, + offset = boot_offset, yind = x$yind, + pers = pers, + showNumbers = showNumbers, showQuantiles = showQuantiles, + probs = probs, ylim = ylim, ...) + + + } # end loop over effects + +} + + + +#' @rdname plot.bootstrapCI +#' @method print bootstrapCI +#' @export +#' +print.bootstrapCI <- function(x, ...) +{ + + stopifnot(inherits(x, "bootstrapCI")) + + cat("\n") + + cat("\t Bootstrapped confidence interval object of FDboost fit\n") + + cat("\n") + cat("Coefficients:\n\t", names(x$quantiles), sep="\t", fill = TRUE) + cat("\n") + cat("\n") + cat("Summary for stopping iterations of inner validation:\n\n") + print(summary(x$mstops)) + cat("\n") + invisible(x) + +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/clr_functions.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/clr_functions.R new file mode 100644 index 0000000..c11540a --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/clr_functions.R @@ -0,0 +1,241 @@ +#' Clr and inverse clr transformation +#' +#' \code{clr} computes the clr or inverse clr transformation of a vector \code{f} +#' with respect to integration weights \code{w}, corresponding to a Bayes Hilbert space +#' \eqn{B^2(\mu) = B^2(\mathcal{T}, \mathcal{A}, \mu)}{B^2(\mu) = B^2(T, A, \mu)}. +#' +#' @param f a vector containing the function values (evaluated on a grid) of the +#' function \eqn{f} to transform. If \code{inverse = TRUE}, \code{f} must be a density, +#' i.e., all entries must be positive and usually \code{f} integrates to one. +#' If \code{inverse = FALSE}, \code{f} should integrate to zero, see Details. +#' @param w a vector of length one or of the same length as \code{f} containing +#' positive integration weights. If \code{w} has length one, this +#' weight is used for all function values. The integral of \eqn{f} is approximated +#' via \eqn{\int_{\mathcal{T}} f \, \mathrm{d}\mu \approx +#' \sum_{j=1}^m}{\sum_{j=1}^m} \code{w}\eqn{_j} \code{f}\eqn{_j}, +#' where \eqn{m} equals the length of \code{f}. +#' @param inverse if \code{TRUE}, the inverse clr transformation is computed. +#' +#' @details The clr transformation maps a density \eqn{f} from \eqn{B^2(\mu)} to +#' \eqn{L^2_0(\mu) := \{ f \in L^2(\mu) ~|~ \int_{\mathcal{T}} f \, \mathrm{d}\mu = 0\}}{L^2_0(\mu) := {f \in L^2(\mu) | \int_T f d\mu = 0}} +#' via +#' \deqn{\mathrm{clr}(f) := \log f - \frac{1}{\mu (\mathcal{T})} \int_{\mathcal{T}} \log f \, \mathrm{d}\mu.}{clr(f) := log f - 1/\mu(T) * \int_T log f d\mu.} +#' The inverse clr transformation maps a function \eqn{f} from +#' \eqn{L^2_0(\mu)} to \eqn{B^2(\mu)} via +#' \deqn{\mathrm{clr}^{-1}(f) := \frac{\exp f}{\int_{\mathcal{T}} \exp f \, \mathrm{d}\mu}.}{clr^{-1}(f) := (exp f) / (\int_T \exp f d\mu).} +#' Note that in contrast to Maier et al. (2021), this definition of the inverse +#' clr transformation includes normalization, yielding the respective probability +#' density function (representative of the equivalence class of proportional +#' functions in \eqn{B^2(\mu)}). +#' +#' The (inverse) clr transformation depends not only on \eqn{f}, but also on the +#' underlying measure space \eqn{\left( \mathcal{T}, \mathcal{A}, \mu\right)}{(T, A, \mu)}, +#' which determines the integral. In \code{clr} this is specified via the +#' integration weights \code{w}. E.g., for a discrete set \eqn{\mathcal{T}}{T} +#' with \eqn{\mathcal{A} = \mathcal{P}(\mathcal{T})}{A = P(T)} the power set of +#' \eqn{\mathcal{T}}{T} and \eqn{\mu = \sum_{t \in T} \delta_t} the sum of dirac +#' measures at \eqn{t \in \mathcal{T}}{t \in T}, the default \code{w = 1} is +#' the correct choice. In this case, integrals are indeed computed exactly, not +#' only approximately. +#' For an interval \eqn{\mathcal{T} = [a, b]}{T = [a, b]} +#' with \eqn{\mathcal{A} = \mathcal{B}}{A = B} the Borel \eqn{\sigma}-algebra +#' restricted to \eqn{\mathcal{T}}{T} and \eqn{\mu = \lambda} the Lebesgue measure, +#' the choice of \code{w} depends on the grid on which the function was evaluated: +#' \code{w}\eqn{_j} must correspond to the length of the subinterval of \eqn{[a, b]}, which +#' \code{f}\eqn{_j} represents. +#' E.g., for a grid with equidistant distance \eqn{d}, where the boundary grid +#' values are \eqn{a + \frac{d}{2}}{a + d/2} and \eqn{b - \frac{d}{2}}{b - d/2} +#' (i.e., the grid points are centers of intervals of size \eqn{d}), +#' equal weights \eqn{d} should be chosen for \code{w}. +#' +#' The clr transformation is crucial for density-on-scalar regression +#' since estimating the clr transformed model in \eqn{L^2_0(\mu)} is equivalent +#' to estimating the original model in \eqn{B^2(\mu)} (as the clr transformation +#' is an isometric isomorphism), see also the vignette "FDboost_density-on-scalar_births" +#' and Maier et al. (2021). +#' +#' @return A vector of the same length as \code{f} containing the (inverse) clr +#' transformation of \code{f}. +#' +#' @author Eva-Maria Maier +#' +#' @references +#' Maier, E.-M., Stoecker, A., Fitzenberger, B., Greven, S. (2021): +#' Additive Density-on-Scalar Regression in Bayes Hilbert Spaces with an Application to Gender Economics. +#' arXiv preprint arXiv:2110.11771. +#' +#' @examples +#' ### Continuous case (T = [0, 1] with Lebesgue measure): +#' # evaluate density of a Beta distribution on an equidistant grid +#' g <- seq(from = 0.005, to = 0.995, by = 0.01) +#' f <- dbeta(g, 2, 5) +#' # compute clr transformation with distance of two grid points as integration weight +#' f_clr <- clr(f, w = 0.01) +#' # visualize result +#' plot(g, f_clr , type = "l") +#' abline(h = 0, col = "grey") +#' # compute inverse clr transformation (w as above) +#' f_clr_inv <- clr(f_clr, w = 0.01, inverse = TRUE) +#' # visualize result +#' plot(g, f, type = "l") +#' lines(g, f_clr_inv, lty = 2, col = "red") +#' +#' ### Discrete case (T = {1, ..., 12} with sum of dirac measures at t in T): +#' data("birthDistribution", package = "FDboost") +#' # fit density-on-scalar model with effects for sex and year +#' model <- FDboost(birth_densities_clr ~ 1 + bolsc(sex, df = 1) + +#' bbsc(year, df = 1, differences = 1), +#' # use bbsc() in timeformula to ensure integrate-to-zero constraint +#' timeformula = ~bbsc(month, df = 4, +#' # December is followed by January of subsequent year +#' cyclic = TRUE, +#' # knots = {1, ..., 12} with additional boundary knot +#' # 0 (coinciding with 12) due to cyclic = TRUE +#' knots = 1:11, boundary.knots = c(0, 12), +#' # degree = 1 with these knots yields identity matrix +#' # as design matrix +#' degree = 1), +#' data = birthDistribution, offset = 0, +#' control = boost_control(mstop = 1000)) +#' # Extract predictions (clr-transformed!) and transform them to Bayes Hilbert space +#' predictions_clr <- predict(model) +#' predictions <- t(apply(predictions_clr, 1, clr, inverse = TRUE)) +#' +#' @export +clr <- function(f, w = 1, inverse = FALSE) { + stopifnot("inverse must be TRUE or FALSE." = inverse %in% c(TRUE, FALSE)) + stopifnot("f must be numeric." = is.numeric(f)) + stopifnot("f contains missing values." = !(anyNA(f))) + n <- length(f) + if (length(w) == 1) { + w <- rep(w, n) + } + stopifnot("w must be contain positive weights of length 1 or the same length as f." = + length(w) == n & is.numeric(w) & all(w > 0)) + int_f <- sum(f * w) + if (!inverse) { + stopifnot("As a density, f must be positive." = all(f > 0)) + if (!isTRUE(all.equal(int_f, 1, tolerance = 0.01))) { + warning(paste0("f is not a probability density with respect to w. Its integral is ", + round(int_f, 2), ".")) + } + return(log(f) - 1 / sum(w) * sum(log(f) * w)) + } else { + if (!isTRUE(all.equal(int_f, 0, tolerance = 0.01))) { + warning(paste0("f does not integrate to zero with respect to w. Its integral is ", + round(int_f, 2), ".")) + } + return(exp(f) / sum(exp(f) * w)) + } +} + + +#' Densities of live births in Germany +#' +#' \code{birthDistribution} contains densities of live births in Germany over the +#' months per year (1950 to 2019) and sex (male and female), resulting in 140 +#' densities. +#' +#' @docType data +#' +#' @usage data(birthDistribution, package = "FDboost") +#' +#' @format A list in the correct format to be passed to \code{\link{FDboost}} for +#' density-on-scalar regression: +#' \describe{ +#' \item{\code{birth_densities}}{A 140 x 12 matrix containing the birth densities +#' in its rows. The first 70 rows correspond to male newborns, the second 70 rows +#' to female ones. Within both of these, the years are ordered increasingly +#' (1950-2019), see also \code{sex} and \code{year}.} +#' \item{\code{birth_densities_clr}}{A 140 x 12 matrix containing the clr +#' transformed densities in its rows. Same structure as \code{birth_densities}.} +#' \item{\code{sex}}{A factor vector of length 140 with levels \code{"m"} (male) +#' and \code{"f"} (female), corresponding to the sex of the newborns for the rows of +#' \code{birth_densities} and \code{birth_densities_clr}. The first 70 elements +#' are \code{"m"}, the second 70 \code{"f"}.} +#' \item{\code{year}}{A vector of length 140 containing the integers from 1950 +#' to 2019 two times (\code{c(1950:2019, 1950:2019)}), corresponding to the years +#' for the rows of \code{birth_densities} and \code{birth_densities_clr}.} +#' \item{\code{month}}{A vector containing the integers from 1 to 12, corresponding +#' to the months for the columns of \code{birth_densities} and \code{birth_densities_clr} +#' (domain \eqn{\mathcal{T}}{T} of the (clr-)densities).} +#' } +#' Note that for estimating a density-on-scalar model with \code{FDboost}, the +#' clr transformed densities (\code{birth_densities_clr}) serve as response, see +#' also the vignette "FDboost_density-on-scalar_births". +#' The original densities (\code{birth_densities}) are not needed for estimation, +#' but still included for the sake of completeness. +#' +#' @details To compensate for the different lengths of the months, the average +#' number of births per day for each month (by sex and year) was used to compute +#' the birth shares from the absolute birth counts. The 12 shares corresponding +#' to one year and sex form one density in the Bayes Hilbert space +#' \eqn{B^2(\delta) = B^2\left( \mathcal{T}, \mathcal{A}, \delta\right)}{B^2(\delta) = B^2(T, A, \delta)}, +#' where \eqn{\mathcal{T} = \{1, \ldots, 12\}}{T = {1, \ldots, 12}} corresponds +#' to the set of the 12 months, \eqn{\mathcal{A} := \mathcal{P}(\mathcal{T})}{A := P(T)} +#' corresponds to the power set of \eqn{\mathcal{T}}{T}, and the reference measure +#' \eqn{\delta := \sum_{t = 1}^{12} \delta_t} corresponds to the sum of dirac +#' measures at \eqn{t \in \mathcal{T}}{t \in T}. +#' +#' @seealso \code{\link{clr}} for the (inverse) clr transformation. +#' +#' @source Statistisches Bundesamt (Destatis), Genesis-Online, data set +#' \href{https://www-genesis.destatis.de/genesis//online?operation=table&code=12612-0002&bypass=true&levelindex=0&levelid=1610983595176#abreadcrumb}{12612-0002} +#' (01/18/2021); \href{https://www.govdata.de/dl-de/by-2-0}{dl-de/by-2-0}; +#' processed by Eva-Maria Maier +#' +#' @references +#' Maier, E.-M., Stoecker, A., Fitzenberger, B., Greven, S. (2021): +#' Additive Density-on-Scalar Regression in Bayes Hilbert Spaces with an Application to Gender Economics. +#' arXiv preprint arXiv:2110.11771. +#' +#' @examples +#' data("birthDistribution", package = "FDboost") +#' +#' # Plot densities +#' year_col <- rainbow(70, start = 0.5, end = 1) +#' year_lty <- c(1, 2, 4, 5) +#' oldpar <- par(mfrow = c(1, 2)) +#' funplot(1:12, birthDistribution$birth_densities[1:70, ], ylab = "densities", xlab = "month", +#' xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") +#' funplot(1:12, birthDistribution$birth_densities[71:140, ], ylab = "densities", xlab = "month", +#' xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Female") +#' par(mfrow = c(1, 1)) +#' +#' # fit density-on-scalar model with effects for sex and year +#' model <- FDboost(birth_densities_clr ~ 1 + bolsc(sex, df = 1) + +#' bbsc(year, df = 1, differences = 1), +#' # use bbsc() in timeformula to ensure integrate-to-zero constraint +#' timeformula = ~bbsc(month, df = 4, +#' # December is followed by January of subsequent year +#' cyclic = TRUE, +#' # knots = {1, ..., 12} with additional boundary knot +#' # 0 (coinciding with 12) due to cyclic = TRUE +#' knots = 1:11, boundary.knots = c(0, 12), +#' # degree = 1 with these knots yields identity matrix +#' # as design matrix +#' degree = 1), +#' data = birthDistribution, offset = 0, +#' control = boost_control(mstop = 1000)) +#' +#' # Plotting 'model' yields the clr-transformed effects +#' par(mfrow = c(1, 3)) +#' plot(model, n1 = 12, n2 = 12) +#' +#' # Use inverse clr transformation to get effects in Bayes Hilbert space, e.g. for intercept +#' intercept_clr <- predict(model, which = 1)[1, ] +#' intercept <- clr(intercept_clr, w = 1, inverse = TRUE) +#' funplot(1:12, intercept, xlab = "month", xaxp = c(1, 12, 11), pch = 20, +#' main = "Intercept", ylab = expression(hat(beta)[0]), id = rep(1, 12)) +#' +#' # Same with predictions +#' predictions_clr <- predict(model) +#' predictions <- t(apply(predictions_clr, 1, clr, inverse = TRUE)) +#' pred_ylim <- range(birthDistribution$birth_densities) +#' par(mfrow = c(1, 2)) +#' funplot(1:12, predictions[1:70, ], ylab = "predictions", xlab = "month", ylim = pred_ylim, +#' xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") +#' funplot(1:12, predictions[71:140, ], ylab = "predictions", xlab = "month", ylim = pred_ylim, +#' xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Female") +#' par(oldpar) +"birthDistribution" \ No newline at end of file diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/constrainedX.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/constrainedX.R new file mode 100644 index 0000000..c4970fb --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/constrainedX.R @@ -0,0 +1,1131 @@ +#' Constrained row tensor product +#' +#' Combining single base-learners to form new, more complex base-learners, with +#' an identifiability constraint to center the interaction around the intercept and +#' around the two main effects. Suitable for functional response. +#' @param bl1 base-learner 1, e.g. \code{bols(x1)} +#' @param bl2 base-learner 2, e.g. \code{bols(x2)} +#' +#' @details Similar to \code{\%X\%} in package \code{mboost}, see +#' \code{\link[mboost:baselearners]{\%X\%}}, +#' a row tensor product of linear base-learners is returned by \code{\%Xc\%}. +#' \code{\%Xc\%} applies a sum-to-zero constraint to the design matrix suitable for +#' functional response if an interaction of two scalar covariates is specified +#' in the case that the model contains a global intercept and both main effects, +#' as the interaction is centered around the intercept and centered around the two main effects. +#' See Web Appendix A of Brockhaus et al. (2015) for details on how to enforce the constraint +#' for the functional intercept. +#' Use, e.g., in a model call to \code{FDboost}, following the scheme, +#' \code{y ~ 1 + bolsc(x1) + bolsc(x2) + bols(x1) \%Xc\% bols(x2)}, +#' where \code{1} induces a global intercept and \code{x1}, \code{x2} are factor variables, +#' see Ruegamer et al. (2018). +#' +#' @return An object of class \code{blg} (base-learner generator) with a \code{dpp} function +#' as for other \code{\link[mboost:baselearners]{baselearners}}. +#' +#' @references +#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +#' The functional linear array model. Statistical Modelling, 15(3), 279-300. +#' +#' Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). +#' Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. +#' Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. +#' +#' @author Sarah Brockhaus, David Ruegamer +#' +#' @examples +#' ######## Example for function-on-scalar-regression with interaction effect of two scalar covariates +#' data("viscosity", package = "FDboost") +#' ## set time-interval that should be modeled +#' interval <- "101" +#' +#' ## model time until "interval" and take log() of viscosity +#' end <- which(viscosity$timeAll == as.numeric(interval)) +#' viscosity$vis <- log(viscosity$visAll[,1:end]) +#' viscosity$time <- viscosity$timeAll[1:end] +#' # with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) +#' +#' ## fit model with interaction that is centered around the intercept +#' ## and the two main effects +#' mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df=1) + bolsc(T_A, df=1) + +#' bols(T_C, df=1) %Xc% bols(T_A, df=1), +#' timeformula = ~bbs(time, df=6), +#' numInt = "equal", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 9), +#' data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +#' +#' ## check centering around intercept +#' colMeans(predict(mod1, which = 4)) +#' +#' ## check centering around main effects +#' colMeans(predict(mod1, which = 4)[viscosity$T_A == "low", ]) +#' colMeans(predict(mod1, which = 4)[viscosity$T_A == "high", ]) +#' colMeans(predict(mod1, which = 4)[viscosity$T_C == "low", ]) +#' colMeans(predict(mod1, which = 4)[viscosity$T_C == "low", ]) +#' +#' ## find optimal mstop using cvrsik() or validateFDboost() +#' ## ... +#' +#' ## look at interaction effect in one plot +#' # funplot(mod1$yind, predict(mod1, which=4)) +#' +#' @export +"%Xc%" <- function(bl1, bl2) { + + if (is.list(bl1) && !inherits(bl1, "blg")) + return(lapply(bl1, "%Xc%", bl2 = bl2)) + + if (is.list(bl2) && !inherits(bl2, "blg")) + return(lapply(bl2, "%Xc%", bl1 = bl1)) + + cll <- paste(bl1$get_call(), "%Xc%", + bl2$get_call(), collapse = "") + stopifnot(inherits(bl1, "blg")) + stopifnot(inherits(bl2, "blg")) + + ## Check that the used base-learners contain an intercept + used_bl <- c( deparse(match.call()$bl1[[1]]), + deparse(match.call()$bl2[[1]]) ) + if(any(used_bl == "bolsc")) stop("Use bols instead of bolsc with %Xc%.") + if(any(used_bl == "brandomc")) stop("Use brandom instead of brandomc with %Xc%.") + if(any(used_bl == "bbsc")) stop("Use bbs instead of bbsc with %Xc%.") + if( (!is.null(match.call()$bl1$intercept) && !isTRUE(match.call()$bl1$intercept)) || + (!is.null(match.call()$bl2$intercept) && !isTRUE(match.call()$bl2$intercept)) ){ + stop("Set intercept = TRUE in base-learners used with %Xc%.") + } + + if(any(!used_bl %in% c("bols", "brandom", "bbs")) ){ + warning("%Xc% is intended to combine base-learners bols, brandom and bbs.") + } + + stopifnot(!any(colnames(mboost_intern(bl1, fun = "model.frame.blg")) %in% + colnames(mboost_intern(bl2, fun = "model.frame.blg")))) + mf <- cbind( mboost_intern(bl1, fun = "model.frame.blg"), + mboost_intern(bl2, fun = "model.frame.blg") ) + index1 <- bl1$get_index() + index2 <- bl2$get_index() + if (is.null(index1)) index1 <- seq_len(nrow(mf)) + if (is.null(index2)) index2 <- seq_len(nrow(mf)) + + mfindex <- cbind(index1, index2) + index <- NULL + + # CC <- all(Complete.cases(mf)) + CC <- all(mboost_intern(mf, fun = "Complete.cases")) + if (!CC) + warning("base-learner contains missing values;\n", + "missing values are excluded per base-learner, ", + "i.e., base-learners may depend on different", + " numbers of observations.") + ### option + DOINDEX <- (nrow(mf) > options("mboost_indexmin")[[1]]) + if (is.null(index)) { + if (!CC || DOINDEX) { + index <- mboost_intern(mfindex, fun = "get_index") + mf <- mf[index[[1]],,drop = FALSE] + index <- index[[2]] + } + } + + vary <- "" + + ret <- list(model.frame = function() + if (is.null(index)) return(mf) else return(mf[index,,drop = FALSE]), + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_vary = function() vary, + get_names = function() colnames(mf), + ## Is this all we want to change if we set names here? + set_names = function(value) attr(mf, "names") <<- value) + ## + class(ret) <- "blg" + + args1 <- environment(bl1$dpp)$args + args2 <- environment(bl2$dpp)$args + l1 <- args1$lambda + l2 <- args2$lambda + if (!is.null(l1) && !is.null(l2)) { + args <- list(lambda = 1, df = NULL) + } else { + args <- list(lambda = NULL, + df = ifelse(is.null(args1$df), 1, args1$df) * + ifelse(is.null(args2$df), 1, args2$df)) + } + + Xfun <- function(mf, vary, args) { + + ## set prediciton to FALSE, if it is NULL + if(is.null(args$prediction)) args$prediction <- FALSE + + newX1 <- environment(bl1$dpp)$newX + newX2 <- environment(bl2$dpp)$newX + + X1 <- newX1(mf[, bl1$get_names(), drop = FALSE], + prediction = args$prediction) + K1 <- X1$K + X1 <- X1$X + if (!is.null(l1)) K1 <- l1 * K1 + MATRIX <- options("mboost_useMatrix")$mboost_useMatrix + if (MATRIX && !is(X1, "Matrix")) + X1 <- Matrix(X1) + if (MATRIX && !is(K1, "Matrix")) + K1 <- Matrix(K1) + + X2 <- newX2(mf[, bl2$get_names(), drop = FALSE], + prediction = args$prediction) + K2 <- X2$K + X2 <- X2$X + if (!is.null(l2)) K2 <- l2 * K2 + if (MATRIX && !is(X2, "Matrix")) + X2 <- Matrix(X2) + if (MATRIX && !is(K2, "Matrix")) + K2 <- Matrix(K2) + suppressMessages( + X <- kronecker(X1, Matrix(1, ncol = ncol(X2), + dimnames = list("", colnames(X2))), + make.dimnames = TRUE) * + kronecker(Matrix(1, ncol = ncol(X1), + dimnames = list("", colnames(X1))), + X2, make.dimnames = TRUE) + ) + suppressMessages( + K <- kronecker(K1, diag(ncol(X2))) + + kronecker(diag(ncol(X1)), K2) + ) + + #---------------------------------- + ### Calculate constraints + + ## If model is fitted -> compute Z; but if model is predicted use the Z from the model fit + ## if(!args$prediction){ + ## compute QR-decompotition only once + if(is.null(args$Z)){ + ## put all effects of the two main effects + intercept into the constraints + # C <- t(X) %*% cbind(rep(1, nrow(X)), X1[ , -1], X2[ , -1]) + ## use whole matrices of marginal effects for constraints as Almond suggested + C <- t(X) %*% cbind(rep(1, nrow(X)), X1, X2) + qr_C <- qr(C) ## , tol = 1e-10 ## time? + if( inherits(qr_C, "sparseQR") ){ + rank_C <- qr_C@Dim[2] + }else{ + rank_C <- qr_C$rank + } + Q <- qr.Q(qr_C, complete=TRUE) # orthonormal matrix of QR decomposition + args$Z <- Q[ , (rank_C + 1) : ncol(Q) ] # only keep last columns + } + + ### Transform design and penalty matrix + X <- X %*% args$Z + K <- t(args$Z) %*% K %*% args$Z + ## print(args$Z) + #---------------------------------- + + list(X = X, K = K, args = args) + } + + ## compute the transformation matrix Z + temp <- Xfun(mf = mf, vary = vary, args = args) + args$Z <- temp$args$Z + #print(head(args$Z)) + #image(t(as.matrix(args$Z))) + rm(temp) + + # ret$dpp <- bl_lin(ret, Xfun = Xfun, args = args) + ret$dpp <- mboost_intern(ret, Xfun = Xfun, args = args, fun = "bl_lin") + + return(ret) +} + + + +############################################################################################# +############################################################################################# + +### workhorse for fitting matrix-response (Ridge-penalized) baselearners +### Y = kronecker(X2, X1) +### see Currie, Durban, Eilers (2006, JRSS B) +### args has extra argument isotropic TRUE/FALSE +bl_lin_matrix_a <- function(blg, Xfun, args) { + + mf <- blg$get_data() + index <- blg$get_index() + vary <- blg$get_vary() + + newX <- function(newdata = NULL, prediction = FALSE) { + if (!is.null(newdata)) { + mf <- mboost_intern(newdata, blg, mf, to.data.frame = FALSE, + fun = "check_newdata") + } + ## this argument is currently only used in X_bbs --> bsplines + args$prediction <- prediction + return(Xfun(mf, vary, args)) + } + X <- newX() + K <- X$K + X <- X$X + c1 <- ncol(X$X1) + c2 <- ncol(X$X2) + n1 <- nrow(X$X1) + n2 <- nrow(X$X2) + + G <- function(x) { + one <- matrix(rep(1, ncol(x)), nrow = 1) + suppressMessages( + ret <- kronecker(x, one) * kronecker(one, x) + ) + ret + } + + dpp <- function(weights) { + + if (!is.null(attr(X$X1, "deriv")) || !is.null(attr(X$X2, "deriv"))) + stop("fitting of derivatives of B-splines not implemented") + + W <- matrix(weights, nrow = n1, ncol = n2) + + ### X = kronecker(X2, X1) + XtX <- crossprod(G(X$X1), W) %*% G(X$X2) + mymatrix <- matrix + if (is(XtX, "Matrix")) mymatrix <- Matrix + XtX <- array(XtX, c(c1, c1, c2, c2)) + XtX <- mymatrix(aperm(XtX, c(1, 3, 2, 4)), nrow = c1 * c2) + + ### If lambda was given in both baselearners, we + ### directly multiply the marginal penalty matrices by lambda + ### and then compute the total penalty as the kronecker sum. + ### args$lambda is NA in this case and we don't compute + ### the corresponding df's (unlike bl_lin) + if (is.null(args$lambda)) { + + if(!is.null(args$isotropic) && !args$isotropic){ ## %A% + + ## get the design and penalty matrices of the marginal base-learners + # X1 <- X$X1 + # X2 <- X$X2 + # K1 <- args$K1 + # K2 <- args$K2 + + # ## per default do not expand the marginal design matrices + # expand_index1 <- seq_len(nrow(X$X1)) + # expand_index2 <- seq_len(nrow(X$X2)) + + ## weights-matrix W: weights are for single observations in the matrix Y + ## but the marginal bl work either on columns or rows of Y + + ## easy case: all weights are 1 + if(all(W == 1)){ + w1 <- w2 <- 1 ## set weights for bl1 and bl2 to 1 + + ## more difficult case: different weights in W + }else{ + + ## use colMeans and rowMeans of W as weights + ## weights in mboost are rescaled such that: + ## sum(W) == nrow(X$X1)*nrow(X$X2), if weight are not integres + ## see mboost:::rescale_weights + w1 <- rowMeans(W) ## rowSums(W) + w2 <- colMeans(W) ## colSums(W) + + ## w1, w2 are correct, when the matrix W can be computed from them as + w1w2 <- w1 %*% t(w2) ## all( W == w1w2 ) + + if( any(abs(W - w1w2) > .Machine$double.eps*10^10) ){ + + ## check whether w1w2 and W differ just by a factor + multFactor <- unique(c(W / w1w2)) + multFactor <- multFactor[!is.na(multFactor)] # get rid of NaN -> division by 0 + ## multFactor is equal up to numerical inaccuracies + if( all(abs(multFactor - multFactor[1] ) < .Machine$double.eps*10^10) ) multFactor <- multFactor[1] + + ## case that W and w1w2 just differ by a factor + if( all((W == w1w2)[w1w2 == 0]) && all((W == w1w2)[W == 0]) && ## check positions of zeros + length(multFactor) == 1 ){ # check that only 1 multiplicative factor + + ## it is impossible to know whether multFactor is multiplied to w1 or w2! + # w2 <- w2 * multFactor + # all( W == (w1 %*% t(w2 * multFactor))) + # all( W == ( (w1 * multFactor) %*% t(w2))) + + ## just assume that resampling was done on the level of curves + w2 <- w2 * multFactor + + ## do not warn in the case that all rows of W are equal -> no resampling + if(nrow(unique(W, MARGIN = 1)) != 1){ + warning("Assume that resampling is such that whole observations of blg1 are used.") + } + + }else{ + warning("Set all weights = 1 for computation of lambda1 and lambda2 in %A%.") + w1 <- w2 <- 1 + } + + } # end if that W != w1w2 + + ## more detailed warnings are given when necessary + # warning("rowMeans and colMeans of W do not multiply back to W, + # thus anisotropic lambdas only roughly correct.") + + ### idea: blow up the two marginal design matrices and use weights on them + ### but: this does not work correctly: problem with factor remains + # ## W cannot be computed from w1 and w2, + # ## -> blow up the marginal design matrices and use W with them, + # expand_index1 <- rep(seq_len(nrow(X$X1)), times = nrow(X$X2)) + # expand_index2 <- rep(seq_len(nrow(X$X2)), each = nrow(X$X1)) + # ## all( c(W) == weights) is TRUE, ordering of weights must match to blown-up marginal design matrices + # ## standardize weights to compensate for the blow-up of the marginal design-matrices + # #w1 <- c(W) / mean(rowSums(W)) ## for some special cases (e.g. BS on rows): mean(rowSums(W)) == nrow(X$X2) + # #w2 <- c(W) / mean(colSums(W)) ## for some special cases: mean(colSums(W)) == nrow(X$X1) + # w1 <- c(W) / nrow(X$X2) ## for some special cases (e.g. BS on rows): mean(rowSums(W)) == nrow(X$X2) + # w2 <- c(W) / nrow(X$X1) ## for some special cases: mean(colSums(W)) == nrow(X$X1) + + } ## end computation of w1, w2 + + + ## case that df equals nr columns of design matrix -> no penalty -> lambda = 0 + if( abs(ncol(X$X1) - args$df1) < .Machine$double.eps*10^10 ){ + args$lambda1 <- 0 + }else{ + ## call df2lambda for marginal bl1 + al1 <- mboost_intern(X = X$X1, # X$X1[expand_index1 , , drop = FALSE], + df = args$df1, lambda = NULL, ## lambda = args$df1, do not allow for lambda in %A% + dmat = args$K1, weights = w1, XtX = NULL, + fun = "df2lambda") + args$lambda1 <- al1["lambda"] + } + + + ## case that df equals nr columns of design matrix + if( abs(ncol(X$X2) - args$df2) < .Machine$double.eps*10^10 ){ + args$lambda2 <- 0 + }else{ + ## call df2lambda for marginal bl2 + al2 <- mboost_intern(X = X$X2, # X$X2[expand_index2 , , drop = FALSE], + df = args$df2, lambda = NULL, + dmat = args$K2, weights = w2, XtX = NULL, + fun = "df2lambda") + args$lambda2 <- al2["lambda"] + } + + ## compute the penalty matrix which includes lambda1 and lambda2 for K1 and K2 + suppressMessages( + K <- kronecker(args$lambda2 * args$K2, diag(ncol(X$X1))) + + kronecker(diag(ncol(X$X2)), args$lambda1 * args$K1) + ) + + } ## end of anisotropic penalty + + + ### : is there a better way to feed XtX into lambdadf? + lambdadf <- mboost_intern(X = diag(rankMatrix(X$X1, method = 'qr', warn.t = FALSE) * + rankMatrix(X$X2, method = 'qr', warn.t = FALSE)), + df = args$df, lambda = args$lambda, + dmat = K, weights = weights, XtX = XtX, + fun = "df2lambda") + ### + + lambda <- lambdadf["lambda"] + K <- lambda * K + + ## save the two marginal lambdas as attributes of lambdadf, as + ## lambdadf can be called via object$basemodel[[1]]$df() + attr(lambdadf, "anisotropic") <- list(df1 = args$df1, lambda1 = args$lambda1, + df2 = args$df2, lambda2 = args$lambda2) + + + } else { + lambdadf <- args[c("lambda", "df")] + } + + ### note: K already contains the lambda penalty parameter(s) + XtX <- XtX + K + + ### nnls + constr <- (!is.null(attr(X$X1, "constraint"))) + + (!is.null(attr(X$X2, "constraint"))) + + if (constr == 2) + stop("only one dimension may be subject to constraints") + constr <- constr > 0 + + ## matrizes of class dgeMatrix are dense generic matrices; they should + ## be coerced to class matrix and handled in the standard way + if (is(XtX, "Matrix") && !extends(class(XtX), "dgeMatrix") && !extends(class(XtX), "dsyMatrix")) { + XtXC <- Cholesky(forceSymmetric(XtX)) + mysolve <- function(y) { + Y <- matrix(y, nrow = n1) * W + if (constr) + return( mboost_intern(X, as(XtXC, "matrix"), Y, fun = "nnls2D") ) + XWY <- as.vector(crossprod(X$X1, Y) %*% X$X2) + solve(XtXC, XWY) ## special solve routine from + ## package Matrix + } + } else { + if (is(XtX, "Matrix")) { + ## coerce Matrix to matrix + XtX <- as(XtX, "matrix") + } + mysolve <- function(y) { + Y <- matrix(y, nrow = n1) * W + if (constr) + return( mboost_intern(X, as(XtX, "matrix"), Y, fun = "nnls2D") ) + XWY <- crossprod(X$X1, Y) %*% X$X2 + solve(XtX, matrix(as(XWY, "matrix"), ncol = 1)) + } + } + + cfprod <- function(b) tcrossprod(X$X1 %*% b, X$X2) + + fit <- function(y) { + coef <- as(mysolve(y), "matrix") + if (nrow(coef) != c1) coef <- matrix(as.vector(coef), nrow = c1) + f <- cfprod(coef) + f <- as(f, "matrix") + if (options("mboost_Xmonotone")$mboost_Xmonotone) { + md <- apply(f, 1, function(x) min(diff(x))) + if (any(md < -(.Machine$double.eps)^(1/3))) { + coef <- matrix(0, nrow = nrow(coef), ncol = ncol(coef)) + f <- matrix(0, nrow = nrow(f), ncol = ncol(f)) + } + } + ret <- list(model = coef, + fitted = function() as.vector(f)) + class(ret) <- c("bm_lin", "bm") + ret + } + + ### check for large n, option? + hatvalues <- function() { + return(NULL) + } + ### + + ### actually used degrees of freedom (trace of hat matrix) + df <- function() lambdadf + + ### prepare for computing predictions + predict <- function(bm, newdata = NULL, aggregate = c("sum", "cumsum", "none")) { + cf <- lapply(bm, function(x) x$model) + if(!is.null(newdata)) { + index <- NULL + X <- newX(newdata, prediction = TRUE)$X + } + ncfprod <- function(b) + as.vector(as(tcrossprod(X$X1 %*% b, X$X2), "matrix")) + aggregate <- match.arg(aggregate) + pr <- switch(aggregate, "sum" = { + cf2 <- 0 + for (b in cf) cf2 <- cf2 + b + ncfprod(cf2) + }, + "cumsum" = { + cf2 <- 0 + ret <- c() + for (b in cf) { + cf2 <- cf2 + b + ret <- cbind(ret, ncfprod(cf2)) + } + ret + }, + "none" = { + ret <- c() + for (b in cf) { + ret <- cbind(ret, ncfprod(b)) + } + ret + }) + return(pr) + } + + Xnames <- outer(colnames(X$X1), colnames(X$X2), paste, sep = "_") + ret <- list(fit = fit, hatvalues = hatvalues, + predict = predict, df = df, + Xnames = as.vector(Xnames)) + class(ret) <- c("bl_lin", "bl") + return(ret) + + } ## end dpp() + + return(dpp) +} + + + +#' Kronecker product or row tensor product of two base-learners with anisotropic penalty +#' +#' Kronecker product or row tensor product of two base-learners allowing for anisotropic penalties. +#' For the Kronecker product, \code{\%A\%} works in the general case, \code{\%A0\%} for the special case where +#' the penalty is zero in one direction. +#' For the row tensor product, \code{\%Xa0\%} works for the special case where +#' the penalty is zero in one direction. +#' +#' @param bl1 base-learner 1, e.g. \code{bbs(x1)} +#' @param bl2 base-learner 2, e.g. \code{bbs(x2)} +#' +#' @details +#' When \code{\%O\%} is called with a specification of \code{df} in both base-learners, +#' e.g. \code{bbs(x1, df = df1) \%O\% bbs(t, df = df2)}, the global \code{df} for the +#' Kroneckered base-learner is computed as \code{df = df1 * df2}. +#' And thus the penalty has only one smoothness parameter lambda resulting in an isotropic penalty, +#' \deqn{P = lambda * [(P1 o I) + (I o P2)],} +#' with overall penalty \eqn{P}, Kronecker product \eqn{o}, +#' marginal penalty matrices \eqn{P1, P2} and identity matrices \eqn{I}. +#' (Currie et al. (2006) introduced the generalized linear array model, which has a design matrix that +#' is composed of the Kronecker product of two marginal design matrices, which was implemented in mboost +#' as \code{\%O\%}. +#' See Brockhaus et al. (2015) for the application of array models to functional data.) +#' +#' In contrast, a Kronecker product with anisotropic penalty is obtained by \code{\%A\%}, +#' which allows for a different amount of smoothness in the two directions. +#' For example \code{bbs(x1, df = df1) \%A\% bbs(t, df = df2)} results in computing two +#' different values for lambda for the two marginal design matrices and a global value of +#' lambda to adjust for the global \code{df}, i.e. +#' \deqn{P = lambda * [(lambda1 * P1 o I) + (I o lambda2 * P2)],} +#' with Kronecker product \eqn{o}, +#' where \eqn{lambda1} is computed individually for \eqn{df1} and \eqn{P1}, +#' \eqn{lambda2} is computed individually for \eqn{df2} and \eqn{P2}, +#' and \eqn{lambda} is computed such that the global \eqn{df} hold \eqn{df = df1 * df2}. +#' For the computation of \eqn{lambda1} and \eqn{lambda2} weights specified in the model +#' call can only be used when the weights, are such that they are specified on the level +#' of rows and columns of the response matrix Y, e.g. resampling weights on the level of +#' rows of Y and integration weights on the columns of Y are possible. +#' If this the weights cannot be separated to blg1 and blg2 all +#' weights are set to 1 for the computation of \eqn{lambda1} and \eqn{lambda2} which implies that +#' \eqn{lambda1} and \eqn{lambda2} are equal over +#' folds of \code{cvrisk}. The computation of the global \eqn{lambda} considers the +#' specified \code{weights}, such the global \eqn{df} are correct. +#' +#' The operator \code{\%A0\%} treats the important special case where \eqn{lambda1 = 0} or +#' \eqn{lambda2 = 0}. In this case it suffices to compute the global lambda and computation gets +#' faster and arbitrary weights can be specified. Consider \eqn{lambda1 = 0} then the penalty becomes +#' \deqn{P = lambda * [(1 * P1 o I) + (I o lambda2 * P2)] = lambda * lambda2 * (I o P2),} +#' and only one global \eqn{lambda} is computed which is then \eqn{lambda * lambda2}. +#' +#' If the \code{formula} in \code{FDboost} contains base-learners connected by +#' \code{\%O\%}, \code{\%A\%} or \code{\%A0\%}, +#' those effects are not expanded with \code{timeformula}, allowing for model specifications +#' with different effects in time-direction. +#' +#' \code{\%Xa0\%} computes like \code{\%X\%} the row tensor product of two base-learners, +#' with the difference that it sets the penalty for one direction to zero. +#' Thus, \code{\%Xa0\%} behaves to \code{\%X\%} analogously like \code{\%A0\%} to \code{\%O\%}. +#' +#' @return An object of class \code{blg} (base-learner generator) with a \code{dpp} function +#' as for other \code{\link[mboost:baselearners]{baselearners}}. +#' +#' @references +#' Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +#' The functional linear array model. Statistical Modelling, 15(3), 279-300. +#' +#' Currie, I.D., Durban, M. and Eilers P.H.C. (2006): +#' Generalized linear array models with applications to multidimensional smoothing. +#' Journal of the Royal Statistical Society, Series B-Statistical Methodology, 68(2), 259-280. +#' +#' @examples +#' ######## Example for anisotropic penalty +#' data("viscosity", package = "FDboost") +#' ## set time-interval that should be modeled +#' interval <- "101" +#' +#' ## model time until "interval" and take log() of viscosity +#' end <- which(viscosity$timeAll == as.numeric(interval)) +#' viscosity$vis <- log(viscosity$visAll[,1:end]) +#' viscosity$time <- viscosity$timeAll[1:end] +#' # with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) +#' +#' ## isotropic penalty, as timeformula is kroneckered to each effect using %O% +#' ## only for the smooth intercept %A0% is used, as 1-direction should not be penalized +#' mod1 <- FDboost(vis ~ 1 + +#' bolsc(T_C, df = 1) + +#' bolsc(T_A, df = 1) + +#' bols(T_C, df = 1) %Xc% bols(T_A, df = 1), +#' timeformula = ~ bbs(time, df = 3), +#' numInt = "equal", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 9), +#' data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +#' ## cf. the formula that is passed to mboost +#' mod1$formulaMboost +#' +#' ## anisotropic effects using %A0%, as lambda1 = 0 for all base-learners +#' ## in this case using %A% gives the same model, but three lambdas are computed explicitly +#' mod1a <- FDboost(vis ~ 1 + +#' bolsc(T_C, df = 1) %A0% bbs(time, df = 3) + +#' bolsc(T_A, df = 1) %A0% bbs(time, df = 3) + +#' bols(T_C, df = 1) %Xc% bols(T_A, df = 1) %A0% bbs(time, df = 3), +#' timeformula = ~ bbs(time, df = 3), +#' numInt = "equal", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 9), +#' data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +#' ## cf. the formula that is passed to mboost +#' mod1a$formulaMboost +#' +#' ## alternative model specification by using a 0-matrix as penalty +#' ## only works for bolsc() as in bols() one cannot specify K +#' ## -> model without interaction term +#' K0 <- matrix(0, ncol = 2, nrow = 2) +#' mod1k0 <- FDboost(vis ~ 1 + +#' bolsc(T_C, df = 1, K = K0) + +#' bolsc(T_A, df = 1, K = K0), +#' timeformula = ~ bbs(time, df = 3), +#' numInt = "equal", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 9), +#' data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +#' ## cf. the formula that is passed to mboost +#' mod1k0$formulaMboost +#' +#' ## optimize mstop for mod1, mod1a and mod1k0 +#' ## ... +#' +#' ## compare estimated coefficients +#' \donttest{ +#' if (interactive()) { +#' oldpar <- par(mfrow=c(4, 2)) +#' plot(mod1, which = 1) +#' plot(mod1a, which = 1) +#' plot(mod1, which = 2) +#' plot(mod1a, which = 2) +#' plot(mod1, which = 3) +#' plot(mod1a, which = 3) +#' funplot(mod1$yind, predict(mod1, which=4)) +#' funplot(mod1$yind, predict(mod1a, which=4)) +#' par(oldpar) +#' } +#' } +#' +#' @name anisotropic_Kronecker +NULL + + + +#' @rdname anisotropic_Kronecker +#' @export +"%A%" <- function(bl1, bl2) { + + ### code snippet from %O% in package mboost + # if (is.list(bl1) && !inherits(bl1, "blg")) + # return(lapply(bl1, "%X%", bl2 = bl2)) + # + # if (is.list(bl2) && !inherits(bl2, "blg")) + # return(lapply(bl2, "%X%", bl1 = bl1)) + + cll <- paste(bl1$get_call(), "%A%", + bl2$get_call(), collapse = "") + stopifnot(inherits(bl1, "blg")) + stopifnot(inherits(bl2, "blg")) + + mf1 <- mboost_intern(bl1, fun = "model.frame.blg") + mf2 <- mboost_intern(bl2, fun = "model.frame.blg") + stopifnot(!any(colnames(mf1) %in% + colnames(mf2))) + mf <- c(mf1, mf2) + stopifnot(all(complete.cases(mf[[1]]))) + stopifnot(all(complete.cases(mf[[2]]))) + + index <- NULL + + vary <- "" + + ret <- list(model.frame = function() + return(mf), + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_vary = function() vary, + get_names = function() names(mf), + ## Is this all we want to change if we set names here? + set_names = function(value) attr(mf, "names") <<- value) + ## + class(ret) <- "blg" + + args1 <- environment(bl1$dpp)$args + args2 <- environment(bl2$dpp)$args + l1 <- args1$lambda + l2 <- args2$lambda + if (xor(is.null(l1), is.null(l2))) + stop("you cannot mix lambda and df in ", + sQuote("%A%")) + + if (!is.null(l1) && !is.null(l2)) { + ### there is no common lambda! + args <- list(lambda = NA, df = NA) + + }else{ + + ### anisotropic penalty matrix + ### save lambda, df and penalty matrices of the marginal base-learners + args <- list(lambda = NULL, + df = ifelse(is.null(args1$df), 1, args1$df) * + ifelse(is.null(args2$df), 1, args2$df), + lambda1 = args1$lambda, + df1 = args1$df, + K1 = environment(bl1$dpp)$K, + lambda2 = args2$lambda, + df2 = args2$df, + K2 = environment(bl2$dpp)$K) + } + + Xfun <- function(mf, vary, args) { + + newX1 <- environment(bl1$dpp)$newX + newX2 <- environment(bl2$dpp)$newX + + X1 <- newX1(as.data.frame(mf[bl1$get_names()]), + prediction = args$prediction) + K1 <- X1$K + X1 <- X1$X + if (!is.null(l1)) K1 <- l1 * K1 + MATRIX <- options("mboost_useMatrix")$mboost_useMatrix + if (MATRIX && !is(X1, "Matrix")) + X1 <- Matrix(X1) + if (MATRIX && !is(K1, "Matrix")) + K1 <- Matrix(K1) + + X2 <- newX2(as.data.frame(mf[bl2$get_names()]), + prediction = args$prediction) + K2 <- X2$K + X2 <- X2$X + if (!is.null(l2)) K2 <- l2 * K2 + if (MATRIX && !is(X2, "Matrix")) + X2 <- Matrix(X2) + if (MATRIX && !is(K2, "Matrix")) + K2 <- Matrix(K2) + suppressMessages( + K <- kronecker(K2, diag(ncol(X1))) + + kronecker(diag(ncol(X2)), K1) + ) + list(X = list(X1 = X1, X2 = X2), K = K) + } + + args$isotropic <- FALSE + + # ret$dpp <- mboost:::bl_lin_matrix(ret, Xfun = Xfun, args = args) + ret$dpp <- bl_lin_matrix_a(ret, Xfun = Xfun, args = args) + + return(ret) +} + + + +################################################################################### + + +# Kronecker product of two base-learners with penalty in one direction +# Only works for the special case were lambda1 or lambda2 is 0. +# Computes only one global lambda for the penalty. +#' @rdname anisotropic_Kronecker +#' @export +"%A0%" <- function(bl1, bl2) { + + # if (is.list(bl1) && !inherits(bl1, "blg")) + # return(lapply(bl1, "%X%", bl2 = bl2)) + # + # if (is.list(bl2) && !inherits(bl2, "blg")) + # return(lapply(bl2, "%X%", bl1 = bl1)) + + cll <- paste(bl1$get_call(), "%A0%", + bl2$get_call(), collapse = "") + stopifnot(inherits(bl1, "blg")) + stopifnot(inherits(bl2, "blg")) + + mf1 <- mboost_intern(bl1, fun = "model.frame.blg") + mf2 <- mboost_intern(bl2, fun = "model.frame.blg") + stopifnot(!any(colnames(mf1) %in% + colnames(mf2))) + mf <- c(mf1, mf2) + stopifnot(all(complete.cases(mf[[1]]))) + stopifnot(all(complete.cases(mf[[2]]))) + + index <- NULL + + vary <- "" + + ret <- list(model.frame = function() + return(mf), + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_vary = function() vary, + get_names = function() names(mf), + ## Is this all we want to change if we set names here? + set_names = function(value) attr(mf, "names") <<- value) + ## + class(ret) <- "blg" + + args1 <- environment(bl1$dpp)$args + args2 <- environment(bl2$dpp)$args + l1 <- args1$lambda + l2 <- args2$lambda + + if (!is.null(l1) && !is.null(l2)) { + ### there is no common lambda! + args <- list(lambda = NA, df = NA) + } else { + + ### anisotropic penalty matrix + df1 <- args1$df + df2 <- args2$df + + args <- list(lambda = NULL, + df = ifelse(is.null(df1), 1, df1) * + ifelse(is.null(df2), 1, df2)) + + if(!is.null(l1)) { + args$lambda1 <- l1 + } else { + ## case that df equals nr columns of design matrix -> no penalty -> lambda = 0 + if( ncol(environment(bl1$dpp)$X) - df1 < .Machine$double.eps*10^10){ + args$lambda1 <- 0 + if( ncol(environment(bl1$dpp)$X) - df1 < - .Machine$double.eps*10^10){ + warning("Specified df in ", bl1$get_call(), " are higher than the number of columns, ", + "which is ", ncol(environment(bl1$dpp)$X), ".") + } + }else{ + args$lambda1 <- 1 + } + } + + if(!is.null(l2)) { + args$lambda2 <- l2 + } else { + ## case that df equals nr columns of design matrix + if( ncol(environment(bl2$dpp)$X) - df2 < .Machine$double.eps*10^10){ + args$lambda2 <- 0 + if( ncol(environment(bl2$dpp)$X) - df2 < - .Machine$double.eps*10^10){ + warning("Specified df in ", bl2$get_call(), " are higher than the number of columns, ", + "which is ", ncol(environment(bl2$dpp)$X), ".") + } + }else{ + args$lambda2 <- 1 + } + } + + if(args$lambda1 != 0 && args$lambda2 != 0) + stop("%A0% can only be used when smoothing parameter is zero for one direction.") + + l1 <- args$lambda1 + l2 <- args$lambda2 + + } + + Xfun <- function(mf, vary, args) { + + newX1 <- environment(bl1$dpp)$newX + newX2 <- environment(bl2$dpp)$newX + + X1 <- newX1(as.data.frame(mf[bl1$get_names()]), + prediction = args$prediction) + K1 <- X1$K + X1 <- X1$X + if (!is.null(l1)) K1 <- l1 * K1 + MATRIX <- options("mboost_useMatrix")$mboost_useMatrix + if (MATRIX && !is(X1, "Matrix")) + X1 <- Matrix(X1) + if (MATRIX && !is(K1, "Matrix")) + K1 <- Matrix(K1) + + X2 <- newX2(as.data.frame(mf[bl2$get_names()]), + prediction = args$prediction) + K2 <- X2$K + X2 <- X2$X + if (!is.null(l2)) K2 <- l2 * K2 + if (MATRIX && !is(X2, "Matrix")) + X2 <- Matrix(X2) + if (MATRIX && !is(K2, "Matrix")) + K2 <- Matrix(K2) + suppressMessages( + K <- kronecker(K2, diag(ncol(X1))) + + kronecker(diag(ncol(X2)), K1) + ) + list(X = list(X1 = X1, X2 = X2), K = K) + } + + ret$dpp <- mboost_intern(ret, Xfun = Xfun, args = args, + fun = "bl_lin_matrix") + + return(ret) +} + + + + +# Row tensor product of two base-learners with penalty in one direction +# Only works for the special case were lambda1 or lambda2 is 0. +# Computes only one global lambda for the penalty. +#' @rdname anisotropic_Kronecker +#' @export +"%Xa0%" <- function(bl1, bl2) { + + if (is.list(bl1) && !inherits(bl1, "blg")) + return(lapply(bl1, "%Xa0%", bl2 = bl2)) + + if (is.list(bl2) && !inherits(bl2, "blg")) + return(lapply(bl2, "%Xa0%", bl1 = bl1)) + + cll <- paste(bl1$get_call(), "%Xa0%", + bl2$get_call(), collapse = "") + stopifnot(inherits(bl1, "blg")) + stopifnot(inherits(bl2, "blg")) + + stopifnot(!any(colnames(mboost_intern(bl1, fun = "model.frame.blg")) %in% + colnames(mboost_intern(bl2, fun = "model.frame.blg")))) + mf <- cbind( mboost_intern(bl1, fun = "model.frame.blg"), + mboost_intern(bl2, fun = "model.frame.blg") ) + + index1 <- bl1$get_index() + index2 <- bl2$get_index() + if (is.null(index1)) index1 <- seq_len(nrow(mf)) + if (is.null(index2)) index2 <- seq_len(nrow(mf)) + + mfindex <- cbind(index1, index2) + index <- NULL + + # CC <- all(Complete.cases(mf)) + CC <- all(mboost_intern(mf, fun = "Complete.cases")) + if (!CC) + warning("base-learner contains missing values;\n", + "missing values are excluded per base-learner, ", + "i.e., base-learners may depend on different", + " numbers of observations.") + ### option + DOINDEX <- (nrow(mf) > options("mboost_indexmin")[[1]]) + if (is.null(index)) { + if (!CC || DOINDEX) { + index <- mboost_intern(mfindex, fun = "get_index") + mf <- mf[index[[1]],,drop = FALSE] + index <- index[[2]] + } + } + + vary <- "" + + ret <- list(model.frame = function() + if (is.null(index)) return(mf) else return(mf[index,,drop = FALSE]), + get_call = function(){ + cll <- deparse(cll, width.cutoff=500L) + if (length(cll) > 1) + cll <- paste(cll, collapse="") + cll + }, + get_data = function() mf, + get_index = function() index, + get_vary = function() vary, + get_names = function() colnames(mf), + ## Is this all we want to change if we set names here? + set_names = function(value) attr(mf, "names") <<- value) + ## + class(ret) <- "blg" + + args1 <- environment(bl1$dpp)$args + args2 <- environment(bl2$dpp)$args + l1 <- args1$lambda + l2 <- args2$lambda + + if (!is.null(l1) && !is.null(l2)) { + args <- list(lambda = 1, df = NULL) + + } else { + + ### anisotropic penalty matrix + df1 <- args1$df + df2 <- args2$df + + args <- list(lambda = NULL, + df = ifelse(is.null(df1), 1, df1) * + ifelse(is.null(df2), 1, df2)) + if(!is.null(l1)) { + args$lambda1 <- l1 + } else { + ## case that df equals nr columns of design matrix -> no penalty -> lambda = 0 + if( ncol(environment(bl1$dpp)$X) - df1 < .Machine$double.eps*10^10){ + args$lambda1 <- 0 + if( ncol(environment(bl1$dpp)$X) - df1 < - .Machine$double.eps*10^10){ + warning("Specified df in ", bl1$get_call(), " are higher than the number of columns, ", + "which is ", ncol(environment(bl1$dpp)$X), ".") + } + }else{ + args$lambda1 <- 1 + } + } + + if(!is.null(l2)) { + args$lambda2 <- l2 + } else { + ## case that df equals nr columns of design matrix + if( ncol(environment(bl2$dpp)$X) - df2 < .Machine$double.eps*10^10){ + args$lambda2 <- 0 + if( ncol(environment(bl2$dpp)$X) - df2 < - .Machine$double.eps*10^10){ + warning("Specified df in ", bl2$get_call(), " are higher than the number of columns, ", + "which is ", ncol(environment(bl2$dpp)$X), ".") + } + }else{ + args$lambda2 <- 1 + } + } + + if(args$lambda1 != 0 && args$lambda2 != 0) + stop("%Xa0% can only be used when smoothing parameter is zero for one direction.") + + l1 <- args$lambda1 + l2 <- args$lambda2 + + } + + Xfun <- function(mf, vary, args) { + + newX1 <- environment(bl1$dpp)$newX + newX2 <- environment(bl2$dpp)$newX + + X1 <- newX1(mf[, bl1$get_names(), drop = FALSE], + prediction = args$prediction) + K1 <- X1$K + X1 <- X1$X + if (!is.null(l1)) K1 <- l1 * K1 + MATRIX <- options("mboost_useMatrix")$mboost_useMatrix + if (MATRIX && !is(X1, "Matrix")) + X1 <- Matrix(X1) + if (MATRIX && !is(K1, "Matrix")) + K1 <- Matrix(K1) + + X2 <- newX2(mf[, bl2$get_names(), drop = FALSE], + prediction = args$prediction) + K2 <- X2$K + X2 <- X2$X + if (!is.null(l2)) K2 <- l2 * K2 + if (MATRIX && !is(X2, "Matrix")) + X2 <- Matrix(X2) + if (MATRIX && !is(K2, "Matrix")) + K2 <- Matrix(K2) + suppressMessages( + X <- kronecker(X1, Matrix(1, ncol = ncol(X2), + dimnames = list("", colnames(X2))), + make.dimnames = TRUE) * + kronecker(Matrix(1, ncol = ncol(X1), + dimnames = list("", colnames(X1))), + X2, make.dimnames = TRUE) + ) + suppressMessages( + K <- kronecker(K1, diag(ncol(X2))) + + kronecker(diag(ncol(X1)), K2) + ) + list(X = X, K = K) + } + + ret$dpp <- mboost_intern(ret, Xfun = Xfun, args = args, fun = "bl_lin") + + return(ret) +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/crossvalidation.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/crossvalidation.R new file mode 100644 index 0000000..55a1636 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/crossvalidation.R @@ -0,0 +1,1747 @@ + +#' Cross-Validation and Bootstrapping over Curves +#' +#' Cross-validation and bootstrapping over curves to compute the empirical risk for +#' hyper-parameter selection. +#' +#' @param object fitted FDboost-object +#' @param folds a weight matrix with number of rows equal to the number of observed trajectories. +#' @param grid the grid over which the optimal number of boosting iterations (mstop) is searched. +#' @param showProgress logical, defaults to \code{TRUE}. +#' @param compress logical, defaults to \code{FALSE}. Only used to force a meaningful +#' behaviour of \code{applyFolds} with hmatrix objects when using nested resampling. +#' @param papply (parallel) apply function, defaults to \code{\link{mclapply}} from +#' R package \code{parallel}, see \code{\link[mboost]{cvrisk}} for details. +#' @param fun if \code{fun} is \code{NULL}, the out-of-bag risk is returned. +#' \code{fun}, as a function of \code{object}, +#' may extract any other characteristic of the cross-validated models. These are returned as is. +#' @param riskFun only exists in \code{applyFolds}; allows to compute other risk functions than the risk +#' of the family that was specified in object. +#' Must be specified as function of arguments \code{(y, f, w = 1)}, where \code{y} is the +#' observed response, \code{f} is the prediction from the model and \code{w} is the weight. +#' The risk function must return a scalar numeric value for vector valued input. +#' @param numInt only exists in \code{applyFolds}; the scheme for numerical integration, +#' see \code{numInt} in \code{\link{FDboost}}. +#' @param mc.preschedule Defaults to \code{FALSE}. Preschedule tasks if they are parallelized using \code{mclapply}. +#' For details see \code{\link{mclapply}}. +#' @param ... further arguments passed to the (parallel) apply function. +#' +#' @param id the id-vector as integers 1, 2, ... specifying which observations belong to the same curve, +#' deprecated in \code{cvMa()}. +#' @param weights a numeric vector of (integration) weights, defaults to 1. +#' @param type character argument for specifying the cross-validation +#' method. Currently (stratified) bootstrap, k-fold cross-validation, subsampling and +#' leaving-one-curve-out cross validation (i.e. jack knife on curves) are implemented. +#' @param B number of folds, per default 25 for \code{bootstrap} and +#' \code{subsampling} and 10 for \code{kfold}. +#' @param prob percentage of observations to be included in the learning samples +#' for subsampling. +#' @param strata a factor of the same length as \code{weights} for stratification. +#' +#' @param ydim dimensions of response-matrix +#' +#' @details The number of boosting iterations is an important hyper-parameter of boosting. +#' It be chosen using the functions \code{applyFolds} or \code{cvrisk.FDboost}. Those functions +#' compute honest, i.e., out-of-bag, estimates of the empirical risk for different +#' numbers of boosting iterations. +#' The weights (zero weights correspond to test cases) are defined via the folds matrix, +#' see \code{\link[mboost]{cvrisk}} in package mboost. +#' +#' In case of functional response, we recommend to use \code{applyFolds}. +#' It recomputes the model in each fold using \code{FDboost}. Thus, all parameters are recomputed, +#' including the smooth offset (if present) and the identifiability constraints (if present, only +#' relevant for \code{bolsc}, \code{brandomc} and \code{bbsc}). +#' Note, that the function \code{applyFolds} expects folds that give weights +#' per curve without considering integration weights. +#' +#' The function \code{cvrisk.FDboost} is a wrapper for \code{\link[mboost]{cvrisk}} in package mboost. +#' It overrides the default for the folds, so that the folds are sampled on the level of curves +#' (not on the level of single observations, which does not make sense for functional response). +#' Note that the smooth offset and the computation of the identifiability constraints +#' are not part of the refitting if \code{cvrisk} is used. +#' Per default the integration weights of the model fit are used to compute the prediction errors +#' (as the integration weights are part of the default folds). +#' Note that in \code{cvrisk} the weights are rescaled to sum up to one. +#' +#' The functions \code{cvMa} and \code{cvLong} can be used to build an appropriate +#' weight matrix for functional response to be used with \code{cvrisk} as sampling +#' is done on the level of curves. The probability for each +#' curve to enter a fold is equal over all curves. +#' The function \code{cvMa} takes the dimensions of the response matrix as input argument and thus +#' can only be used for regularly observed response. +#' The function \code{cvLong} takes the id variable and the weights as arguments and thus can be used +#' for responses in long format that are potentially observed irregularly. +#' +#' If \code{strata} is defined +#' sampling is performed in each stratum separately thus preserving +#' the distribution of the \code{strata} variable in each fold. +#' +#' @note Use argument \code{mc.cores = 1L} to set the numbers of cores that is used in +#' parallel computation. On Windows only 1 core is possible, \code{mc.cores = 1}, which is the default. +#' +#' @seealso \code{\link[mboost]{cvrisk}} to perform cross-validation with scalar response. +#' +#' @return \code{cvMa} and \code{cvLong} return a matrix of sampling weights to be used in \code{cvrisk}. +#' +#' The functions \code{applyFolds} and \code{cvrisk.FDboost} return a \code{cvrisk}-object, +#' which is a matrix of the computed out-of-bag risk. The matrix has the folds in rows and the +#' number of boosting iteratins in columns. Furhtermore, the matrix has attributes including: +#' \item{risk}{name of the applied risk function} +#' \item{call}{model call of the model object} +#' \item{mstop}{gird of stopping iterations that is used} +#' \item{type}{name for the type of folds} +#' +#' @examples +#' Ytest <- matrix(rnorm(15), ncol = 3) # 5 trajectories, each with 3 observations +#' Ylong <- as.vector(Ytest) +#' ## 4-folds for bootstrap for the response in long format without integration weights +#' cvMa(ydim = c(5,3), type = "bootstrap", B = 4) +#' cvLong(id = rep(1:5, times = 3), type = "bootstrap", B = 4) +#' +#' if(require(fda)){ +#' ## load the data +#' data("CanadianWeather", package = "fda") +#' +#' ## use data on a daily basis +#' canada <- with(CanadianWeather, +#' list(temp = t(dailyAv[ , , "Temperature.C"]), +#' l10precip = t(dailyAv[ , , "log10precip"]), +#' l10precip_mean = log(colMeans(dailyAv[ , , "Precipitation.mm"]), base = 10), +#' lat = coordinates[ , "N.latitude"], +#' lon = coordinates[ , "W.longitude"], +#' region = factor(region), +#' place = factor(place), +#' day = 1:365, ## corresponds to t: evaluation points of the fun. response +#' day_s = 1:365)) ## corresponds to s: evaluation points of the fun. covariate +#' +#' ## center temperature curves per day +#' canada$tempRaw <- canada$temp +#' canada$temp <- scale(canada$temp, scale = FALSE) +#' rownames(canada$temp) <- NULL ## delete row-names +#' +#' ## fit the model +#' mod <- FDboost(l10precip ~ 1 + bolsc(region, df = 4) + +#' bsignal(temp, s = day_s, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), +#' timeformula = ~ bbs(day, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), +#' data = canada) +#' mod <- mod[75] +#' +#' \donttest{ +#' #### create folds for 3-fold bootstrap: one weight for each curve +#' set.seed(123) +#' folds_bs <- cv(weights = rep(1, mod$ydim[1]), type = "bootstrap", B = 3) +#' +#' ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations +#' cvr <- applyFolds(mod, folds = folds_bs, grid = 1:75) +#' +#' ## weights per observation point +#' folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] +#' attr(folds_bs_long, "type") <- "3-fold bootstrap" +#' ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations +#' cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) +#' } +#' +#' \donttest{ +#' ## plot the out-of-bag risk +#' oldpar <- par(mfrow = c(1,3)) +#' plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) +#' plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) +#' par(oldpar) +#' } +#' +#'} +#' +#' @aliases cvMa cvLong cvrisk.FDboost +#' +#' @export +## computes the empirical out-of-bag risk for each fold +applyFolds <- function(object, folds = cv(rep(1, length(unique(object$id))), type = "bootstrap"), + grid = 1:mstop(object), fun = NULL, + riskFun = NULL, numInt = object$numInt, + papply = mclapply, + mc.preschedule = FALSE, + showProgress = TRUE, + compress = FALSE, + ...) { + + if (is.null(folds)) { + stop("Specify folds.") + } + ## check that folds are given on the level of curves + if(length(unique(object$id)) != nrow(folds)){ + stop("The folds-matrix must have one row per observed trajectory.") + } + + if(inherits(object, "FDboostLong")){ # irregular response + nObs <- length(unique(object$id)) # number of curves + Gy <- NULL # number of time-points per curve + }else{ # regular response / scalar response + nObs <- object$ydim[1] # number of curves + Gy <- object$ydim[2] # number of time-points per curve + if(class(object)[1] == "FDboostScalar"){ + nObs <- length(object$response) + Gy <- 1 + } + } + + sample_weights <- rep(1, length(unique(object$id))) # length N + # if(any(sample_weights == 0)) warning("zero weights") # fullfilled per construction + + # save integration weights of original model + if(is.null(numInt)){ + numInt <- "equal" + warning("'numInt' is NULL. It is set to 'equal' which means that all integration weights are set to 1.") + } + if(!numInt %in% c("equal", "Riemann")) + warning("argument 'numInt' is ignored as it is none of 'equal' and 'Riemann'.") + + if(is.numeric(numInt)){ # use the integration scheme specified in applyFolds + if(length(numInt) != length(object$yind)) stop("Length of integration weights and time vector are not equal.") + integration_weights <- numInt + }else{ + + if(numInt == "Riemann"){ # use the integration scheme specified in applyFolds + if(!inherits(object, "FDboostLong")){ + integration_weights <- as.vector(integrationWeights(X1 = matrix(object$response, + ncol = object$ydim[2]), object$yind)) + }else{ + integration_weights <- integrationWeights(X1 = object$response, object$yind, object$id) + } + }else{ ## numInt == "equal" + integration_weights <- rep(1, length(object$response)) + ## correct integration weights for matrix valued response like possibly in Binomial() + if( class(object)[1] == "FDboostScalar") integration_weights <- rep(1, NROW(object$response)) + } + } + + ### get yind in long format + yindLong <- object$yind + if(!inherits(object, "FDboostLong")){ + yindLong <- rep(object$yind, each = nObs) + } + ### compute ("length of each trajectory")^-1 in the response + ### more precisely ("sum of integration weights")^-1 is used + if(numInt == "equal"){ + lengthTi1 <- rep(1, l = length(unique(object$id))) + }else{ + if(length(object$yind) > 1){ + # lengthTi1 <- 1/tapply(yindLong[!is.na(response)], object$id[!is.na(response)], function(x) max(x) - min(x)) + lengthTi1 <- 1/tapply(integration_weights, object$id, function(x) sum(x)) + if(any(is.infinite(lengthTi1))) lengthTi1[is.infinite(lengthTi1)] <- max(lengthTi1[!is.infinite(lengthTi1)]) + }else{ + lengthTi1 <- rep(1, l = length(object$response)) + } + } + + # Function to suppress the warning of missings in the response + h <- function(w){ + if( any( grepl( "response contains missing values;", w, fixed = TRUE) ) ) + invokeRestart( "muffleWarning" ) + } + + ### start preparing the data + dathelp <- object$data + nameyind <- attr(object$yind, "nameyind") + dathelp[[nameyind]] <- object$yind + + ## try to set up data using $get_data() + ## problem with index for bl containing index, and you do not get s for bsignal/bhist + if(FALSE){ + dathelp2 <- list() + for(j in seq_along(object$baselearner)){ + dat_bl_j <- object$baselearner[[j]]$get_data() ## object$baselearner[[j]]$model.frame() + # if the variable is already present, do not add it again + dathelp2 <- c(dathelp2, dat_bl_j[!names(dat_bl_j) %in% names(dathelp2)]) + } + } + + if(!inherits(object, "FDboostLong") && !inherits(object, "FDboostScalar")){ + dathelp[[object$yname]] <- matrix(object$response, ncol=object$ydim[2]) + dathelp$integration_weights <- matrix(integration_weights, ncol=object$ydim[2]) + dathelp$object_id <- object$id + }else{ + dathelp[[object$yname]] <- object$response + dathelp$integration_weights <- integration_weights + } + + ## get the names of all variables x_i, i = 1, ... , N + names_variables <- unlist(lapply(object$baselearner, function(x) x$get_names() )) + ## check for index + has_index <- sapply(object$baselearner, function(x) !is.null(x$get_index())) + if( any( has_index )){ + index_names <- sapply(lapply(object$baselearner[has_index], function(x) x$get_call()), + function(l) gsub("index[[:space:]*]=[[:space:]*]|\\,","", + regmatches(l, regexpr('index[[:space:]*]=.*\\,', l))) + ) + } else index_names <- NULL + + names(names_variables) <- NULL + names_variables <- names_variables[names_variables != nameyind] + names_variables <- names_variables[names_variables != "ONEx"] + names_variables <- names_variables[names_variables != "ONEtime"] + if(!inherits(object, "FDboostLong")) names_variables <- c(object$yname, "integration_weights", names_variables) + + length_variables <- if(inherits(object, "FDboostScalar")) + lapply(dathelp[names_variables], length) else + lapply(dathelp[names_variables], NROW) + names_variables_long <- names_variables[ length_variables == length(object$id) ] + nothmatrix <- ! sapply(dathelp[names_variables_long], is.hmatrix) + names_variables_long <- names_variables_long[ nothmatrix ] + if(identical(names_variables_long, character(0))) names_variables_long <- NULL + + names_variables <- names_variables[! names_variables %in% names_variables_long ] + if(identical(names_variables, character(0))) names_variables <- NULL + + ## check if there is a baselearner without brackets + # the probelm with such base-learners is that their data is not contained in object$data + # using object$baselearner[[j]]$get_data() is difficult as this can be blow up by index for %X% + singleBls <- gsub("\\s", "", unlist(lapply(strsplit( + strsplit(object$formulaFDboost, "~", fixed = TRUE)[[1]][2], # split formula + "+", fixed = TRUE)[[1]], # split additive terms + function(y) strsplit(y, split = "%.{1,3}%")) # split single baselearners + )) + + singleBls <- singleBls[singleBls != "1"] + + if(any(!grepl("(", singleBls, fixed = TRUE))) + stop(paste0("applyFolds can not deal with the following base-learner(s) without brackets: ", + toString(singleBls[!grepl("(", singleBls, fixed = TRUE)]))) + + + ## check if data includes all variables + if(any(whMiss <- ! c(names_variables, + object$yname, + nameyind, + "integration_weights", + names_variables_long) %in% names(dathelp))){ + + # for each missing variable get the first baselearner, which contains the variable + blWithMissVars <- lapply(names_variables[whMiss], function(w) + unlist(lapply(seq_along(object$baselearner), function(i) if( + any( grepl(w, object$baselearner[[i]]$get_names() ) )) return(i)) + )[1]) + + stop(paste0("base-learner(s) ", toString(unlist(list(1,2))), + " contain(s) variables, which are not part of the data object.")) + + } + + ## fitfct <- object$update + fitfct <- function(weights, oobweights){ + + ## get data according to weights + if(inherits(object, "FDboostLong")){ + dat_weights <- reweightData(data = dathelp, vars = names_variables, + longvars = c(object$yname, nameyind, "integration_weights", names_variables_long), + weights = weights, idvars = c(attr(object$id, "nameid"), index_names), + compress = compress) + }else if(class(object)[1] == "FDboostScalar"){ + dat_weights <- reweightData(data = dathelp, + vars = c(names_variables, names_variables_long), + weights = weights) + }else{ + dat_weights <- reweightData(data = dathelp, vars = names_variables, + longvars = names_variables_long, + weights = weights, idvars = c("object_id", index_names)) + } + + # check for factors + + isFac <- sapply(dathelp, is.factor) + + if(any(isFac)){ + namesFac <- names(isFac)[isFac] + + for(i in seq_along(namesFac)){ + + if(nlevels(droplevels(dathelp[[namesFac[i]]])) != + nlevels(droplevels(dat_weights[[namesFac[i]]]))) + stop(paste0("The factor variable '", namesFac[i], "' has unobserved levels in the training data. ", + "Make sure that training data in each fold contains all factor levels.")) + + } + } + + call <- object$callEval + call$data <- dat_weights + if(! is.null(call$weights)) warning("Argument weights of original model is not considered.") + call$weights <- NULL + + ## fit the model for dat_weights + mod <- withCallingHandlers(suppressMessages(eval(call)), warning = h) # suppress the warning of missing responses + mod <- mod[max(grid)] + + mod + + } + + ## create data frame for model fit and use the weights vector for the CV + # oobrisk <- matrix(0, nrow = ncol(folds), ncol = length(grid)) + + if (!is.null(fun)) + stopifnot(is.function(fun)) + + fam_name <- object$family@name + + call <- deparse(object$call) + + + if (is.null(fun)) { + dummyfct <- function(weights, oobweights) { + + mod <- fitfct(weights = weights, oobweights = oobweights) + mod <- mod[max(grid)] + # mod$risk()[grid] + + # get risk function of the family + if(is.null(riskFun)){ + myfamily <- get("family", environment(mod$update)) + riskfct <- myfamily@risk + }else{ + stopifnot(is.function(riskFun)) + riskfct <- riskFun + } + + ## get data according to oobweights + if(inherits(object, "FDboostLong")){ + dathelp$lengthTi1 <- c(lengthTi1) + dat_oobweights <- reweightData(data = dathelp, vars = c(names_variables, "lengthTi1"), + longvars = c(object$yname, nameyind, + "integration_weights", names_variables_long), + weights = oobweights, + idvars = c(attr(object$id, "nameid"), index_names), + compress = compress) + ## funplot(dat_oobweights[[nameyind]], dat_oobweights[[object$yname]], + ## id = dat_oobweights[[attr(object$id, "nameid")]]) + + for(v in names_variables){ ## blow up covariates by id so that data can be used with predict() + if(!is.null(dim(dat_oobweights[[v]]))){ + dat_oobweights[[v]] <- dat_oobweights[[v]][dat_oobweights[[attr(object$id, "nameid")]], ] + }else{ + dat_oobweights[[v]] <- dat_oobweights[[v]][dat_oobweights[[attr(object$id, "nameid")]]] + } + } + response_oobweights <- c(dat_oobweights[[object$yname]]) + + }else{ ## scalar or regular response + + if(class(object)[1] == "FDboostScalar"){ + dat_oobweights <- reweightData(data = dathelp, + vars = c(names_variables, names_variables_long), + weights = oobweights) + response_oobweights <- dat_oobweights[[object$yname]] + }else{ + dat_oobweights <- reweightData(data = dathelp, vars = names_variables, + longvars = names_variables_long, + weights = oobweights, idvars = c("object_id", index_names)) + response_oobweights <- c(dat_oobweights[[object$yname]]) + } + + } + + if(is.character(response_oobweights)) response_oobweights <- factor(response_oobweights) + ## this check is important for Binomial() as it recodes factor to -1, 1 + response_oobweights <- myfamily@check_y(response_oobweights) + + # Function to suppress the warning of extrapolation in bbs / bbsc + h2 <- function(w){ + if( any( grepl( "Linear extrapolation used.", w) ) ) + invokeRestart( "muffleWarning" ) + } + + if(inherits(object, "FDboostLong")){ + + if(numInt == "equal"){ + oobwstand <- dat_oobweights$integration_weights * (1/sum(dat_oobweights$integration_weights)) + }else{ + # compute integration weights for standardizing risk + oobwstand <- dat_oobweights$lengthTi1[dat_oobweights[[attr(object$id, "nameid")]]] * + dat_oobweights$integration_weights * (1/sum(oobweights)) + } + + # compute risk with integration weights like in FDboost::validateFDboost + risk <- sapply(grid, function(g){riskfct( + response_oobweights, + withCallingHandlers(predict(mod[g], newdata = dat_oobweights, toFDboost = FALSE), warning = h2), + w = oobwstand )}) ## oobwstand[oobweights[object$id] != 0 ] + + }else{ + + if(numInt == "equal"){ # oobweights for i = 1, ..., N + oobwstand <- oobweights[object$id]*(1/sum(oobweights[object$id])) + }else{ + # compute integration weights for standardizing risk + oobwstand <- lengthTi1[object$id]*oobweights[object$id]*integration_weights*(1/sum(oobweights)) + } + + # compute risk with integration weights like in FDboost::validateFDboost + risk <- sapply(grid, function(g){riskfct( + response_oobweights, + withCallingHandlers(predict(mod[g], newdata = dat_oobweights, toFDboost = FALSE), warning = h2), + w = oobwstand[oobweights != 0 ])}) + + } + + if(showProgress) cat(".") + + risk + } + + } else { ## !is.null(fun) + + if(!is.null(riskFun)) warning("riskFun is ignored as fun is specified.") + + dummyfct <- function(weights, oobweights) { + mod <- fitfct(weights = weights, oobweights = oobweights) + mod[max(grid)] + ## make sure dispatch works correctly + class(mod) <- class(object) + + fun(mod) # Provide an extra argument for dat_oobweights? + } + } + + ## use case weights as out-of-bag weights (but set inbag to 0) + OOBweights <- matrix(rep(sample_weights, ncol(folds)), ncol = ncol(folds)) + OOBweights[folds > 0] <- 0 + + if (isTRUE(all.equal(papply, mclapply))) { + oobrisk <- papply(seq_len(ncol(folds)), + function(i) try(dummyfct(weights = folds[, i], + oobweights = OOBweights[, i]), + silent = TRUE), + mc.preschedule = mc.preschedule, + ...) + } else { + oobrisk <- papply(seq_len(ncol(folds)), + function(i) try(dummyfct(weights = folds[, i], + oobweights = OOBweights[, i]), + silent = TRUE), + ...) + } + + ## if any errors occured remove results and issue a warning + if (any(idx <- sapply(oobrisk, is.character))) { + if(sum(idx) == length(idx)){ + stop("All folds encountered an error.\n", + "Original error message(s):\n", + sapply(oobrisk[idx], function(x) x)) + } + warning(sum(idx), " fold(s) encountered an error. ", + "Results are based on ", ncol(folds) - sum(idx), + " folds only.\n", + "Original error message(s):\n", + sapply(oobrisk[idx], function(x) x)) + oobrisk[idx] <- NULL + } + + if (!is.null(fun)) + return(oobrisk) + + oobrisk <- t(as.data.frame(oobrisk)) + ## oobrisk <- oobrisk / colSums(OOBweights[object$id, ]) # is done in dummyfct() + colnames(oobrisk) <- grid + rownames(oobrisk) <- seq_len(nrow(oobrisk)) + attr(oobrisk, "risk") <- fam_name + attr(oobrisk, "call") <- call + attr(oobrisk, "mstop") <- grid + attr(oobrisk, "type") <- ifelse(!is.null(attr(folds, "type")), + attr(folds, "type"), "user-defined") + + class(oobrisk) <- c("cvrisk", "applyFolds") + + oobrisk +} + + +#' Cross-Validation and Bootstrapping over Curves +#' +#' DEPRECATED! +#' The function \code{validateFDboost()} is deprecated, +#' use \code{\link{applyFolds}} and \code{\link{bootstrapCI}} instead. +#' +#' @param object fitted FDboost-object +#' @param response optional, specify a response vector for the computation of the prediction errors. +#' Defaults to \code{NULL} which means that the response of the fitted model is used. +#' @param folds a weight matrix with number of rows equal to the number of observed trajectories. +#' @param grid the grid over which the optimal number of boosting iterations (mstop) is searched. +#' @param getCoefCV logical, defaults to \code{TRUE}. Should the coefficients and predictions +#' be computed for all the models on the sampled data? +#' @param riskopt how is the optimal stopping iteration determined. Defaults to the mean, +#' but median is possible as well. +#' @param mrdDelete Delete values that are \code{mrdDelete} percent smaller than the mean +#' of the response. Defaults to 0 which means that only response values being 0 +#' are not used in the calculation of the MRD (= mean relative deviation). +#' @param refitSmoothOffset logical, should the offset be refitted in each learning sample? +#' Defaults to \code{TRUE}. In \code{\link[mboost]{cvrisk}} the offset of the original model fit in +#' \code{object} is used in all folds. +#' @param showProgress logical, defaults to \code{TRUE}. +#' @param fun if \code{fun} is \code{NULL}, the out-of-bag risk is returned. +#' \code{fun}, as a function of \code{object}, +#' may extract any other characteristic of the cross-validated models. These are returned as is. +#' +#' @param ... further arguments passed to \code{\link{mclapply}} +#' +#' @details The number of boosting iterations is an important hyper-parameter of boosting +#' and can be chosen using the function \code{validateFDboost} as they compute +#' honest, i.e., out-of-bag, estimates of the empirical risk for different numbers of boosting iterations. +#' +#' The function \code{validateFDboost} is especially suited to models with functional response. +#' Using the option \code{refitSmoothOffset} the offset is refitted on each fold. +#' Note, that the function \code{validateFDboost} expects folds that give weights +#' per curve without considering integration weights. The integration weights of +#' \code{object} are used to compute the empirical risk as integral. The argument \code{response} +#' can be useful in simulation studies where the true value of the response is known but for +#' the model fit the response is used with noise. +#' +#' @return The function \code{validateFDboost} returns a \code{validateFDboost}-object, +#' which is a named list containing: +#' \item{response}{the response} +#' \item{yind}{the observation points of the response} +#' \item{id}{the id variable of the response} +#' \item{folds}{folds that were used} +#' \item{grid}{grid of possible numbers of boosting iterations} +#' \item{coefCV}{if \code{getCoefCV} is \code{TRUE} the estimated coefficient functions in the folds} +#' \item{predCV}{if \code{getCoefCV} is \code{TRUE} the out-of-bag predicted values of the response} +#' \item{oobpreds}{if the type of folds is curves the out-of-bag predictions for each trajectory} +#' \item{oobrisk}{the out-of-bag risk} +#' \item{oobriskMean}{the out-of-bag risk at the minimal mean risk} +#' \item{oobmse}{the out-of-bag mean squared error (MSE)} +#' \item{oobrelMSE}{the out-of-bag relative mean squared error (relMSE)} +#' \item{oobmrd}{the out-of-bag mean relative deviation (MRD)} +#' \item{oobrisk0}{the out-of-bag risk without consideration of integration weights} +#' \item{oobmse0}{the out-of-bag mean squared error (MSE) without consideration of integration weights} +#' \item{oobmrd0}{the out-of-bag mean relative deviation (MRD) without consideration of integration weights} +#' \item{format}{one of "FDboostLong" or "FDboost" depending on the class of the object} +#' \item{fun_ret}{list of what fun returns if fun was specified} +#' +#' @examples +#' \donttest{ +#' if(require(fda)){ +#' ## load the data +#' data("CanadianWeather", package = "fda") +#' +#' ## use data on a daily basis +#' canada <- with(CanadianWeather, +#' list(temp = t(dailyAv[ , , "Temperature.C"]), +#' l10precip = t(dailyAv[ , , "log10precip"]), +#' l10precip_mean = log(colMeans(dailyAv[ , , "Precipitation.mm"]), base = 10), +#' lat = coordinates[ , "N.latitude"], +#' lon = coordinates[ , "W.longitude"], +#' region = factor(region), +#' place = factor(place), +#' day = 1:365, ## corresponds to t: evaluation points of the fun. response +#' day_s = 1:365)) ## corresponds to s: evaluation points of the fun. covariate +#' +#' ## center temperature curves per day +#' canada$tempRaw <- canada$temp +#' canada$temp <- scale(canada$temp, scale = FALSE) +#' rownames(canada$temp) <- NULL ## delete row-names +#' +#' ## fit the model +#' mod <- FDboost(l10precip ~ 1 + bolsc(region, df = 4) + +#' bsignal(temp, s = day_s, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), +#' timeformula = ~ bbs(day, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), +#' data = canada) +#' mod <- mod[75] +#' +#' #### create folds for 3-fold bootstrap: one weight for each curve +#' set.seed(124) +#' folds_bs <- cv(weights = rep(1, mod$ydim[1]), type = "bootstrap", B = 3) +#' +#' ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations +#' cvr <- applyFolds(mod, folds = folds_bs, grid = 1:75) +#' +#' ## compute out-of-bag risk and coefficient estimates on folds +#' cvr2 <- validateFDboost(mod, folds = folds_bs, grid = 1:75) +#' +#' ## weights per observation point +#' folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] +#' attr(folds_bs_long, "type") <- "3-fold bootstrap" +#' ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations +#' cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) +#' +#' ## plot the out-of-bag risk +#' oldpar <- par(mfrow = c(1,3)) +#' plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) +#' plot(cvr2) +#' plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) +#' +#' ## plot the estimated coefficients per fold +#' ## more meaningful for higher number of folds, e.g., B = 100 +#' par(mfrow = c(2,2)) +#' plotPredCoef(cvr2, terms = FALSE, which = 1) +#' plotPredCoef(cvr2, terms = FALSE, which = 3) +#' +#' ## compute out-of-bag risk and predictions for leaving-one-curve-out cross-validation +#' cvr_jackknife <- validateFDboost(mod, folds = cvLong(unique(mod$id), +#' type = "curves"), grid = 1:75) +#' plot(cvr_jackknife) +#' ## plot oob predictions per fold for 3rd effect +#' plotPredCoef(cvr_jackknife, which = 3) +#' ## plot coefficients per fold for 2nd effect +#' plotPredCoef(cvr_jackknife, which = 2, terms = FALSE) +#' +#' par(oldpar) +#' +#'} +#'} +#' +#' @export +validateFDboost <- function(object, response = NULL, + #folds=cvMa(ydim=object$ydim, weights=model.weights(object), type="bootstrap"), + folds = cv(rep(1, length(unique(object$id))), type = "bootstrap"), + grid = 1:mstop(object), + fun = NULL, + getCoefCV = TRUE, riskopt = c("mean","median"), + mrdDelete = 0, refitSmoothOffset = TRUE, + showProgress = TRUE, ...){ + + .Deprecated(new = "applyFolds", + msg = "'validateFDboost' is deprecated. Use 'applyFolds' and 'bootstrapCI' instead.") + + names_bl <- names(object$baselearner) + if(any(grepl("brandomc", names_bl, fixed = TRUE))) message("For brandomc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bolsc", names_bl, fixed = TRUE))) message("For bolsc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bbsc", names_bl, fixed = TRUE))) message("For bbsc, the transformation matrix Z is fixed over all folds.") + + type <- attr(folds, "type") + if(is.null(type)) type <- "unknown" + call <- match.call() + riskopt <- match.arg(riskopt) + + ## check that folds are given on the level of curves + if(length(unique(object$id)) != nrow(folds)){ + stop("The folds-matrix must have one row per observed trajectory.") + } + + if(inherits(object, "FDboostLong")){ # irregular response + nObs <- length(unique(object$id)) # number of curves + Gy <- NULL # number of time-points per curve + }else{ # regular response / scalar response + nObs <- object$ydim[1] # number of curves + Gy <- object$ydim[2] # number of time-points per curve + if(class(object)[1] == "FDboostScalar"){ + nObs <- length(object$response) + Gy <- 1 + } + } + + myfamily <- get("family", environment(object$update)) + + if(is.null(response)) response <- object$response # response as vector! + # for Binomial() transform factor to -1/1 coding + response <- myfamily@check_y(response) + + id <- object$id + + # save integration weights of original model + # intWeights <- model.weights(object) + # weights are rescaled in mboost, see mboost:::rescale_weights + if(!is.null(object$callEval$numInt) && object$callEval$numInt == "Riemann"){ + if(!inherits(object, "FDboostLong")){ + intWeights <- as.vector(integrationWeights(X1 = matrix(object$response, + ncol = object$ydim[2]), object$yind)) + }else{ + intWeights <- integrationWeights(X1=object$response, object$yind, id) + } + }else{ + intWeights <- model.weights(object) + } + + # out-of-bag-weights: i.e. the left out curve/ the left out observations + OOBweights <- matrix(1, ncol = ncol(folds), nrow = nrow(folds)) + OOBweights[folds > 0] <- 0 + + # Function to suppress the warning of missings in the response + h <- function(w){ + if( any( grepl( "response contains missing values;", w, fixed = TRUE) ) ) + invokeRestart( "muffleWarning" ) + } + + ### get yind in long format + yindLong <- object$yind + if(!inherits(object, "FDboostLong")){ + yindLong <- rep(object$yind, each = nObs) + } + ### compute ("length of each trajectory")^-1 in the response + ### more precisely ("sum of integration weights")^-1 is used + if(length(object$yind) > 1){ + # lengthTi1 <- 1/tapply(yindLong[!is.na(response)], id[!is.na(response)], function(x) max(x) - min(x)) + lengthTi1 <- 1/tapply(intWeights, id, function(x) sum(x)) + if(any(is.infinite(lengthTi1))) lengthTi1[is.infinite(lengthTi1)] <- max(lengthTi1[!is.infinite(lengthTi1)]) + }else{ + lengthTi1 <- rep(1, l = length(response)) + } + + ###### Function to fit the model + # function working with FDboost, thus the smooth offset is recalculated in each model + dummyfct <- function(weights, oobweights) { + + # create data frame for model fit and use the weights vector for the CV + dathelp <- object$data + nameyind <- attr(object$yind, "nameyind") + dathelp[[nameyind]] <- object$yind + + if(!inherits(object, "FDboostLong") && !inherits(object, "FDboostScalar")){ + dathelp[[object$yname]] <- matrix(object$response, ncol = Gy) + }else{ + dathelp[[object$yname]] <- object$response + } + + call <- object$callEval + call$data <- dathelp + + # use weights of training data expanded by id to suitable length + call$weights <- weights[id] + + # use call$numInt of original model fit, as weights contains only resampling weights + + # Using the offset of object with the following settings + # call$control <- boost_control(risk="oobag") + # call$oobweights <- oobweights[id] + if(!refitSmoothOffset && is.null(call$offset) ){ + if(!inherits(object, "FDboostLong")){ + call$offset <- matrix(object$offset, ncol = Gy)[1, ] + }else{ + call$offset <- object$offset + } + } + # the model is the same for + # mod <- object$update(weights = weights, oobweights = oobweights) # (cvrisk) + # and + # mod <- withCallingHandlers(suppressMessages(eval(call)), warning = h) + # and then the risk can be computed by + # risk <- mod$risk()[grid] + + ## compute the model by FDboost() - the offset is computed on learning sample + mod <- withCallingHandlers(suppressMessages(eval(call)), warning = h) # suppress the warning of missing responses + mod <- mod[max(grid)] + + # compute weights for standardizing risk, mse, ... + oobwstand <- lengthTi1[id]*oobweights[id]*intWeights*(1/sum(oobweights)) + + ############# compute risk, mse, relMSE and mrd + # get risk function of the family + riskfct <- get("family", environment(mod$update))@risk + + #################### + ### compute risk and mse without integration weights, like in cvrisk + risk0 <- sapply(grid, function(g){riskfct(response, mod[g]$fitted(), + w = oobweights[id])}) / sum(oobweights[id]) + + mse0 <- simplify2array(mclapply(grid, function(g){ + sum( ((response - mod[g]$fitted())^2*oobweights[id]), na.rm = TRUE ) + }, mc.cores=1) ) /sum(oobweights[id]) + #################### + + # oobweights using riskfct() like in mboost, but with different weights! + risk <- sapply(grid, function(g){riskfct( response, mod[g]$fitted(), w=oobwstand)}) + + ### mse (mean squared error) equals risk in the case of familiy=Gaussian() + mse <- simplify2array(mclapply(grid, function(g){ + sum( ((response - mod[g]$fitted())^2*oobwstand), na.rm = TRUE ) + }, mc.cores=1) ) + + # ### mse2 equals mse in the case of equal grids without missings at the ends + # mse2 <- simplify2array(mclapply(grid, function(g){ + # sum( ((response - mod[g]$fitted())^2*oobweights[id]*intWeights), na.rm=TRUE ) + # }, mc.cores=1) ) / (sum(oobweights)* (max(mod$yind)-min(mod$yind) ) ) + + ### compute overall mean of response in learning sample + meanResp <- sum(response*intWeights*lengthTi1[id]*weights[id], na.rm = TRUE) / sum(weights) + + # # compute overall mean of response in whole sample + # meanResp <- sum(response*intWeights*lengthTi1[id], na.rm=TRUE) / nObs + + ### compute relative mse + relMSE <- simplify2array(mclapply(grid, function(g){ + sum( ((response - mod[g]$fitted())^2*oobwstand), na.rm = TRUE ) / + sum( ((response - meanResp)^2*oobwstand), na.rm = TRUE ) + }, mc.cores=1) ) + + ### mean relative deviation + resp0 <- response + resp0[abs(resp0) <= mrdDelete | round(resp0, 1) == 0] <- NA + mrd <- simplify2array(mclapply(grid, function(g){ + sum( abs(resp0 - mod[g]$fitted())/abs(resp0)*oobwstand, na.rm = TRUE ) + }, mc.cores=1) ) + + mrd0 <- simplify2array(mclapply(grid, function(g){ + sum( abs(resp0 - mod[g]$fitted())/abs(resp0)*oobweights[id], na.rm = TRUE) + }, mc.cores=1) ) / sum(oobweights[id]) + + + rm(resp0, meanResp) + + ####### prediction for all observations, not only oob! + # the predictions are in a long vector for all model types (regular, irregular, scalar) + predGrid <- predict(mod, aggregate = "cumsum", toFDboost = FALSE) + predGrid <- predGrid[ , grid] # save vectors of predictions for grid in matrix + + if(showProgress) cat(".") + + ## user-specified function to use on FDboost-object + if(! is.null(fun) ){ + fun_ret <- fun(mod) + }else{ + fun_ret <- NULL + } + + return(list(risk = risk, predGrid = predGrid, # predOOB = predOOB, respOOB = respOOB, + mse = mse, relMSE = relMSE, mrd = mrd, risk0 = risk0, mse0 = mse0, mrd0 = mrd0, + mod = mod, fun_ret = fun_ret)) + } + + ### computation of models on partitions of data + if(Sys.info()["sysname"]=="Linux"){ + modRisk <- mclapply(seq_len(ncol(folds)), + function(i) dummyfct(weights = folds[, i], + oobweights = OOBweights[, i]), ...) + }else{ + modRisk <- mclapply(seq_len(ncol(folds)), + function(i) dummyfct(weights = folds[, i], + oobweights = OOBweights[, i]), mc.cores = 1) + } + + # str(modRisk, max.level=2) + # str(modRisk, max.level=5) + + # check whether model fit worked in all iterations + modFitted <- sapply(modRisk, is.list) + if(any(!modFitted)){ + + # stop() or warning()? + if(sum(!modFitted) > sum(modFitted)) warning("More than half of the models could not be fitted.") + + warning("Model fit did not work in fold ", toString(which(!modFitted))) + modRisk <- modRisk[modFitted] + OOBweights <- OOBweights[,modFitted] + folds <- folds[,modFitted] + } + + ####### restructure the results + + ## get the out-of-bag risk + oobrisk <- t(sapply(modRisk, function(x) x$risk)) + ## get out-of-bag mse + oobmse <- t(sapply(modRisk, function(x) x$mse)) + ## get out-of-bag relMSE + oobrelMSE <- t(sapply(modRisk, function(x) x$relMSE)) + ## get out-of-bag mrd + oobmrd <- t(sapply(modRisk, function(x) x$mrd)) + + colnames(oobrisk) <- colnames(oobmse) <- colnames(oobrelMSE) <- colnames(oobmrd) <- grid + rownames(oobrisk) <- rownames(oobmse) <- rownames(oobrelMSE) <- rownames(oobmrd) <- which(modFitted) + + ## get out-of-bag risk without integration weights + oobrisk0 <- t(sapply(modRisk, function(x) x$risk0)) + ## get out-of-bag mse without integration weights + oobmse0 <- t(sapply(modRisk, function(x) x$mse0)) + ## get out-of-bag mrd without integration weights + oobmrd0 <- t(sapply(modRisk, function(x) x$mrd0)) + + colnames(oobrisk0) <- colnames(oobmse0) <- colnames(oobmrd0) <- grid + rownames(oobrisk0) <- rownames(oobmse0) <- rownames(oobmrd0) <- which(modFitted) + + ############# check for folds with extreme risk-values at the global median + riskOptimal <- oobrisk[ , which.min(apply(oobrisk, 2, median))] + bound <- median(riskOptimal) + 1.5*(quantile(riskOptimal, 0.75) - quantile(riskOptimal, 0.25)) + + # fold equals curve if type="curves" + if(any(riskOptimal>bound)){ + message("Fold with high values in oobrisk (median is ", round(median(riskOptimal), 2), "):") + message(paste("In fold ", which(riskOptimal > bound), ": " , + round(riskOptimal[which(riskOptimal > bound)], 2), collapse = ", ", sep = "" ) ) + } + + ## only makes sense for type="curves" with leaving-out one curve per fold!! + if(grepl( "curves", type, fixed = TRUE)){ + # predict response for all mstops in grid out of bag + # predictions for each response are in a vector! + oobpreds0 <- lapply(modRisk, function(x) x$predGrid) + oobpreds <- matrix(nrow = nrow(oobpreds0[[1]]), ncol = ncol(oobpreds0[[1]])) + + if(inherits(object, "FDboostLong")){ + for(i in seq_along(oobpreds0)){ # i runs over observed trajectories, i.e. over id + oobpreds[id == i, ] <- oobpreds0[[i]][id == i, ] + } + }else{ + for(j in seq_along(oobpreds0)){ + oobpreds[folds[ , j] == 0] <- oobpreds0[[j]][folds[ , j] == 0] + } + } + colnames(oobpreds) <- grid + rm(oobpreds0) + + }else{ + oobpreds <- NULL + } + + # # alternative OOB-prediction: works for general folds not only oob + # predOOB <- lapply(modRisk, function(x) x$predOOB) + # predOOB <- do.call('rbind', predOOB) + # colnames(predOOB) <- grid + # respOOB <- lapply(modRisk, function(x) x$respOOB) + # respOOB <- do.call('c', respOOB) + # indexOOB <- lapply(modRisk, function(x) attr(x$respOOB, "curves")) + # if(is.null(object$id)){ + # indexOOB <- lapply(indexOOB, function(x) rep(x, times=Gy) ) + # indexOOB <- unlist(indexOOB) + # }else{ + # indexOOB <- names(unlist(indexOOB))[unlist(indexOOB)] + # } + # attr(respOOB, "index") <- indexOOB + + coefCV <- list() + predCV <- list() + + if(getCoefCV){ + + if(riskopt == "median"){ + optimalMstop <- grid[which.min(apply(oobrisk, 2, median))] + }else{ + optimalMstop <- grid[which.min(apply(oobrisk, 2, mean))] + } + + attr(coefCV, "risk") <- paste("minimize", riskopt, "risk") + + ### estimates of coefficients + timeHelp <- seq(min(modRisk[[1]]$mod$yind), max(modRisk[[1]]$mod$yind), l = 40) + for(l in seq_along(modRisk[[1]]$mod$baselearner)){ + # estimate the coefficients for the model of the first fold + my_coef <- coef(modRisk[[1]]$mod[optimalMstop], + which = l, n1 = 40, n2 = 20, n3 = 15, n4 = 10)$smterms[[1]] + if(is.null(my_coef)){ + my_coef <- list(0) + my_coef$dim <- 0 + } + coefCV[[l]] <- my_coef + + ## no %X% with several levels in the coefficients + if(is.null(coefCV[[l]]$numberLevels)){ + attr(coefCV[[l]]$value, "offset") <- NULL # as offset is the same within one model + + # add estimates for the models of the other folds + coefCV[[l]]$value <- lapply(seq_along(modRisk), function(g){ + ret <- coef(modRisk[[g]]$mod[optimalMstop], + which = l, n1 = 40, n2 = 20, n3 = 15, n4 = 10)$smterms[[1]]$value + # if(l==1){ + # coefCV[[l]]$offset[g,] <- modRisk[[g]]$mod$predictOffset(time=timeHelp) + # } + attr(ret, "offset") <- NULL # as offset is the same within one model + return(ret) + }) + }else{ + ## %X% with numberLevels coefficient values in a list + ## lapply(1:coefCV[[l]]$numberLevels, function(x) coefCV[[l]][[x]]$value) + for(j in 1:coefCV[[l]]$numberLevels){ + coefCV[[l]][[j]]$value <- lapply(seq_along(modRisk), function(g){ + ret <- coef(modRisk[[g]]$mod[optimalMstop], + which = l, n1 = 40, n2 = 20, n3 = 15, n4 = 10)$smterms[[1]][[j]]$value + attr(ret, "offset") <- NULL # as offset is the same within one model + return(ret) + }) + } + } # end else for numberLevels + + } + + ## predict offset + offset <- sapply(seq_along(modRisk), function(g){ + # offset is vector of length yind or numeric of length 1 for constant offset + ret <- modRisk[[g]]$mod$predictOffset(time = timeHelp) + if( length(ret) == 1 & length(object$yind) > 1 ) ret <- rep(ret, length(timeHelp)) + return(ret) + }) + + attr(coefCV, "offset") <- offset + + niceNames <- c("offset", lapply(coefCV, function(x) x$main)) + + ### predictions of terms based on the coefficients for each model + # only makes sense for type="curves" with leaving-out one curve per fold!! + if(grepl("curves", type, fixed = TRUE)){ + for(l in 1:(length(modRisk[[1]]$mod$baselearner)+1)){ + predCV[[l]] <- t(sapply(seq_along(modRisk), function(g){ + if(l == 1){ # save offset of model + # offset is vector of length yind or numeric of length 1 for constant offset + ret <- modRisk[[g]]$mod[optimalMstop]$predictOffset(object$yind) + # regular data or scalar response + if(!inherits(object, "FDboostLong")){ + if( length(ret) == 1 ) ret <- rep(ret, modRisk[[1]]$mod$ydim[2]) + # irregular data + }else{ + if( length(ret) == 1 ){ ret <- rep(ret, sum(object$id == g)) }else{ ret <- ret[object$id == g] } + } + }else{ # other effects + ret <- predict(modRisk[[g]]$mod[optimalMstop], which = l-1) # model g + if(!(l-1) %in% selected(modRisk[[g]]$mod[optimalMstop]) ){ # effect was never chosen + if(!inherits(object, "FDboostLong")){ + ret <- matrix(0, ncol=modRisk[[1]]$mod$ydim[2], nrow=modRisk[[1]]$mod$ydim[1]) + }else{ + ret <- matrix(0, nrow = length(object$id), ncol=1) + } + } + if(!inherits(object, "FDboostLong")){ + ret <- ret[g,] # save g-th row = preds for g-th observations + }else{ + ret <- ret[object$id == g] # save preds of g-th observations + } + } + return(ret) + })) + names(predCV)[l] <- niceNames[l] + # matplot(modRisk[[1]]$mod$yind, t(predCV[[l]]), type="l", + # main=names(predCV)[l], xlab=attr(modRisk[[1]]$mod$yind, "nameyind"), ylab="coef") + } + } + + } # end of if(getCoefCV) + + ret <- list(response = response, yind = object$yind, id = object$id, + folds = folds, grid=grid, + coefCV = coefCV, + predCV = predCV, + oobpreds = oobpreds, + oobrisk = oobrisk, + oobriskMean = colMeans(oobrisk), + oobmse = oobmse, + oobrelMSE = oobrelMSE, + oobmrd = oobmrd, + oobrisk0 = oobrisk0, + oobmse0 = oobmse0, + oobmrd0 = oobmrd0, + format = if(inherits(object, "FDboostLong")) "FDboostLong" else "FDboost", + fun_ret = if(is.null(fun)) NULL else lapply(modRisk, function(x) x$fun_ret) ) + + rm(modRisk) + + attr(ret, "risk") <- object$family@name + attr(ret, "call") <- deparse(object$call) + + class(ret) <- "validateFDboost" + + return(ret) +} + + + +#' @rdname plot.validateFDboost +#' @method mstop validateFDboost +#' @export +#' +# Function to extract the optimal stopping iteration +mstop.validateFDboost <- function(object, riskopt=c("mean", "median"), ...){ + + dots <- list(...) + riskopt <- match.arg(riskopt) + + if(riskopt=="median"){ + riskMedian <- apply(object$oobrisk, 2, median) + mstop <- object$grid[which.min(riskMedian)] + attr(mstop, "risk") <- "minimize median risk" + }else{ + riskMean <- colMeans(object$oobrisk) + mstop <- object$grid[which.min(riskMean)] + attr(mstop, "risk") <- "minimize mean risk" + } + return(mstop) +} + + +#' @rdname plot.validateFDboost +#' @method print validateFDboost +#' @export +#' +# Function to print an object of class validateFDboost +print.validateFDboost <- function(x, ...){ + + cat("\n\t Cross-validated", attr(x, "risk"), "\n\t", attr(x, "call"), "\n\n") + print(colMeans(x$oobrisk)) + cat("\n\t Optimal number of boosting iterations:", mstop(x), + "\n") + return(invisible(x)) +} + + +#' Methods for objects of class validateFDboost +#' +#' Methods for objects that are fitted to determine the optimal mstop and the +#' prediction error of a model fitted by FDboost. +#' +#' @param object object of class \code{validateFDboost} +#' @param riskopt how the risk is minimized to obtain the optimal stopping iteration; +#' defaults to the mean, can be changed to the median. +#' +#' @param x an object of class \code{validateFDboost}. +#' @param modObject if the original model object of class \code{FDboost} is given +#' predicted values of the whole model can be compared to the predictions of the cross-validated models +#' @param predictNA should missing values in the response be predicted? Defaults to \code{FALSE}. +#' @param which In the case of \code{plotPredCoef()} the subset of base-learners to take into account for plotting. +#' In the case of \code{plot.validateFDboost()} the diagnostic plots that are given +#' (1: empirical risk per fold as a funciton of the boosting iterations, +#' 2: empirical risk per fold, 3: MRD per fold, +#' 4: observed and predicted values, 5: residuals; +#' 2-5 for the model with the optimal number of boosting iterations). +#' @param names.arg names of the observed curves +#' @param ask defaults to \code{TRUE}, ask for next plot using \code{par(ask = ask)} ? +#' @param pers plot coefficient surfaces as persp-plots? Defaults to \code{TRUE}. +#' @param commonRange, plot predicted coefficients on a common range, defaults to \code{TRUE}. +#' @param showQuantiles plot the 0.05 and the 0.95 Quantile of coefficients in 1-dim effects. +#' @param showNumbers show number of curve in plot of predicted coefficients, defaults to \code{FALSE} +#' @param terms logical, defaults to \code{TRUE}; plot the added terms (default) or the coefficients? +#' @param probs vector of quantiles to be used in the plotting of 2-dimensional coefficients surfaces, +#' defaults to \code{probs = c(0.25, 0.5, 0.75)} +#' @param ylab label for y-axis +#' @param xlab label for x-axis +#' @param ylim values for limits of y-axis +#' @param ... additional arguments passed to callies. +#' +#' @details The function \code{mstop.validateFDboost} extracts the optimal mstop by minimizing the +#' mean (or the median) risk. +#' \code{plot.validateFDboost} plots cross-validated risk, RMSE, MRD, measured and predicted values +#' and residuals as determined by \code{validateFDboost}. The function \code{plotPredCoef} plots the +#' coefficients that were estimated in the folds - only possible if the argument getCoefCV is \code{TRUE} in +#' the call to \code{validateFDboost}. +#' +#' @return No return value (plot method) or the object itself (print method) +#' +#' @aliases mstop.validateFDboost +#' +#' @method plot validateFDboost +#' +#' @export +plot.validateFDboost <- function(x, riskopt=c("mean", "median"), + ylab = attr(x, "risk"), xlab = "Number of boosting iterations", + ylim = range(x$oobrisk), + which = 1, + modObject = NULL, predictNA = FALSE, + names.arg = NULL, ask=TRUE, ...){ + + # get the optimal mstop + riskopt <- match.arg(riskopt) + mopt <- mstop(x, riskopt=riskopt) + # get the position in the grid of mopt + mpos <- which(x$grid == mopt) + + oldpar <- par(no.readonly = TRUE) + on.exit(par(oldpar)) + + if(length(which) > 1) par(ask = ask) + + if(1 %in% which){ + # Plot the cross validated risk + ##ylim <- c(min(x$oobrisk), quantile(x$oobrisk, 0.97)) + ## ylim <- c(min(x$oobrisk), max(x$oobrisk)) + matplot(colnames(x$oobrisk), t(x$oobrisk), type="l", col="lightgrey", lty=1, + ylim=ylim, + xlab=xlab, ylab=ylab, + main=attr(x$folds, "type"), + sub=attr(mopt, "risk")) + + if(riskopt == "mean"){ + riskMean <- colMeans(x$oobrisk) + lines(colnames(x$oobrisk), riskMean, lty=1) + mOptMean <- x$grid[which.min(riskMean)] + lines(c(mOptMean, mOptMean), + c(min(c(0, ylim[1] * ifelse(ylim[1] < 0, 2, 0.5))), + riskMean[paste(mOptMean)]), lty = 2) + legend("topright", legend=paste(c(mOptMean)), + lty=2, col="black") + + } + + if(riskopt == "median"){ + riskMedian <- apply(x$oobrisk, 2, median) + lines(colnames(x$oobrisk), riskMedian, lty=1) + mOptMedian <- x$grid[which.min(riskMedian)] + lines(c(mOptMedian, mOptMedian), + c(min(c(0, ylim[1] * ifelse(ylim[1] < 0, 2, 0.5))), + riskMedian[paste(mOptMedian)]), lty = 2) + + legend("topright", legend=paste(c(mOptMedian)), + lty=2, col="black") + } + + } + + if(any(c(2,3) %in% which)){ + # Plot RMSE and MRD for optimal mstop + if(is.null(names.arg)){ + names.arg <- seq(along=x$oobrisk[,mpos]) + } + stopifnot(length(names.arg)==length(x$oobrisk[,mpos])) + } + + # plot risk + if(2 %in% which){ + barplot(x$oobrisk[,mpos], main="risk", names.arg = names.arg, las=2) # + #abline(h=x$rmse[mpos], lty=2) + } + + # plot MRD + if(3 %in% which){ + barplot(x$oobmrd[,mpos], main="MRD", names.arg = names.arg, las=2) + #abline(h=x$mrd[mpos], lty=2) + } + + # Plot the predictions for the optimal mstop + if(4 %in% which || 5 %in% which){ + + if(!is.null(x$oobpreds)){ + response <- x$response + pred <- x$oobpreds[,mpos] + + if(!predictNA){ + pred[is.na(response)] <- NA + } + + predMat <- pred + responseMat <- response + + if(x$format == "FDboost") predMat <- matrix(pred, ncol=length(x$yind)) + if(x$format == "FDboost") responseMat <- matrix(response, ncol=length(x$yind)) + + if(4 %in% which){ + ylim <- range(response, pred, na.rm = TRUE) + funplot(x$yind, responseMat, id=x$id, lwd = 1, pch = 1, ylim = ylim, + ylab = "", xlab = attr(x$yind, "nameyind"), + main="Observed and Predicted Values", ...) + funplot(x$yind, predMat, id=x$id, lwd = 2, pch = 2, add = TRUE, ...) + posLegend <- "topleft" + legend(posLegend, legend=c("observed","predicted"), col=1, pch=1:2) + } + + if(5 %in% which){ + # Plot residuals for the optimal mstop + funplot(x$yind, responseMat-predMat, id=x$id, ylab = "", xlab = attr(x$yind, "nameyind"), + main="Residuals", ...) + abline(h=0, lty=2, col="grey") + } + } + } + + # Plot coefficients + + # # example: plot coeficients of 5th effect for folds 1-4 each for the optimal mstop + # plot(modObject, which=5, n1 = 50, n2 = 20, n3 = 15, n4 = 10, levels=seq(-.4, 1.4, by=0.4)) + # contour(x$coefCV[[1]][[5]]$x, + # x$coefCV[[1]][[5]]$y, + # t(x$coefCV[[1]][[5]]$value[[mpos]]), lty=2, add=TRUE, col=2, levels=seq(-.4, 1.4, by=0.4)) + # contour(x$coefCV[[2]][[5]]$x, + # x$coefCV[[2]][[5]]$y, + # t(x$coefCV[[2]][[5]]$value[[mpos]]), lty=2, add=TRUE, col=2, levels=seq(-.4, 1.4, by=0.4)) + # + # image(x$coefCV[[1]][[5]]$value[[mpos]], type="l", lty=1) + + # matplot(x$coefCV[[1]][[5]]$value[[mpos]], type="l", lty=1) + # matplot(x$coefCV[[2]][[5]]$value[[mpos]], type="l", lty=2, add=TRUE) + # matplot(x$coefCV[[3]][[5]]$value[[mpos]], type="l", lty=3, add=TRUE) + # matplot(x$coefCV[[4]][[5]]$value[[mpos]], type="l", lty=4, add=TRUE) + + par(ask = FALSE) +} + + +#' @rdname plot.validateFDboost +#' @export +#' +plotPredCoef <- function(x, which = NULL, pers = TRUE, + commonRange = TRUE, showNumbers = FALSE, showQuantiles = TRUE, + ask = TRUE, + terms = TRUE, + probs = c(0.25, 0.5, 0.75), # quantiles of variables to use for plotting + ylim = NULL, ...){ + + stopifnot(inherits(x, "validateFDboost")) + + if(is.null(which)) which <- seq_along(x$coefCV) + + oldpar <- par(no.readonly = TRUE) + on.exit(par(oldpar)) + + if(length(which) > 1) par(ask = ask) + + if(terms){ + + if(all(which == seq_along(x$coefCV))){ + which <- 1:(length(x$coefCV)+1) + }else{ + which <- which + 1 + } + + if(length(x$predCV) == 0){ + warning("no bootstrapped predcition, set terms = FALSE, to plot bootstrapped coefficients.") + return(NULL) + } + + if(commonRange && is.null(ylim)){ + ylim <- range(x$predCV[which]) + } + + ### loop over base-learners + for(l in which){ + + if( x$format == "FDboostLong" ){ + + funplot(x$yind, unlist(x$predCV[[l]]), id=x$id, col="white", + main=names(x$predCV)[l], xlab=attr(x$yind, "nameyind"), ylab="coef", ylim=ylim, ...) + for(i in seq_along(x$predCV[[l]])){ + lines(x$yind[x$id==i], x$predCV[[l]][[i]], lwd=1, col=i) + if(showNumbers){ + points(x$yind[x$id==i], x$predCV[[l]][[i]], type="p", pch=paste0(i)) + } + } + + }else{ + funplot(x$yind, unlist(x$predCV[[l]]), + id=x$id, type="l", + main=names(x$predCV)[l], xlab=attr(x$yind, "nameyind"), ylab="coef", ylim=ylim, ...) + + if(showNumbers){ + funplot(x$yind, unlist(x$predCV[[l]]), id=x$id, pch=paste0(x$id), add=TRUE, type="p") + } + } + } # end for-loop + + }else{ # plot coefficients + + if(commonRange && is.null(ylim)){ + if(length(x$yind)>1){ + if(!any(sapply(lapply(x$coefCV[which], function(x) x$value), is.null))){ + ylim <- range(lapply(x$coefCV[which], function(x) x$value)) + }else{ + ## in case of composed base-learners with %X% the ylim is determinded using the first value + ylim <- range(lapply(x$coefCV[which], function(x) x[[1]]$value)) + } + }else{ + ylim <- range(lapply(x$coefCV[which], function(x) x$value)) + } + if(any(is.infinite(ylim))) ylim <- NULL + } + + for(l in which){ # loop over effects + + # coef() of a certain term + temp <- x$coefCV[l][[1]] + + plot_bootstrapped_coef(temp = temp, l = l, + offset = attr(x$coefCV, "offset"), yind = x$yind, + pers = pers, + showNumbers = showNumbers, showQuantiles = showQuantiles, + probs = probs, ylim = ylim, ...) + + + } # end loop over effects + } + par(ask=FALSE) +} + + +## helper function to plot bootstrapped coefficients with basis plots +plot_bootstrapped_coef <- function(temp, l, + offset, yind, + pers, showNumbers, showQuantiles, probs, ylim, ...){ + + ### Get further arguments passed to the different plot-functions + dots <- list(...) + + if(!is.null(ylim) && all(ylim == 0)){ + ylim <- c(-0.1, 0.1) + } + + getArguments <- function(x, dots=dots){ + if(any(names(dots) %in% names(x))){ + dots[names(dots) %in% names(x)] + }else list() + } + + argsPlot <- getArguments(x = c(formals(graphics::plot.default), par()), dots = dots) + argsMatplot <- getArguments(x = c(formals(graphics::matplot), par()), dots = dots) + argsFunplot <- getArguments(x = c(formals(funplot), par()), dots = dots) + + argsImage <- getArguments(x=c(formals(graphics::plot.default), + formals(graphics::image.default)), dots=dots) + dotsContour <- dots + dotsContour$col <- "black" + argsContour <- getArguments(x=formals(graphics::contour.default), dots=dotsContour) + + argsPersp <- getArguments(x=formals(getS3method("persp", "default")), dots = dots) + + plotWithArgs <- function(plotFun, args, myargs){ + args <- c(myargs[!names(myargs) %in% names(args)], args) + do.call(plotFun, args) + } + + + ## helper funciton to plot curves + plot_curves <- function(x_i, y_i, xlab_i, main_i, ylim_i, ...){ + + plotWithArgs(matplot, args = argsMatplot, + myargs = list(x = x_i, y = y_i, type = "l", xlab = xlab_i, ylab = "coef", + main = main_i, ylim = ylim_i, lty = 1, + col = rgb(0.6,0.6,0.6, alpha = 0.5))) + + if(showNumbers){ + matplot(x_i, y_i, add = TRUE, col = rgb(0.6,0.6,0.6, alpha = 0.5), ...) + } + + if(showQuantiles){ + lines(x_i, rowMeans(y_i), col = 1, lwd = 2) + lines(x_i, apply(y_i, 1, quantile, 0.95, na.rm = TRUE), col = 2, lwd = 2, lty = 2) + lines(x_i, apply(y_i, 1, quantile, 0.05, na.rm = TRUE), col = 2, lwd = 2, lty = 2) + } + + } + + + if(!is.null(temp$numberLevels)){ + temp <- temp[[1]] + warning("Of the composed base-learner ", l, " only the first effect is plotted.") + } + + # set the range for each effect individually + if(FALSE) ylim <- range(temp$value) + + ## plot the estimated offset for functional response + if(l == 1 && length(yind) > 1){ + myMat <- offset ## attr(x$coefCV, "offset") + timeHelp <- seq(min(yind), max(yind), length = nrow(myMat)) + + plot_curves(x_i = timeHelp, y_i = myMat, xlab_i = temp$xlab, + main_i = temp$main, ylim_i = NULL) + } + + + if(temp$dim == 0){ + + # intercept and offset of model with scalar response + temp$value[sapply(temp$value, function(x) is.null(x))] <- 0 + y_i <- unlist(temp$value) + + offset[sapply(offset, function(x) is.null(x))] <- 0 + offset_i <- offset + + x_i <-rep(0, length(y_i)) + + plotWithArgs(plot, args = argsPlot, + myargs = list(x = x_i, y = y_i + offset_i, xlab = "", ylab = "coef", + xaxt = "n", main = "offset + intercept", + col = rgb(0.6,0.6,0.6, alpha = 0.5))) + + if(showNumbers){ + matplot(x_i, y_i + offset_i, col = rgb(0.6,0.6,0.6, alpha = 0.5), add = TRUE) + } + + if(showQuantiles){ + points(0, mean(y_i + offset_i), col = 1, lwd = 2) + points(0, quantile(y_i + offset_i, 0.95, na.rm = TRUE), col = 2, lwd = 2, lty = 2) + points(0, quantile(y_i + offset_i, 0.05, na.rm = TRUE), col = 2, lwd = 2, lty = 2) + } + + } + + if(temp$dim == 1){ + # impute vector of 0 if effect was never chosen + temp$value[sapply(temp$value, function(x) length(x)==1)] <- list(rep(0, 40)) + myMat <- sapply(temp$value, function(x) x) # as one matrix + + plot_curves(x_i = temp$x, y_i = myMat, xlab_i = temp$xlab, + main_i = temp$main, ylim_i = ylim) + + } + + if(temp$dim == 2){ + + if(!is.factor(temp$x)){ + quantx <- quantile(temp$x, probs=probs, type=1) + } else quantx <- temp$x + + quanty <- quantile(temp$y, probs=probs, type=1) + + # set lower triangular matrix to NA for historic effect + if(grepl("bhist", temp$main, fixed = TRUE)){ + for(k in seq_along(temp$value)){ + temp$value[[k]][temp$value[[k]]==0] <- NA + } + } + + if(!is.factor(temp$x)){ # temp$x is metric + + # impute matrix of 0 if effect was never chosen + temp$value[sapply( temp$value, function(x){ is.null(dim(x)) || dim(x)[2]==1 })] <- list(matrix(0, ncol=20, nrow=20)) + + # plot coefficient surfaces at different pointwise quantiles + if(pers){ + matvec <- sapply(temp$value, c) + for(k in seq_along(probs)){ + + tempZ <- matrix(apply(matvec, 1, quantile, probs=probs[k], na.rm=TRUE), ncol=length(temp$x)) + + plotWithArgs(persp, args=argsPersp, + myargs=list(x=temp$x, y=temp$y, z=tempZ, + ticktype="detailed", theta=30, phi=30, + xlab=paste("\n", temp$xlab), ylab=paste("\n", temp$ylab), + zlab=paste("\n", "coef"), + zlim=if(any(is.null(ylim))) range(matvec, na.rm=TRUE) else ylim, + main=paste0(temp$main, " at ", probs[k]*100, "%-quantile"), + col=getColPersp(tempZ))) + + } + + }else{ # do 2-dim plots + + # for(j in seq_along(quanty)){ + # + # myCol <- sapply(temp$value, function(x) x[, quanty[j]==temp$y]) # first column + # + # plot_curves(x_i = temp$y, y_i = myCol, xlab_i = temp$ylab, + # main_i = paste(temp$main, " at ", probs[j]*100, "% of ", temp$xlab, sep = ""), + # ylim_i = ylim) + # + # } # end loop over quanty + # + # for(j in seq_along(quantx)){ + # myRow <- sapply(temp$value, function(x) x[quantx[j]==temp$x, ]) # first column + # + # plot_curves(x_i = temp$x, y_i = myRow, xlab_i = temp$xlab, + # main_i = paste(temp$main, " at ", probs[j]*100, "% of ", temp$ylab, sep = ""), + # ylim_i = ylim) + # + # } + + matvec <- sapply(temp$value, c) + for(k in seq_along(probs)){ + + tempZ <- matrix(apply(matvec, 1, quantile, probs=probs[k], na.rm=TRUE), ncol=length(temp$x)) + + plotWithArgs(image, args=argsImage, + myargs=list(x=temp$y, y=temp$x, z=t(tempZ), xlab=paste("\n", temp$xlab), + ylab=paste("\n", temp$ylab), zlim=c(min(matvec, na.rm=TRUE), + max(matvec, na.rm=TRUE)), + main=paste0(temp$main, " at ", probs[k]*100, "%-quantile"), + col = heat.colors(length(temp$x)^2) + ) + ) + plotWithArgs(contour, args=argsContour, + myargs=list(temp$y, temp$x, z=t(tempZ), col = "black", add = TRUE)) + + } + + } # end else + + }else{ # temp$x is factor + + for(j in seq_along(quantx)){ + + # impute matrix of 0 if effect was never chosen + temp$value[sapply(temp$value, function(x) is.null(dim(x)))] <- list(matrix(0, ncol=20, nrow=length(quantx))) + + if(is.null(temp$z)){ + # myRow <- sapply(temp$value, function(x) x[quantx[j]==temp$x, ]) # first column + myRow <- t(temp$value[[which(quantx[j]==temp$x)]]) + + plot_curves(x_i = temp$y, y_i = myRow, xlab_i = temp$ylab, + main_i = paste0(temp$main, " at ", temp$xlab,"=" ,quantx[j]), + ylim_i = ylim) + + }else{ + quantz <- temp$z + myRow <- sapply(temp$value, function(x) x[quantx[j]==temp$x & quantz[j]==temp$z, ]) # first column + + plot_curves(x_i = temp$y, y_i = myRow, xlab_i = temp$ylab, + main_i = paste0(temp$main, " at ", temp$xlab, "=" , quantx[j], ", " , + temp$zlab, "=", quantz[j]), + ylim_i = ylim) + } + } + } + + } # end if(temp$dim == 2) + +} + + + +#' @rdname applyFolds +#' @export +## wrapper for cvrisk of mboost, specifying folds on the level of curves +cvrisk.FDboost <- function(object, folds = cvLong(id=object$id, weights=model.weights(object)), + grid = 1:mstop(object), + papply = mclapply, + fun = NULL, mc.preschedule = FALSE, ...){ + + if(!length(unique(object$offset)) == 1) message("The smooth offset is fixed over all folds.") + + names_bl <- names(object$baselearner) + if(any(grepl("brandomc", names_bl, fixed = TRUE))) message("For brandomc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bolsc", names_bl, fixed = TRUE))) message("For bolsc, the transformation matrix Z is fixed over all folds.") + if(any(grepl("bbsc", names_bl, fixed = TRUE))) message("For bbsc, the transformation matrix Z is fixed over all folds.") + + class(object) <- "mboost" + + ret <- cvrisk(object = object, folds = folds, + grid = grid, + papply = papply, + fun = fun, mc.preschedule = mc.preschedule, ...) + return(ret) +} + +#' @rdname applyFolds +#' @export +# wrapper for function cv() of mboost, additional type "curves" +# create folds for data in long format +cvLong <- function(id, weights = rep(1, l=length(id)), + type = c("bootstrap", "kfold", "subsampling", "curves"), + B = ifelse(type == "kfold", 10, 25), prob = 0.5, strata = NULL){ + + stopifnot(length(id) == length(weights)) + + type <- match.arg(type) + n <- length(weights) + + if(type == "curves"){ + if(!is.null(strata)) warning("Argument strata is ignored for type = 'curves'.") + # set up folds so that always one curve is left out for the estimation + folds <- - diag(length(unique(id))) + 1 + foldsLong <- folds[id, ] * weights + B <- length(unique(id)) + }else{ + # expand folds over the functional measures of the response + folds <- cv(weights=rep(1, length(unique(id))), type = type, + B = B, prob = prob, strata = strata) + foldsLong <- folds[id, , drop = FALSE] * weights + } + attr(foldsLong, "type") <- paste0(B, "-fold ", type) + return(foldsLong) + +} + +#' @rdname applyFolds +#' @export +# wrapper for function cv() of mboost, additional type "curves" +# add option id to sample on the level of id if there are repeated measures +cvMa <- function(ydim, weights = rep(1, l = ydim[1] * ydim[2]), + type = c("bootstrap", "kfold", "subsampling", "curves"), + B = ifelse(type == "kfold", 10, 25), prob = 0.5, strata = NULL, ...){ + + dots <- list(...) + + if(any(names(dots) == "id")) message("argument id in cvMa is deprecated and ignored.") + + ncolY <- ydim[2] + nrowY <- ydim[1] + + type <- match.arg(type) + n <- length(weights) + + if ( (nrowY * ncolY) != n) stop("The arguments weights and ydim do not match.") + + ## cvMa is only a wrapper for cvLong + foldsMa <- cvLong(id = rep(seq_len(nrowY), times = ncolY), weights = weights, + type = type, B=B, prob = 0.5, strata = NULL) + return(foldsMa) +} + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/factorize.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/factorize.R new file mode 100644 index 0000000..0db82cd --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/factorize.R @@ -0,0 +1,359 @@ + +#' Factorize tensor product model +#' +#' Factorize an FDboost tensor product model into the response and covariate parts +#' \deqn{h_j(x, t) = \sum_{k} v_j^{(k)}(t) h_j^{(k)}(x), j = 1, ..., J,} +#' for effect visualization as proposed in Stoecker, Steyer and Greven (2022). +#' +#' @param x a model object of class FDboost. +#' @param ... other arguments passed to methods. +#' +#' @details The mboost infrastructure is used for handling the orthogonal response +#' directions \eqn{v_j^{(k)}(t)} in one \code{mboost}-object +#' (with \eqn{k} running over iteration indices) and the effects into the respective +#' directions \eqn{h_j^{(k)}(t)} in another \code{mboost}-object, +#' both of subclass \code{FDboost_fac}. +#' The number of boosting iterations of \code{FDboost_fac}-objects cannot be +#' further increased as in regular \code{mboost}-objects. +#' +#' @return a list of two mboost models of class \code{FDboost_fac} containing basis functions +#' for response and covariates, respectively, as base-learners. +#' @export +#' +#' @name factorize +#' @aliases factorise factorize.FDboost +#' @importFrom MASS ginv +#' @importFrom Matrix rankMatrix +#' @seealso [FDboost_fac-class] +#' +#' @references +#' Stoecker, A., Steyer L. and Greven, S. (2022): +#' Functional additive models on manifolds of planar shapes and forms +#' +#' +#' +#' @example tests/factorize_test_irregular.R +#' @example tests/factorize_test_regular.R +#' +factorize <- factorise <- function(x, ...) { + UseMethod("factorize") +} + +#' @param newdata new data the factorization is based on. +#' By default (\code{NULL}), the factorization is carried out on the data used for fitting. +#' @param newweights vector of the length of the data or length one, +#' containing new weights used for factorization. +#' @param blwise logical, should the factorization be carried out base-learner-wise (\code{TRUE}, default) +#' or for the whole model simultaneously. +#' +#' @method factorize FDboost +#' @return A factorized model +#' @export +#' @rdname factorize +factorize.FDboost <- function(x, newdata = NULL, newweights = 1, blwise = TRUE, ...) { + + FDboost_regular <- !inherits(x, c("FDboostScalar", "FDboostLong")) + + nd <- !is.null(newdata) + + # built subdata + dat <- list() + dat$cov <- if(!nd) x$data + else newdata[names(x$data)] + dat$cov[[x$yname]] <- rep(1, min(lengths(dat$cov))) + if(is.list(x$yind)) { + dat$resp <- if(!nd) x$yind else newdata[names(x$yind)] + } else { + dat$resp <- if(!nd) setNames(list(x$yind), + attr(x$yind, "nameyind")) else + newdata[attr(x$yind, "nameyind")] + } + dat$resp <- as.data.frame(dat$resp) + dat$resp[[x$yname]] <- 1 + + # extract formulae + formulae <- list() + formulae$cov <- as.formula(x$formulaFDboost) + formulae$resp <- as.formula(paste(x$yname, x$timeformula)) + + # set up component models + mod <- list() + # standard mboost model for covariates + mod$cov <- mboost(formulae$cov, + data = dat$cov, + offset = 0, + control = boost_control(mstop = 0, nu = 1)) + # artificial FDboost intercept model for response + mod$resp <- mboost(formulae$resp, + data = dat$resp, + offset = if(FDboost_regular) + matrix(x$offset, nrow = x$ydim[1])[1,] else + x$offset, + control = boost_control(mstop = 0, nu = 1)) + # copy essential parts from base model to response + which_vars <- c("yname", "ydim", "predictOffset", "withIntercept", + "callEval", "timeformula", "formulaFDboost", + "formulaMboost", "family", "(weights)", "id") + cls <- class(mod$resp) + mod$resp[which_vars] <- unclass(x)[which_vars] + if(FDboost_regular) mod$resp$ydim <- c(1, x$ydim[2]) + mod$resp$yind <- range(x$yind) + attr(mod$resp$yind, "nameyind") <- attr(x$yind, "nameyind") + if(FDboost_regular) + class(mod$resp) <- c("FDboostLong", class(x)) else + class(mod$resp) <- class(x) + + if(nd) { + if(length(newweights)==1) + mod$resp[["(weights)"]] <- rep(newweights, length(dat$resp[[x$yname]])) else { + stopifnot(length(newweights) == length(dat$resp[[x$yname]])) + mod$resp[["(weights)"]] <- newweights + } + mod$resp$id <- newdata[[attr(mod$resp$id, "nameid")]] + } + + # set to FDboost_fac class + for(i in names(mod)) + class(mod[[i]]) <- c("FDboost_fac", class(mod[[i]])) + + # get coefficients (only of selected learners) + bl_selected <- x$which(usedonly = TRUE) + cf <- coef(x, raw = TRUE, which = bl_selected) + + # extract design matrices + + X <- list( + cov = extract(mod$cov, what = "design", which = bl_selected), + resp = extract(mod$resp, what = "design", which = 1) + ) + index <- list( + cov = extract(mod$cov, what = "index", which = bl_selected), + resp = extract(mod$resp, what = "index", which = 1) + ) + + wghts <- mod$resp$`(weights)` + + if(is.null(wghts)) { + wghts <- list(cov = 1, resp = 1) + } else { + if(FDboost_regular) { + + dim(wghts) <- x$ydim + wghts <- list( + cov = rowMeans(wghts), + resp = wghts[1, ] + ) + } else { + wghts <- list(cov = as.vector(tapply(wghts, mod$resp$id, mean))) + wghts$resp <- mod$resp[["(weights)"]] / wghts$cov[mod$resp$id] + } + } + + wghts <- Map(function(w, idx) { + lapply(idx, function(i) { + if(is.null(i)) w else + c(tapply(w, i, sum)) + }) + }, wghts, index) + + # multiply sqrt(weights) to X to take them into account + X <- Map(function(x,w) { + Map(function(.x, .w) sqrt(.w) * .x, x,w) + }, X, wghts) + # NOTE: X is now sqrt(w) * X ! + + # do QR decomposition to achieve orthonormal basis representation + QR <- lapply(X, lapply, qr) + ## extract Q as orthonormal version of X + # Q <- lapply(QR, lapply, qr.Q) # not necessary + + # transform cf accordingly + R <- lapply(QR, lapply, function(x) { + if(inherits(x, "qr")) + qr.R(x)[, order(x$pivot)] else + qrR(x, backPermute = TRUE) }) + + cf <- Map(matrix, cf, nrow = lapply(X$cov, ncol), byrow = !FDboost_regular) + cf <- Map(function(r1, o) r1 %*% tcrossprod(o, R$resp[[1]]), R$cov, cf) + + # perform SVD on cf + if(blwise) { + SVD <- lapply(cf, svd) + Ud <- lapply(SVD, function(x) sweep(x$u, 2, x$d, "*")) + d2 <- list(cov = lapply(SVD, function(x) (x$d)^2)) + V <- lapply(SVD, `[[`, "v") + rm(SVD) + } else { + cf <- do.call(rbind, cf) + SVD <- svd(cf) + cfidx <- relist(seq_len(nrow(cf)), + lapply(X$cov, function(x) numeric(ncol(x)))) + Ud <- lapply(cfidx, function(idx) + sweep(SVD$u[idx, , drop = FALSE], 2, SVD$d, "*")) + d2 <- list( + cov = lapply(Ud, function(ud) colSums(ud^2)), + resp = SVD$d^2 + ) + V <- list(model = SVD$v) + rm(SVD) + } + + # compute new coefs + d_max <- sqrt(max(unlist(d2))) + if(d_max == 0) d_max <- 1 + cf <- list() + my_solve <- function(a, b) { + ret <- try(solve(a, b), silent = TRUE) + if(inherits(ret, "try-error")) { + ret <- ginv(a) %*% b + } + ret + } + cf$cov <- Map(function(R, du) { + as.matrix(my_solve(R, du)) / d_max + }, R$cov, Ud) + cf$resp <- setNames( + lapply(V, my_solve, a = R$resp[[1]] / d_max), + nm = if(blwise) + paste0(names(X$resp)[1], " [", names(X$cov), "]") else + names(X$resp)[1] + ) + .no_mat <- which(!sapply(cf$resp, is.matrix)) + cf$resp[.no_mat] <- + lapply(cf$resp[.no_mat], as.matrix) + # drop dimension discrepancies + if(length(cf$cov) == length(cf$resp)) { + for(bl in seq_along(cf$cov)) { + nc <- min(NCOL(cf$cov[[bl]]), NCOL(cf$resp[[bl]])) + cf$cov[[bl]] <- cf$cov[[bl]][, 1:nc, drop = FALSE] + cf$resp[[bl]] <- cf$resp[[bl]][, 1:nc, drop = FALSE] + } + } + for(bl in seq_along(cf$cov)) { + d2$cov[[bl]] <- head(d2$cov[[bl]], NCOL(cf$cov[[bl]])) + } + + # decomposition complete - now prepare output --------------- + + # get model environments + e <- lapply(mod, function(m) environment(m$predict)) + + # clone and equip baselearners + bl_dims <- lapply(cf, sapply, NCOL) + # vector for cloning bls + bl_mltpl <- list( + cov = rep(seq_along(bl_dims$cov), bl_dims$cov), + resp = rep(1, sum(bl_dims$resp)) + ) + bl_names <- Map(function(.cf, .bl_dims) + unlist(Map(function(name, len) paste0(name, " [", seq_len(len), "]"), + names(.cf), .bl_dims), use.names = FALSE), + cf, bl_dims) + # order of newly generated bls with respect to their variance + d2l <- lapply(d2, unlist) + bl_order <- Map(function(bmlt, d2) order(bmlt)[order(d2, decreasing = TRUE)], + bl_mltpl, d2l) + + for(i in names(mod)) { + this_select <- if(i=="cov") bl_selected else 1 + mod[[i]]$baselearner <- e[[i]]$blg <- setNames( + e[[i]]$blg[this_select][bl_mltpl[[i]]], bl_names[[i]]) + mod[[i]]$basemodel <- e[[i]]$bl <- setNames( + e[[i]]$bl[this_select][bl_mltpl[[i]]], bl_names[[i]]) + e[[i]]$bnames <- bl_names[[i]] + # fill in coefs with bl order decreasing with explained variance + e[[i]]$xselect <- bl_order[[i]] + e[[i]]$ens <- unlist(lapply(cf[[i]], asplit, 2), recursive = FALSE) + e[[i]]$ens <- Map( function(x, cls) { + bm <- list(model = x) + class(bm) <- gsub("bl", "bm", cls, fixed = TRUE) + bm + }, + x = e[[i]]$ens[bl_order[[i]]], + cls = lapply(mod[[i]]$basemodel, class)[bl_order[[i]]]) + # add risk + this_d2l <- d2l[[i]] + if(is.null(this_d2l)) + this_d2l <- d2l[[1]] + e[[i]]$mrisk <- sum(this_d2l) - + cumsum(c(0,sort(this_d2l, decreasing = TRUE))) + # engage full number of components + mod[[i]]$subset(sum(this_d2l>0)) + } + + # return factor models + mod +} + + +# define class and methods ---------------------------------------------------- + +#' @importFrom methods setOldClass +#' @exportClass FDboost_fac + +setOldClass("FDboost_fac") + +#' `FDboost_fac` S3 class for factorized FDboost model components +#' +#' @description Model factorization with `factorize()` decomposes an +#' `FDboost` model into two objects of class `FDboost_fac` - one for the +#' response and one for the covariate predictor. The first is essentially +#' an `FDboost` object and the second an `mboost` object, however, +#' in a 'read-only' mode and slightly adjusted methods (method defaults). +#' +#' @name FDboost_fac-class +#' @seealso [factorize(), factorize.FDboost()] +NULL + + + +#' Prediction and plotting for factorized FDboost model components +#' +#' @param object,x a model-factor given as a \code{FDboost_fac} object +#' @param newdata optionally, a data frame or list +#' in which to look for variables with which to predict. +#' See \code{\link[mboost]{predict.mboost}}. +#' @param which a subset of base-learner components to take into +#' account for computing predictions or coefficients. Different +#' components are never aggregated to a joint prediction, but always +#' returned as a matrix or list. Select the k-th component +#' by name in the format \code{bl(x, ...)[k]} or all components of a base-learner +#' by dropping the index or all base-learners of a variable by using +#' the variable name. +#' @param main the plot title. By default, base-learner names are used with +#' component numbers \code{[k]}. +#' @param ... additional arguments passed to underlying methods. +#' +#' @method predict FDboost_fac +#' +#' @export +#' @name predict.FDboost_fac +#' @aliases plot.FDboost_fac +#' @return A matrix of predictions (for predict method) or no +#' return value (plot method) +#' @seealso [factorize(), factorize.FDboost()] +#' +predict.FDboost_fac <- function(object, newdata = NULL, which = NULL, ...) { + w <- object$which(which) + if(anyNA(w)) + stop("Don't know 'which' base-learner is meant.") + names(w) <- names(object$baselearner)[w] + drop(sapply(w, + function(x) predict.mboost(which = x, + object = object, + newdata = newdata, + aggregate = "sum", ...))) +} + +#' @method plot FDboost_fac +#' @rdname predict.FDboost_fac +plot.FDboost_fac <- function(x, which = NULL, main = NULL, ...) { + w <- x$which(which, usedonly = TRUE) + if(anyNA(w)) + stop(paste("Don't know which base-learner is meant by:", + which[which.min(is.na(w))])) + if(is.null(main)) + main <- names(x$baselearner)[w] + for(i in seq_along(w)) + plot.mboost(x, which = w[i], main = main[i], ...) +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/hmatrix.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/hmatrix.R new file mode 100644 index 0000000..fef32bd --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/hmatrix.R @@ -0,0 +1,371 @@ + +#### see http://adv-r.had.co.nz/S3.html +#### for the advices on best practices for a S3 class + +######### Create a construction method that checks the types of the input, +# and returns a list with the correct class label. XXX <- function(...) {} + +#' A S3 class for univariate functional data on a common grid +#' +#' The hmatrix class represents data for a functional historical effect. +#' The class is basically a matrix containing the time and the id for the observations of the +#' functional response. The functional covariate is contained as attribute. +#' @param time set of argument values of the response in long format, +#' i.e. at which \code{t} the response curve is observed +#' @param id specify to which curve the point belongs to, id from 1, 2, ..., n. +#' @param x matrix of functional covariate, each trajectory is in one row +#' @param argvals set of argument values, i.e., the common gird at which the functional covariate +#' is observed, by default \code{seq_len(ncol(x))} +#' @param timeLab name of the time axis, by default \code{t} +#' @param idLab name of the id variable, by default \code{wideIndex} +#' @param xLab name of the functional variable, by default NULL +#' @param argvalsLab name of the argument for the covariate by default \code{s} +#' +#' @details In the hmatrix class the id has to run from i=1, 2, ..., n including all integers from 1 to n. +#' The rows of the functional covariate x correspond to those observations. +#' +#' @seealso \code{\link{getTime.hmatrix}} to extract attributes, +#' and ?"[.hmatrix" for the extract method. +#' +#' @examples +#' ## Example for a hmatrix object +#' t1 <- rep((1:5)/2, each = 3) +#' id1 <- rep(1:3, 5) +#' x1 <- matrix(1:15, ncol = 5) +#' s1 <- (1:5)/2 +#' myhmatrix <- hmatrix(time = t1, id = id1, x = x1, argvals = s1, +#' timeLab = "t1", argvalsLab = "s1", xLab = "test") +#' +#' # extract with [ keeps attributes +#' # select observations of subjects 2 and 3 +#' myhmatrixSub <- myhmatrix[id1 %in% c(2, 3), ] +#' str(myhmatrixSub) +#' getX(myhmatrixSub) +#' getX(myhmatrix) +#' +#' # get time +#' myhmatrix[ , 1] # as column matrix as drop = FALSE +#' getTime(myhmatrix) # as vector +#' +#' # get id +#' myhmatrix[ , 2] # as column matrix as drop = FALSE +#' getId(myhmatrix) # as vector +#' +#' # subset hmatrix on the basis of an index, which is defined on the curve level +#' reweightData(data = list(hmat = myhmatrix), vars = "hmat", index = c(1, 1, 2)) +#' # this keeps only the unique x values in attr(,'x') but multiplies the corresponding +#' # ids and times in the time id matrix +#' # for bhistx baselearner, there may be an additional id variable for the tensor product +#' newdat <- reweightData(data = list(hmat = myhmatrix, +#' repIDx = rep(seq_len(nrow(attr(myhmatrix,'x'))), length(attr(myhmatrix,"argvals")))), +#' vars = "hmat", index = c(1,1,2), idvars="repIDx") +#' length(newdat$repIDx) +#' +#' ## use hmatrix within a data.frame +#' mydat <- data.frame(I(myhmatrix), z=rnorm(3)[id1]) +#' str(mydat) +#' str(mydat[id1 %in% c(2, 3), ]) +#' str(myhmatrix[id1 %in% c(2, 3), ]) +#' +#' @return An matrix object of type \code{"hmatrix"} +#' +#' @export +hmatrix <- function(time, id, x, argvals=seq_len(ncol(x)), + timeLab="t", idLab="wideIndex", xLab="x", argvalsLab="s"){ + + ## check that id is integer valued containing 1, 2, 3, ..., n + ## and that x has n rows + stopifnot( all(sort(unique(id)) == seq_len(nrow(x))) ) + stopifnot(length(time)==length(id)) + + # convert x to a matrix, especially if x is of class AsIs + x <- matrix(x, ncol=ncol(x), nrow=nrow(x)) + + #### check argvals and x + if(anyDuplicated(argvals) > 0){ + stop("argvals contains duplicates.") + } + if( is.unsorted(argvals) ){ + stop("argvals is not sorted.") + } + + if (ncol(x)!=length(argvals)) { + stop(quote(x), " must have same number of columns as the length of ", quote(s), ".") + } + + ret <- matrix(c(time, id), ncol=2) + colnames(ret) <- c("time","id") + ## ret <- data.frame(time=time, id=id) # use matrix to use hmatrix within a data.frame + + attr(ret, "x") <- x + attr(ret, "argvals") <- argvals + attr(ret, "timeLab") <- timeLab + attr(ret, "idLab") <- idLab + attr(ret, "xLab") <- xLab + attr(ret, "argvalsLab") <- argvalsLab + class(ret) <- c("hmatrix", class(ret)) + ret +} + + +### Define the generic methods +#' Generic functions to asses attributes of functional data objects +#' +#' Extract attributes of an object. +#' @param object an R-object, currently implemented for hmatrix and fmatrix +#' +#' @details Extract the time variable \code{getTime}, the id\code{getId}, +#' the functional covariate \code{getX}, its argument values \code{getArgvals}. +#' Or the names of the different variables \code{getTimeLab}, +#' \code{getIdLab}, \code{getXLab}, \code{getArgvalsLab}. +#' +#' @seealso \code{\link{hmatrix}} for the h.atrix class. +#' +#' @aliases getId getX getArgvals getTimeLab getIdLab getXLab getArgvalsLab +#' @return properties of a hmatrix or fmatrix +#' @export +getTime <- function(object) { UseMethod("getTime", object) } + +#' @rdname getTime +#' @export +getId <- function(object) { UseMethod("getId", object) } + +#' @rdname getTime +#' @export +getX <- function(object) { UseMethod("getX", object) } + +#' @rdname getTime +#' @export +getArgvals <- function(object) { UseMethod("getArgvals", object) } + +#' @rdname getTime +#' @export +getTimeLab <- function(object) { UseMethod("getTimeLab", object) } + +#' @rdname getTime +#' @export +getIdLab <- function(object) { UseMethod("getIdLab", object) } + +#' @rdname getTime +#' @export +getXLab <- function(object) { UseMethod("getXLab", object) } + +#' @rdname getTime +#' @export +getArgvalsLab <- function(object) { UseMethod("getArgvalsLab", object) } + + + +#' Extract attributes of hmatrix +#' +#' Extract attributes of an object of class \code{hmatrix}. +#' @param object object of class hmatrix +#' +#' @details Extract the time variable \code{getTime}, the id\code{getId}, +#' the functional covariate \code{getX}, its argument values \code{getArgvals}. +#' Or the names of the different variables \code{getTimeLab}, +#' \code{getIdLab}, \code{getXLab}, \code{getArgvalsLab} for an object of class \code{hmatrix}. +#' +#' @aliases getId.hmatrix getX.hmatrix getArgvals.hmatrix getTimeLab.hmatrix getXLab.hmatrix getArgvalsLab.hmatrix +#' @return properties of a hmatrix +#' +#' @export +getTime.hmatrix <- function(object) object[ , 1, drop=TRUE] + +#' @rdname getTime.hmatrix +#' @export +getId.hmatrix <- function(object) object[ , 2, drop=TRUE] + +#' @rdname getTime.hmatrix +#' @export +getX.hmatrix <- function(object) attr(object, "x") + +#' @rdname getTime.hmatrix +#' @export +getArgvals.hmatrix <- function(object) attr(object, "argvals") + +#' @rdname getTime.hmatrix +#' @export +getTimeLab.hmatrix <- function(object) attr(object, "timeLab") + +#' @rdname getTime.hmatrix +#' @export +getIdLab.hmatrix <- function(object) attr(object, "idLab") + +#' @rdname getTime.hmatrix +#' @export +getXLab.hmatrix <- function(object) attr(object, "xLab") + +#' @rdname getTime.hmatrix +#' @export +getArgvalsLab.hmatrix <- function(object) attr(object, "argvalsLab") + +######### Write a function to check if an object is of your class: +# is.XXX <- function(x) inherits(x, "XXX") +#' Test to class of hmatrix +#' +#' is.hmatrix tests if its argument is an object of class hmatrix. +#' @param object object of class hmatrix +#' @return logical value +#' @export +is.hmatrix <- function(object){ + inherits(object, "hmatrix") +} + +######### When implementing a vector class, you should implement these methods: +# length, [, [<-, [[, [[<-, c. (If [ is implemented rev, head, and tail should all work). + +#' Extract or replace parts of a hmatrix-object +#' +#' Operator acting on hmatrix preserving the attributes when rows are extracted. +#' @param x object from which to extract element(s) or in which to replace element(s). +#' @param i,j indices specifying elements to extract or replace. Indices are numeric +#' vectors or empty (missing) or NULL. Numeric values are coerced to integer as by as.integer +#' (and hence truncated towards zero). +#' @param ... not used +#' @param drop If \code{TRUE} the result is coerced to the lowest possible dimension +#' (or just a matrix). This only works for extracting elements, not for the +#' replacement, defaults to \code{FALSE}. +#' +#' @details If used on columns or rows/columns a matrix is returned. +#' If used on rows only, i.e. x[i,] an object of class hmatrix is returned. +#' The id is changed so that it runs from 1, ..., nNew, where nNew is the number of different +#' id values in the new hmatrix-object. +#' From the functional covariate \code{x} rows are selected accordingly. +#' +#' @seealso ?"[" +#' @return a \code{"hmatrix"} object +#' @export +`[.hmatrix` <- function(x, i, j, ..., drop=FALSE) { + + # number of arguments without drop + Narg <- nargs() - (!missing(drop)) + + # save attributs of x + xAttr <- attributes(x) + + ## use "[" method as for a matrix + r <- NextMethod("[", drop=drop) + class(r) <- class(r)[class(r)!="hmatrix"] + + ## x[i] return column i + if(Narg == 2){ + return(r) + } + + ## x[i,] whole rows are selected + ## the is.symbol(j) is used if hmatrix is part of a data.frame using I() + if(missing(j) || is.symbol(j)){ + + tempId <- r[ ,2] # get the id of the corresponding rows + tempId <- (seq_along(unique(tempId)))[factor(tempId)] # transform the id to 1, 2, 3, ... + + return( hmatrix(time=r[ ,1], id=tempId, + x=xAttr$x[unique(r[ ,2]), , drop=FALSE], argvals = xAttr$argvals, + timeLab = xAttr$timeLab, idLab = xAttr$idLab, xLab = xAttr$xLab, argvalsLab = xAttr$argvalsLab) ) + } + + # x[i,j] select on rows and colums, or only columns x[,j] + return(r) +} + +#' Transform id and time of wide format into long format +#' +#' Transform id and time from wide format into long format, i.e., time and id are +#' repeated accordingly so that two vectors of the same length are returned. +#' @param time the observation points +#' @param id the id for the curve +#' @return a list with \code{time} and \code{id} +#' @export +wide2long <- function(time, id){ + newtime <- rep(time, each=length(unique(id))) + newid <- rep(id, length(time)) + return(list(time=newtime, id=newid)) +} + +#' Subsets hmatrix according to an index +#' +#' @param x hmatix object that should be subsetted +#' @param index integer vector with (possibly duplicated) indices +#' for each curve to select +#' @param compress logical, defaults to \code{TRUE}. Only used to force a meaningful +#' behaviour of \code{applyFolds} with hmatrix objects when using nested resampling. +#' +#' @details This methods is primary useful when subsetting repeatedly. +#' @examples +#' t1 <- rep((1:5)/2, each = 3) +#' id1 <- rep(1:3, 5) +#' x1 <- matrix(1:15, ncol = 5) +#' s1 <- (1:5)/2 +#' hmat <- hmatrix(time = t1, id = id1, x = x1, argvals = s1, timeLab = "t1", +#' argvalsLab = "s1", xLab = "test") +#' +#' index1 <- c(1, 1, 3) +#' index2 <- c(2, 3, 3) +#' resMat <- subset_hmatrix(hmat, index = index1) +#' try(resMat2 <- subset_hmatrix(resMat, index = index2)) +#' resMat <- subset_hmatrix(hmat, index = index1, compress = FALSE) +#' try(resMat2 <- subset_hmatrix(resMat, index = index2)) +#' +#' @return a \code{hmatrix} object +#' +#' @export +subset_hmatrix <- function(x, index, compress = TRUE) +{ + + ## get attributes + attrTemp <- attributes(x) + + # save time and id variable of hmatrix-object as ordinary matrix + # otherwise [ on a hmatrix-object behaves unexpectedly + tempMat <- cbind(x[, 1], x[, 2]) + + # create new matrix for results + resMat <- matrix(ncol=3) + + # for all unique time points t do + for(t in unique(x[, 1])){ + + # check whether the id exists for this time point + idInT <- index %in% tempMat[tempMat[,1] == t, 2] + # add rows for observations selected by index for time t + resMat <- rbind(resMat, + matrix(c(rep(t, sum(idInT)), # for time points in hmatrix + index[idInT], # for id in hmatrix + (seq_along(index))[idInT]), # for idvars + ncol=3)) + + } + + # drop first row with NAs + resMat <- resMat[-1,] + + if(compress) + { + # id with duplicates + idvars <- c(factor(resMat[,2])) + # correct ordering + idvars <- (seq_along(unique(idvars)))[factor(idvars)] + + # rewrite index for actual matrix + index <- unique(index) + + }else{ + # id with unique values + idvars <- resMat[,3] + } + + new_time <- resMat[,1] + + newHmat <- hmatrix(time = new_time, + id = idvars, + x = attrTemp$x[index, , drop=FALSE], + argvals = attrTemp$argvals, + timeLab = attrTemp$timeLab, + idLab = attrTemp$idLab, + xLab = attrTemp$xLab, + argvalsLab = attrTemp$argvalsLab) + + return(newHmat) + +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/methods.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/methods.R new file mode 100644 index 0000000..ebad9d9 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/methods.R @@ -0,0 +1,1939 @@ + +#' Print and summary of a boosted functional regression model +#' +#' Takes a fitted \code{FDboost}-object and produces a print +#' to the console or a summary. +#' +#' @param object a fitted \code{FDboost}-object +#' @param x a fitted \code{FDboost}-object +#' @param ... currently not used +#' +#' @seealso \code{\link{FDboost}} for the model fit. +#' +#' @return a list with information on the model / a list with summary information +#' +#' @method summary FDboost +#' +#' @aliases print.FDboost +#' +#' @export +### similar to summary.mboost() +summary.FDboost <- function(object, ...) { + + ret <- list(object = object, selprob = NULL) + xs <- selected(object) + nm <- variable.names(object) + if (length(xs) > 0) { # mstop > 0 + selprob <- tabulate(xs, nbins = length(nm)) / length(xs) + names(selprob) <- names(nm) + selprob <- sort(selprob, decreasing = TRUE) + ret$selprob <- selprob[selprob > 0] + } + + class(ret) <- "summary.FDboost" + + return(ret) +} + + +#' @method print FDboost +#' @rdname summary.FDboost +#' @export +### similar to print.mboost() +print.FDboost <- function(x, ...) { + + cat("\n") + type <- switch(class(x)[1], + FDboost22 = "Functional Response", + FDboostLong = "Functional Response in Long Format", + FDboostScalar = "Scalar Response") + if(is.null(type)) type <- "Functional Response" + cat("\t Model-based Boosting with", type, "\n") + cat("\n") + + if (!is.null(x$call)) + cat("Call:\n", deparse(x$call, nlines = 10), "\n\n", sep = "", nlines = 10) + show(x$family) + cat("\n") + cat("Number of boosting iterations: mstop =", mstop(x), "\n") + cat("Step size: ", x$control$nu, "\n") + + if(length(unique(x$offset)) < 10){ + cat("Offset: ", round(unique(x$offset), 3), "\n") + }else{ + cat("Offset: ", round(unique(x$offset), 3)[1:3], "..." , + round(unique(x$offset), 3)[length(unique(x$offset))-3+1:3], "\n") + } + + cat("Number of baselearners: ", length(variable.names(x)), "\n") + cat("\n") + invisible(x) + +} + + + +#' Prediction for boosted functional regression model +#' +#' Takes a fitted \code{FDboost}-object produced by \code{\link{FDboost}()} and produces +#' predictions given a new set of values for the model covariates or the original +#' values used for the model fit. This is a wrapper +#' function for \code{\link[mboost]{predict.mboost}()} +#' +#' @param object a fitted \code{FDboost}-object +#' @param newdata a named list or a data frame containing the values of the model +#' covariates at which predictions are required. +#' If this is not provided then predictions corresponding to the original data are returned. +#' If \code{newdata} is provided then it should contain all the variables needed for +#' prediction, in the format supplied to \code{FDboost}, i.e., +#' functional predictors must be supplied as matrices with each row corresponding to +#' one observed function. +#' @param which a subset of base-learners to take into account for computing predictions +#' or coefficients. If which is given (as an integer vector corresponding to base-learners) +#' a list is returned. +#' @param toFDboost logical, defaults to \code{TRUE}. In case of regular response in wide format +#' (i.e. response is supplied as matrix): should the predictions be returned as matrix, or list +#' of matrices instead of vectors +#' @param ... additional arguments passed on to \code{\link[mboost]{predict.mboost}()}. +#' +#' @seealso \code{\link{FDboost}} for the model fit +#' and \code{\link{plotPredicted}} for a plot of the observed values and their predictions. +#' @return a matrix or list of predictions depending on values of unlist and which +#' @method predict FDboost +#' @export +# predict function: wrapper for predict.mboost() +predict.FDboost <- function(object, newdata = NULL, which = NULL, toFDboost = TRUE, ...){ + + stopifnot(inherits(object, "FDboost")) + # print("Prediction FDboost") + dots <- list(...) + + # toFDboost is only meaningful for array-data + if(inherits(object, c("FDboostScalar", "FDboostLong"))) toFDboost <- FALSE + + if(!is.null(dots$aggregate) && dots$aggregate[1] != "sum"){ + if(length(which) > 1 ) stop("For aggregate != 'sum', only one effect, or which=NULL are possible.") + if(toFDboost && class(object)[1] == "FDboost"){ + toFDboost <- FALSE + warning("Set toFDboost to FALSE, as aggregate != 'sum'. Prediction is in long vector.") + } + } + + classObject <- class(object) + class(object) <- "mboost" + # which effects were selected + sel <- NULL + # NULL if no base-learners are selected as mstop = 0 + if(!is.null(selected(object))) sel <- sort(unique(selected(object))) + + ### Prepare data so that the function predict.mboost() can be used + if(!is.null(newdata)){ + + ## save time-variable (index over response) + nameyind <- attr(object$yind, "nameyind") + + ## response observed on common grid / scalar response + if(classObject[1] != "FDboostLong"){ ## if(!is.null(object$ydim)){ + # get the number of trajectories you want to predict + n <- NROW(newdata[[1]]) + ## use the second variable if the first is the time variable + if(is.list(newdata) && length(newdata) > 1){ + if(names(newdata[1]) == nameyind) n <- NROW(newdata[[2]]) + } + + lengthYind <- length(newdata[[nameyind]]) + + # try to get more reliable information on n (number of trajectories) + # and on lengthYind (length of time) + # using the hmatrix-objects in newdata if available + if(is.list(newdata) || is.data.frame(newdata)){ + classes <- lapply(newdata, class) + alln <- c() + alllengthYind <- c() + for(i in seq_along(classes)){ + if( any(classes[[i]] == "hmatrix" ) ){ + # number of trajectories + n <- length(unique(newdata[[i]][,2]) ) + alln <- c(alln, n) + # number of different observation points + lengthYind <- length(unique(newdata[[i]][,1]) ) + alllengthYind <- c(alllengthYind, length(unique(newdata[[nameyind]]))) + } + } + ## in case of scalar response, set lenth of yindex to 1 + if(classObject[1] == "FDboostScalar"){ + lengthYind <- 1 + alllengthYind <- 1 + } + + if( length(unique(alln))>1 ) stop("The hmatrix-objects in newdata imply differing numbers of trajectories.") + if( length(unique(alllengthYind))>1 ) stop("The hmatrix-objects in newdata imply differing times or do not match the time variable.") + } + + if(classObject[1] != "FDboostScalar" && lengthYind == 0){ + stop("Index of response, ", nameyind, ", must be specified and have length > 0.") + } + + # dummy variable to fit the intercept + newdata[["ONEx"]] <- rep(1.0, n) + # dummy variable for time + newdata$ONEtime <- rep(1.0, lengthYind) + + # message("Predict ", n, " x ", lengthYind," observations.") + + }else{ #### for response observed on irregular grid + + n <- 1 + lengthYind <- length(newdata[[nameyind]]) + if(is.list(newdata) || is.data.frame(newdata)){ + classes <- lapply(newdata, class) + alllengthYind <- c(lengthYind) + for(i in seq_along(classes)){ + if( any(classes[[i]] == "hmatrix" ) ){ + # total number of observation points + lengthYind <- length(newdata[[i]][,1]) + alllengthYind <- c(alllengthYind, lengthYind) + } + } + if( length(unique(alllengthYind))>1 ) stop("The hmatrix-objects in newdata imply differing times or do not match the time variable.") + } + + # dummy variable to fit the intercept + newdata[["ONEx"]] <- rep(1.0, lengthYind) + # dummy variable for time + newdata$ONEtime <- rep(1.0, lengthYind) + + ## message("Predict ", lengthYind, " observations in total.") + + } ## for response observed on irregular grid + + ### Predict effect of offset (scalar, regular, irregular): + # use the function predictOffset() on the new time-variable + predOffset <- object$predictOffset(newdata[[nameyind]]) + # for regular response: repeat offset accordingly + if(classObject[1]=="FDboost") predOffset <- rep(predOffset, each=n) + + ### In the case of bsignal(), bfpc(), bconcurrent() and bhist() it is necessary + # to add the index of the signal-matrix as attribute + posBsignal <- c(grep("bsignal(", names(object$baselearner), fixed = TRUE), + grep("bfpc(", names(object$baselearner), fixed = TRUE)) + posBconc <- grep("bconcurrent(", names(object$baselearner), fixed = TRUE) + posBhist <- grep("bhist(", names(object$baselearner), fixed = TRUE) + whichHelp <- which + if(is.null(which)) whichHelp <- seq_along(object$baselearner) + posBsignal <- whichHelp[whichHelp %in% posBsignal] + posBconc <- whichHelp[whichHelp %in% posBconc] + posBhist <- whichHelp[whichHelp %in% posBhist] + + if(length(c(posBsignal, posBconc, posBhist)) > 0){ + #if(!is.list(newdata)) newdata <- list(newdata) + for(i in c(posBsignal, posBconc, posBhist)){ + xname <- object$baselearner[[i]]$get_names()[1] + indname <- attr(object$baselearner[[i]]$get_data()[[xname]], "indname") # does not work for %X% + ## if two ore more base-learners are connected by %X%, find the functional variable + ## the loop is necessary if more than one functioal covaraites are used in the same bl + if(grepl("%X", names(object$baselearner)[i], fixed = TRUE)){ + form <- strsplit(object$baselearner[[i]]$get_call(), "%X", fixed = TRUE)[[1]] + findFun <- grepl("bhist", form, fixed = TRUE) | grepl("bconcurrent", form, fixed = TRUE) | grepl("bsignal", form, fixed = TRUE) | grepl("bfpc", form, fixed = TRUE) + xname <- c() + indname <- c() + for(j in which(findFun)){ + xname[j] <- object$baselearner[[i]]$get_names()[j][1] + fun_call <- strsplit(names(object$baselearner)[[i]], "%.{1,3}%")[[1]][j] + fun_call <- gsub(pattern = "\\\"", replacement = "", x = fun_call, fixed=TRUE) + fun_call <- gsub(pattern = "\\", replacement = "", x = fun_call, fixed=TRUE) + fun_call <- gsub(pattern = "\"", replacement = "", x = fun_call, fixed=TRUE) + indname[j] <- all.vars(formula(paste("Y~", fun_call)))[3] # variabes are Y, x, s, (time) + } + } + + if(i %in% c(posBhist, posBconc)){ + indnameY <- attr(object$baselearner[[i]]$get_data()[[xname]], "indnameY") + }else{ + indnameY <- NULL + } + + for(j in seq_along(xname)){ + attr(newdata[[xname[j]]], "indname") <- indname[j] + attr(newdata[[xname[j]]], "xname") <- xname[j] + attr(newdata[[xname[j]]], "signalIndex") <- if(indname[j]!="xindDefault") newdata[[indname[j]]] else seq(0,1,l=ncol(newdata[[xname[j]]])) + ## convert matrix to class AsIs using I(), so that as.data.frame(newdata[[xname]]) + ## retains matrix-structure if newdata is a list + if( class(newdata[[xname[j]]])[1] == "matrix" ) newdata[[xname[j]]] <- I(newdata[[xname[j]]]) + } + + + if(i %in% c(posBhist, posBconc)){ + if(length(xname) > 1) stop("Cannot deal with interactions of funtional covariates in historical or concurrent effects.") + attr(newdata[[indnameY]], "indnameY") <- indnameY + attr(newdata[[xname]], "indexY") <- if(indnameY!="xindDefault") newdata[[indnameY]] else seq(0,1,l=ncol(newdata[[xname]])) + if(any(classObject=="FDboostLong")){ + id <- newdata[[ attr(object$id, "nameid") ]] + attr(newdata[[xname]], "id") <- id + } + } + + } ## loop over posBsignal, ... + } # end data setup for functional effects (adding index as attribute to the data) + + ###### Prediction using the function predict.mboost() + + # Function to suppress the warning that user-specified + # offset of length>1 is not used in prediction, + # important when offset=NULL in FDboost() but not in mboost() + muffleWarning1 <- function(w){ + if( any( grepl("User-specified offset is not a scalar", w, fixed = TRUE) ) ) + invokeRestart( "muffleWarning" ) + } + + ## predict all effects together, model-inherent offset is included automatically + if(is.null(which)){ + + if(is.null(object$offsetFDboost) && !is.null(object$offsetMboost) ){ + # offset=NULL in FDboost, but not in mboost + ## suppress the warning that the offset cannot be used if offset=NULL in FDboost + ## as offset is predicted and included in prediction + predMboost <- withCallingHandlers(predict(object=object, newdata=newdata, which=NULL, ...), + warning = muffleWarning1) + predMboost <- predMboost + predOffset + }else{ # offset != NULL in FDboost -> treat offset like in mboost + predMboost <- predict(object=object, newdata=newdata, which=NULL, ...) + } + + if(!is.null(dim(predMboost)) && dim(predMboost)[2] == 1) predMboost <- predMboost[,1] + + ## predict one or several effects separately + }else{ + predMboost <- vector("list", length(which)) + for(i in seq_along(which)){ + if(which[i]!=0){ + # only use predict.mboost() if the base-learner was selected at least once + if(! which[i] %in% sel){ + predMboost[[i]] <- rep(0L, lengthYind*n) + }else{ + # [,1] save vector instead of a matrix with one column + predMboost[[i]] <- withCallingHandlers(predict(object=object, newdata=newdata, which=which[i], ...), + warning = muffleWarning1) + if(!is.null(dim(predMboost[[i]])) && dim(predMboost[[i]])[2] == 1) predMboost[[i]] <- predMboost[[i]][,1] + } + }else{ + predMboost[[i]] <- predOffset # predict offset in case of which=0 + } + } + } # end else for !is.null(which) + + attr(predMboost, "offset") <- predOffset + + + ############################################ + }else{ # is.null(newdata) + n <- object$ydim[1] + lengthYind <- object$ydim[2] + + ## for response in long format / scalar response + if(is.null(object$ydim)){ + n <- 1 + lengthYind <- length(object$yind) + } + + if(classObject[1] == "FDboostScalar"){ + n <- length(object$response) + } + + ## predict all effects together, include the offset into the prediction + if(is.null(which)){ + predMboost <- predict(object=object, newdata=NULL, which=NULL, ...)#[,1] + if(!is.null(dim(predMboost)) && dim(predMboost)[2] == 1) predMboost <- predMboost[,1] + # for which=NULL return prediction of all effects + # offset of original data-fit is included automatically + + ## predict one or several effects separately + }else{ + predMboost <- vector("list", length(which)) + for(i in seq_along(which)){ + if(which[i]!=0){ + predMboost[[i]] <- predict(object=object, newdata=NULL, which=which[i], ...)#[,1] + if(!is.null(dim(predMboost[[i]])) && dim(predMboost[[i]])[2] == 1) predMboost[[i]] <- predMboost[[i]][,1] + if(!which[i] %in% sel){ + predMboost[[i]] <- rep(0L, lengthYind*n) + } + }else{ + predMboost[[i]] <- object$offset # return offset in case of which=0 + } + } + } # end else for !is.null(which) + attr(predMboost, "offset") <- object$offset + } ## end # is.null(newdata) + + ## remember the offset + offsetTemp <- attr(predMboost, "offset") + + + ### unlist the prediction in case that just one effect is predicted + if(length(which)==1){ + predMboost <- predMboost[[1]] + } + + ### return what mboost.predict would return, + ## i.e. vector for which=NULL, length(which)=1 + ## or a matrix for length(which)>1 + if(!toFDboost){ + if(length(which)<=1){ + return(predMboost) + } else{ + ## check that all predictions have the same length + stopifnot(all( length(predMboost[[1]]) == lapply(predMboost, length) )) + ret <- matrix(unlist(predMboost), ncol = length(predMboost)) + colnames(ret) <- names(predMboost) + attr(ret, "offset") <- offsetTemp + return(ret) + } + } + + # model-estimation in long format, just return vector/ list of vectors + if(is.null(object$ydim)) return(predMboost) + + ### If response was in wide format in FDboost. i.e. response was given as matrix + ## return matrix/ list of matrices + ## Reshape prediciton in vector to the prediction as matrix + reshapeToMatrix <- function(pred){ + if(is.null(pred)) return(NULL) + if(length(pred)==1) return(pred) + + predMat <- matrix(pred, nrow=n, ncol=lengthYind) + return(predMat) + } + + if(is.list(predMboost)){ + ret <- lapply(predMboost, reshapeToMatrix) + }else{ + ret <- reshapeToMatrix(predMboost) + } + + attr(ret, "offset") <- offsetTemp + + return(ret) +} + + + +#' Fitted values of a boosted functional regression model +#' +#' Takes a fitted \code{FDboost}-object and computes the fitted values. +#' +#' @param object a fitted \code{FDboost}-object +#' @param toFDboost logical, defaults to \code{TRUE}. In case of regular response in wide format +#' (i.e., response is supplied as matrix): should the predictions be returned as matrix, or list +#' of matrices instead of vectors +#' @param ... additional arguments passed on to \code{\link{predict.FDboost}} +#' +#' @seealso \code{\link{FDboost}} for the model fit. +#' @return matrix or vector of fitted values +#' @method fitted FDboost +#' @export +### similar to fitted.mboost() but returns the fitted values as matrix +fitted.FDboost <- function(object, toFDboost = TRUE, ...) { + + args <- list(...) + + if (length(args) == 0) { + ## give back matrix for regular response and toFDboost == TRUE + if(toFDboost && !inherits(object, "FDboostScalar") && !inherits(object, "FDboostLong") ){ + ret <- matrix(object$fitted(), nrow = object$ydim[1]) + }else{ # give back a long vector + ret <- object$fitted() + if (length(ret) == length(object$rownames)) + names(ret) <- object$rownames + } + + } else { + + if ("newdata" %in% names(args)) { + args$newdata <- NULL + warning("Argument ", sQuote("newdata"), " was ignored. Please use ", + sQuote("predict()"), " to make predictions for new data.") + } + + args$object <- object + args$toFDboost <- toFDboost + + ret <- do.call(predict, args) + } + ret +} + +#' Residual values of a boosted functional regression model +#' +#' Takes a fitted \code{FDboost}-object and computes the residuals, +#' more precisely the current value of the negative gradient is returned. +#' +#' @param object a fitted \code{FDboost}-object +#' @param ... not used +#' +#' @details The residual is missing if the corresponding value of the response was missing. +#' @seealso \code{\link{FDboost}} for the model fit. +#' @return matrix of residual values +#' @method residuals FDboost +#' @export +### residuals (the current negative gradient) +residuals.FDboost <- function(object, ...){ + + if(!inherits(object, "FDboostLong")){ + resid <- matrix(object$resid()) + ydim <- ifelse(is.null(object$ydim[1]), NROW(resid), object$ydim[1]) + resid <- matrix(resid, nrow = ydim) + resid[is.na(object$response)] <- NA + }else{ + resid <- object$resid() + resid[is.na(object$response)] <- NA + } + resid +} + + +#' Coefficients of boosted functional regression model +#' +#' Takes a fitted \code{FDboost}-object produced by \code{\link{FDboost}()} and +#' returns estimated coefficient functions/surfaces \eqn{\beta(t), \beta(s,t)} and +#' estimated smooth effects \eqn{f(z), f(x,z)} or \eqn{f(x, z, t)}. +#' Not implemented for smooths in more than 3 dimensions. +#' +#' @param object a fitted \code{FDboost}-object +#' @param raw logical defaults to \code{FALSE}. +#' If \code{raw = FALSE} for each effect the estimated function/surface is calculated. +#' If \code{raw = TRUE} the coefficients of the model are returned. +#' @param which a subset of base-learners for which the coefficients +#' should be computed (numeric vector), +#' defaults to NULL which is the same as \code{which=seq_along(object$baselearner)}. +#' In the special case of \code{which=0}, only the coefficients of the offset are returned. +#' @param computeCoef defaults to \code{TRUE}, if \code{FALSE} only the names of the terms are returned +#' @param returnData return the dataset which is used to get the coefficient estimates as +#' predictions, see Details. +#' @param n1 see below +#' @param n2 see below +#' @param n3 n1, n2, n3 give the number of grid-points for 1-/2-/3-dimensional +#' smooth terms used in the marginal equidistant grids over the range of the +#' covariates at which the estimated effects are evaluated. +#' @param n4 gives the number of points for the third dimension in a 3-dimensional smooth term +#' @param ... other arguments, not used. +#' +#' @return If \code{raw = FALSE}, a list containing +#' \itemize{ +#' \item \code{offset} a list with plot information for the offset. +#' \item \code{smterms} a named list with one entry for each smooth term in the model. +#' Each entry contains +#' \itemize{ +#' \item \code{x, y, z} the unique grid-points used to evaluate the smooth/coefficient function/coefficient surface +#' \item \code{xlim, ylim, zlim} the extent of the x/y/z-axes +#' \item \code{xlab, ylab, zlab} the names of the covariates for the x/y/z-axes +#' \item \code{value} a vector/matrix/list of matrices containing the coefficient values +#' \item \code{dim} the dimensionality of the effect +#' \item \code{main} the label of the smooth term (a short label) +#' }} +#' If \code{raw = TRUE}, a list containing the estimated spline coefficients. +#' +#' @method coef FDboost +#' +#' @details If \code{raw = FALSE} the function \code{coef.FDboost} generates adequate dummy data +#' and uses the function \code{predict.FDboost} to +#' compute the estimated coefficient functions. +#' +#' @export +### similar to coef.pffr() by Fabian Scheipl in package refund +coef.FDboost <- function(object, raw = FALSE, which = NULL, + computeCoef = TRUE, returnData = FALSE, + n1 = 40, n2 = 40, n3 = 20, n4 = 10, ...){ + + if(raw){ + return(object$coef(which = which)) + } else { + + # delete an extra 0 in which as the offset is always returned + if( length(which) > 1 && 0 %in% which) which <- which[which!=0] + + # List to be returned + ret <- list() + + ## offset as first element + ret$offset$x <- seq( min(object$yind), max(object$yind), l=n1) + ret$offset$xlab <- attr(object$yind, "nameyind") + ret$offset$xlim <- range(object$yind) + ret$offset$value <- object$predictOffset(ret$offset$x) + if(length(ret$offset$value)==1) ret$offset$value <- rep(ret$offset$value, n1) + ret$offset$dim <- 1 + ret$offset$main <- "offset" + + # For the special case of which=0, only return the coefficients of the offset + if(!is.null(which) && length(which)==1 && which==0){ + if(computeCoef){ + return(ret) + }else{ + return("offset") + } + } + + if(is.null(which)) which <- seq_along(object$baselearner) + + ## special case of ~1 intercept specification with scalar response + if( inherits(object, "FDboostScalar") && + any(which == 1) && + length(object$coef(which = 1)[[1]]) == 1 ){ + ret$intercept <- object$coef(which = 1)[[1]] + which <- which[which != 1] + if(length(which) == 0) return(ret) + } + + getCoefs <- function(i){ + ## this constructs a grid over the range of the covariates + ## and returns estimated values on this grid, with + ## by-variables set to 1 + ## cf. mgcv:::plots.R (plot.mgcv.smooth etc..) for original code + + safeRange <- function(x){ + if(is.factor(x)) return(c(NA, NA)) + return(range(x, na.rm=TRUE)) + } + + makeDataGrid <- function(trm){ + + myargsHist <- NULL + x <- y <- z <- NULL + + # variable for number of levels in bl2 for an effect bl1 %X% bl2 + numberLevels <- 1 + + ### generate data in the case of an bhistx()-bl + if(grepl("bhistx", trm$get_call(), fixed = TRUE)){ + ng <- n2 + # get hmatrix-object + position_hmatrix <- which(sapply(trm$model.frame(), is.hmatrix)) + object_hmatrix <- trm$model.frame()[[position_hmatrix]] + svals <- getArgvals(object_hmatrix) + svals <- seq(min(svals), max(svals), length = ng) + tvals <- getTime(object_hmatrix) + tvals <- seq(min(tvals), max(tvals), length = ng) + tvals <- rep(tvals, each = ng) + + if( grepl("%X", trm$get_call(), fixed = TRUE) ){ + split_bl <- strsplit(trm$get_call(), split = "%.{1,3}%")[[1]] + ## save the position of bhistx() + position_bhistx <- grep("bhistx", split_bl, fixed = TRUE) + + if(length(split_bl) == 2){ # one %X% + if(position_bhistx == 1){ + myargsHist <- environment(environment(trm$dpp)$Xfun)$args1 + }else{ + myargsHist <- environment(environment(trm$dpp)$Xfun)$args2 + } + }else{ # two ore more %X% (currently only works for two) + if(position_bhistx == 1){ + myargsHist <- environment(environment(environment( + environment(trm$dpp)$Xfun)$bl1$dpp)$Xfun)$args1 + if(is.null(myargsHist)) myargsHist <- environment(environment(trm$dpp)$Xfun)$args1 + }else{ + if(position_bhistx == 2){ + myargsHist <- environment(environment(environment( + environment(trm$dpp)$Xfun)$bl1$dpp)$Xfun)$args2 + }else{ ## position_bhistx == 3 + myargsHist <- environment(environment(environment(trm$dpp)$Xfun)$bl2$dpp)$args + } + } + } + }else{ + myargsHist <- environment(trm$dpp)$args + } + + ## use the same function for the numerical integration weights as in the model call + intFun <- myargsHist$intFun + + ## should only occur for more than two %X% + if(is.null(intFun)){ + intFun <- integrationWeightsLeft + warning("As integration function 'integrationWeightsLeft()' is used,", + " which is the default in bhistx().") + } + + ## generate a dummy functional variable I / integration weights + dummyX <- I(diag(ng)) / intFun(diag(ng), svals) + + temph <- hmatrix(time = tvals, id = rep(1:ng, ng), x = dummyX, argvals = svals) + + d <- data.frame(z = I(temph)) + names(d) <- trm$get_names()[position_hmatrix] + d[[ getTimeLab(object_hmatrix) ]] <- tvals + + attr(d, "varnms") <- c(getArgvalsLab(object_hmatrix), getTimeLab(object_hmatrix)) + attr(d, "xm") <- seq(min(svals), max(svals), length = ng) + attr(d, "ym") <- seq(min(tvals), max(tvals), length = ng) + + ## for a tensor product term: add the scalar factors to d + if( grepl("%X", trm$get_call(), fixed = TRUE) ){ + if(position_hmatrix == 1){ + position_z <- 2 + }else{ + position_z <- 1 + } + z <- trm$model.frame()[[trm$get_names()[position_z]]] + if(is.factor(z)) { + numberLevels <- length(unique(unique(z))) + zg <- sort(unique(z))[1] #sort(unique(z)) # use first possibility + }else{ + zg <- 1 # use z=1 as neutral possibility + } + + d[[ trm$get_names()[position_z] ]] <- zg + attr(d, "varnms") <- c(getArgvalsLab(object_hmatrix), + getTimeLab(object_hmatrix), trm$get_names()[position_z]) + attr(d, "zm") <- zg + + ## add second factor variable to the dataset if necessary, because of two %X% + z1 <- NULL + if(length(trm$get_names()) > 2){ + position_z1 <- (1:3)[!(1:3) %in% c(position_hmatrix, position_z)] + z1 <- trm$model.frame()[[trm$get_names()[position_z1]]] + if(is.factor(z1)) { + ## multiply the number of levels of both factors + numberLevels <- numberLevels * length(unique(unique(z1))) + z1g <- sort(unique(z1))[1] + }else{ + z1g <- 1 # use z1=1 as neutral possibility + } + + d[[ trm$get_names()[position_z1] ]] <- z1g + attr(d, "varnms") <- c(getArgvalsLab(object_hmatrix), getTimeLab(object_hmatrix), + trm$get_names()[position_z], trm$get_names()[position_z1]) + attr(d, "z1m") <- z1g + } + + ## make a list of data-frames with all combinations + if(numberLevels > 1){ + + dlist <- vector("list", numberLevels) + zlevels <- sort(unique(z)) ## sort(unique(z1)) + + ## loop over all factor combinations + if(is.null(z1)){ # one %X%' + dlist[[1]] <- d + for(j in 1:numberLevels){ + d[[ trm$get_names()[position_z] ]] <- zlevels[j] # use j-th factor level + attr(d, "add_main") <- paste0(trm$get_names()[position_z], "=", zlevels[j]) + dlist[[j]] <- d + } + }else{ # two %X% + z1levels <- sort(unique(z1)) + temp_d <- 1 + for(j in seq_along(zlevels)){ # loop over z + d[[ trm$get_names()[position_z] ]] <- zlevels[j] # use j-th factor level of z + for(k in seq_along(z1levels)){ # loop over z + d[[ trm$get_names()[position_z1] ]] <- z1levels[k] # use k-th factor level of z1 + attr(d, "add_main") <- paste0(trm$get_names()[position_z], "=", zlevels[j], ", ", + trm$get_names()[position_z1], "=", z1levels[k]) + dlist[[temp_d]] <- d + temp_d <- temp_d + 1 + } + + } + } # end else !is.null(z1) + d <- dlist ## give back the list of data.frames + attr(d, "numberLevels") <- numberLevels + } ## end if(numberLevels > 1) + + #attr(d, "limits") <- limits + #attr(d, "stand") <- stand + + } + + attr(d, "myargsHist") <- myargsHist + + ## test <- predict(object, newdata=d, which=2) + return(d) + } + + ################################################ + ### look at cases without bhistx() + varnms <- trm$get_names() + yListPlace <- NULL + zListPlace <- NULL + + if(trm$dim == 1) ng <- n1 + if(trm$dim == 2) ng <- n2 + if(trm$dim == 3) ng <- n3 + if(trm$dim > 3) ng <- n4 + + # generate grid of values in range of original data + if(trm$dim == 1){ + varnms <- varnms[!varnms %in% c("ONEx", "ONEtime")] + # Extra setup of dataframe in the case of a functional covariate + if(!is.null(attr(trm$model.frame()[[1]], "signalIndex"))){ # functional covariate + x <- attr(trm$model.frame()[[1]], "signalIndex") + xg <- seq(min(x), max(x),length = ng) + varnms[1] <- attr(trm$model.frame()[[1]], "indname") + }else{ # scalar covariate + x <- trm$model.frame()[[varnms]] + xg <- if(is.factor(x)) { + sort(unique(x)) + } else seq(min(x), max(x), length = ng) + } + d <- list(xg) # data.fame + names(d) <- varnms + attr(d, "xm") <- xg + attr(d, "varnms") <- varnms + # For effect constant over index of response: add dummy-index so that length in clear + if(attr(object$yind, "nameyind") != varnms){ + d[[attr(object$yind, "nameyind")]] <- seq(min(object$yind), max(object$yind), length=ng) + } + } + + if(trm$dim > 1){ + #ng <- ifelse(trm$dim == 2, n2, n3) + + ### get variables for x, y and eventually z direction + + ## x (first variable) + if(!is.null(attr(trm$model.frame()[[1]], "signalIndex"))){ # functional covariate + x <- attr(trm$model.frame()[[1]], "signalIndex") + xg <- seq(min(x), max(x), length = ng) + varnms[1] <- attr(trm$model.frame()[[1]], "indname") + }else{ # scalar covariate + x <- trm$model.frame()[[1]] + xg <- if(is.factor(x)) { + sort(unique(x)) + } else seq(min(x), max(x),length = ng) + } + + if(trm$dim == 2){ + + if(inherits(object, "FDboostScalar")){ ### scalar response + position_time <- 2 + y <- yg <- 1 + varnms <- c(varnms[1], "ONEtime", varnms[2]) + if(!is.null(attr(trm$model.frame()[[2]], "signalIndex"))){ # functional covariate + z <- attr(trm$model.frame()[[2]], "signalIndex") + zg <- seq(min(z), max(z), length = ng) + varnms[2] <- attr(trm$model.frame()[[2]], "indname") + }else{ # scalar covariate + z <- trm$model.frame()[[2]] + zg <- if(is.factor(z)) { + sort(unique(z)) + } else seq(min(z), max(z), length = ng) + } + + d <- list(xg, yg, zg) # data.frame + attr(d, "xm") <- xg + attr(d, "ym") <- yg + attr(d, "zg") <- zg + attr(d, "varnms") <- varnms + + }else{ ### functional response + + ## not bhist + if( ! grepl("bhist", trm$get_call(), fixed = TRUE) ){ + + ## y (time variable, usually second variable) + ## important in case of by-variables, then yind is third variable + position_time <- which(varnms == attr(object$yind, "nameyind")) + y <- trm$model.frame()[[position_time]] + yg <- seq(min(y), max(y), length = ng) + + + if(length(varnms) > 2){ + + ## by-variable in base-learner + position_z <- (1:3)[!(1:3) %in% c(1, position_time)] + z <- trm$model.frame()[[position_z]] + zg <- if(is.factor(z)) { + sort(unique(z))[1] + }else{ + 1 + # if(grepl("by", trm$get_call())){ 1 }else{ seq(min(z), max(z), length = n4) } + } + varnms <- varnms[c(1, position_time, position_z)] + + d <- list(xg, yg, zg) # data.frame + attr(d, "xm") <- xg + attr(d, "ym") <- yg + attr(d, "zm") <- zg + + }else{ + varnms <- varnms[c(1, position_time)] + + d <- list(xg, yg) # data.frame + attr(d, "xm") <- xg + attr(d, "ym") <- yg + } + + }else{ ## special case: bhist in base-learner + + y <- object$yind ## attr(trm$model.frame()[[1]], "indexY") + yg <- seq(min(y), max(y), length = ng) + # varnms[2] <- attr(object$yind, "nameyind") ## attr(trm$model.frame()[[1]], "indnameY") + # if(varnms[1]==varnms[2]) varnms[1] <- paste(varnms[2], "_cov", sep="") + if(attr(object$yind, "nameyind") != attr(trm$model.frame()[[1]], "indnameY")){ + stop("coef.FDboost works for bhist only if time variable is the same in timeformula and bhist.") + } + + varnms <- c(varnms[1], attr(object$yind, "nameyind")) + + d <- list(xg, yg) # data.frame + attr(d, "xm") <- xg + attr(d, "ym") <- yg + + myargsHist <- environment(trm$dpp)$args + attr(d, "myargsHist") <- myargsHist + + } + + } + + }else{ # else for if(trm$dim == 2) + + ## plot.FDboost expects that y-variable is yind-varible (time of response) + ## change econd and third variable - the third variable is usually yind + which(varnms == attr(object$yind, "nameyind")) + + ## y (third variable, usually time) + if(!is.null(attr(trm$model.frame()[[3]], "signalIndex"))){ # functional covariate + y <- attr(trm$model.frame()[[3]], "signalIndex") + yg <- seq(min(y), max(y), length = ng) + varnms[3] <- attr(trm$model.frame()[[3]], "indname") + }else{ # scalar covariate + y <- trm$model.frame()[[3]] + yg <- if(is.factor(y)) { + sort(unique(y)) + } else seq(min(y), max(y),length = ng) + } + + ## z (second variable) + if(!is.null(attr(trm$model.frame()[[2]], "signalIndex"))){ # functional covariate + z <- attr(trm$model.frame()[[2]], "signalIndex") + zg <- seq(min(z), max(z), length = ng) + varnms[2] <- attr(trm$model.frame()[[2]], "indname") + }else{ # scalar covariate + z <- trm$model.frame()[[2]] + zg <- if(is.factor(z)) { + sort(unique(z)) + } else seq(min(z), max(z),length = ng) + } + + d <- list(xg, yg, zg) + attr(d, "xm") <- d[[1]] + attr(d, "ym") <- d[[2]] + attr(d, "zm") <- d[[3]] + varnms <- varnms[c(1,3,2)] + } + + names(d) <- varnms + attr(d, "varnms") <- varnms + + } + + + ## add dummy signal to data for bsignal() + if (grepl("bsignal|bfpc", trm$get_call())) { + + position_signal <- which(sapply(trm$model.frame(), + function(x) !is.null(attr(x, "signalIndex")) )) + + d[[ trm$get_names()[position_signal] ]] <- I(diag(ng) / + integrationWeights(diag(ng), d[[position_signal]] )) + } + ## is this above dummy-matrix correct for bfpc? + + ## add dummy signal to data for bhist() + ## standardisation weights depending on t must be multiplied to the final \beta(s,t) + ## as they cannot be included into the variable x(s) + ## use intFun() to compute the integration weights + # ls(environment(trm$dpp)) + if(grepl("bhist", trm$get_call(), fixed = TRUE) ){ + ## temp <- I(diag(ng)/integrationWeightsLeft(diag(ng), d[[varnms[1]]])) + ## use intFun() of the bl to compute the integration weights + temp <- environment(trm$dpp)$args$intFun(diag(ng), d[[attr(object$yind, "nameyind")]]) + d[[attr(trm$model.frame()[[1]], "xname")]] <- I(diag(ng)/temp) + limits <- myargsHist$limits + stand <- myargsHist$stand + attr(d, "limits") <- limits + attr(d, "stand") <- stand + } + + ## add dummy signal to data for bconcurrent() + if(grepl("bconcurrent", trm$get_call(), fixed = TRUE)){ + d[[ trm$get_names()[1] ]] <- I(matrix(rep(1.0, ng^2), ncol=ng)) + } + + if(trm$get_vary() != ""){ + d$by <- 1 + colnames(d) <- c(head(colnames(d),-1), trm$get_vary()) + } + + # set time-variable to 1, if response is a scalar + if(length(object$yind) == 1){ + if( !is.null(attr(d, "zm")) && all(attr(d, "zm") == d[[attr(object$yind, "nameyind")]]) ){ + attr(d, "zm") <- 1 + } + d[[attr(object$yind, "nameyind")]] <- 1 + } + + + # if %X% was used in combination with factor variables make a list of data-frames + if(!inherits(object, "FDboostLong") && grepl("%X", trm$get_call(), fixed = TRUE)){ + dlist <- NULL + + ## if %X% was used in combination with factor variables make a list of data-frames + if(is.factor(x) && is.factor(z)){ ## both variables are factors + numberLevels <- nlevels(x) * nlevels(z) + xlevels <- sort(unique(x)) + zlevels <- sort(unique(z)) + + dlist <- vector("list", numberLevels) + temp_d <- 1 + for(j in seq_along(xlevels)){ # loop over x + d[[1]] <- xlevels[j] # use j-th factor level of x + for(k in seq_along(zlevels)){ # loop over z + d[[3]] <- zlevels[k] # use k-th factor level of z + attr(d, "xm") <- d[[1]] + attr(d, "zm") <- d[[3]] + attr(d, "add_main") <- paste0(names(d)[1], "=", xlevels[j], ", ", + names(d)[3], "=", zlevels[k]) + dlist[[temp_d]] <- d + temp_d <- temp_d + 1 + } + } + }else{ + if(is.factor(z)){ ## only second variable is a factor + numberLevels <- nlevels(z) + zlevels <- sort(unique(z)) + dlist <- vector("list", numberLevels) + for(j in seq_along(zlevels)){ # loop over z + d[[3]] <- rep(zlevels[j], length(d[[1]])) # use j-th factor level of z + attr(d, "zm") <- d[[3]] + attr(d, "add_main") <- paste0(names(d)[3], "=", zlevels[j]) + dlist[[j]] <- d + } + }else{ + if(is.factor(x)){ ## only first variable is a factor + numberLevels <- nlevels(x) + xlevels <- sort(unique(x)) + dlist <- vector("list", numberLevels) + for(j in seq_along(xlevels)){ # loop over x + d[[1]] <- rep(xlevels[j], length(d[[3]])) # use j-th factor level of x + attr(d, "xm") <- d[[1]] + attr(d, "add_main") <- paste0(names(d)[1], "=", xlevels[j]) + dlist[[j]] <- d + } + }else{ ## both variables are metric + # allow something more flexible, depending on bolsc / bbsc? + ## trm$get_call() + numberLevels <- n4 + zlevels <- seq(min(z), max(z), l = n4) + dlist <- vector("list", numberLevels) + for(j in seq_along(zlevels)){ # loop over x + d[[3]] <- rep(zlevels[j], length(d[[1]])) # use j-th quantile of x + attr(d, "zm") <- d[[1]] + attr(d, "add_main") <- paste0(names(d)[3], "=", round(zlevels[j], 2)) + dlist[[j]] <- d + } + } + } + } + + if(!is.null(dlist)) d <- dlist + attr(d, "numberLevels") <- numberLevels + } ## end if(grepl("%X", trm$get_call())) + + return(d) + } ## end of function makeDataGrid() + + getP <- function(trm, d, myargs = NULL){ + #return an object similar to what plot.mgcv.smooth etc. returns + if(trm$dim == 1){ + predHelp <- predict(object, which=i, newdata=d) + if(!is.matrix(predHelp)){ + X <- predHelp + }else{ + X <- if(any(trm$get_names() %in% "ONEtime") || + inherits(object, "FDboostScalar")){ # effect constant in t + predHelp[,1] + }else{ + predHelp[1,] # smooth intercept/ concurrent effect + } + } + P <- list(x=attr(d, "xm"), xlab=attr(d, "varnms")[1], xlim=safeRange(attr(d, "xm"))) + ## trm$dim > 1 + }else{ + varnms <- attr(d, "varnms") + if(trm$dim == 2){ + X <- predict(object, newdata=d, which=i) + attr(X, "offset") <- NULL + vecStand <- NULL + + ## for bhist(), multiply with standardisation weights if necessary + ## you need the args$vecStand from the prediction of X, constructed here + if(grepl("bhist", trm$get_call(), fixed = TRUE)){ + myargsHist <- myargs ## use the args found in makeDataGrid() + + ## this should only occur for more than two %X% + if(is.null(myargsHist$stand)){ + warning("No standardization is used, i.e. stand = 'no',", + " which is the default in bhistx().", + "As intFun() integrationWeightsLeft() is used. ", + "No limits are used.") + myargsHist$stand <- "no" + myargsHist$intFun <- integrationWeightsLeft + myargsHist$limits <- function(s, t){ + (s <= t) | (t <=s) + } + } + + if(myargsHist$stand %in% c("length","time")){ + Lnew <- myargsHist$intFun(diag(length(attr(d, "ym"))), attr(d, "ym") ) + ## Standardize with exact length of integration interval + ## (1/t-t0) \int_{t0}^t f(s) ds + if(myargsHist$stand == "length"){ + ind0 <- !t(outer( attr(d, "ym"), attr(d, "xm"), myargsHist$limits) ) + Lnew[ind0] <- 0 + ## integration weights in s-direction always sum exactly to 1, + vecStand <- rowSums(Lnew) + } + ## use time of current observation for standardization + ## (1/t) \int_{t0}^t f(s) ds + if(myargsHist$stand == "time"){ + yindHelp <- attr(d, "ym") + yindHelp[yindHelp == 0] <- Lnew[1,1] + vecStand <- yindHelp + } + X <- t(t(X)*vecStand) + } + } ## end stand for bhist / bhistx + + P <- list(x=attr(d, "xm"), y=attr(d, "ym"), xlab=varnms[1], ylab=varnms[2], + ylim=safeRange(attr(d, "ym")), xlim=safeRange(attr(d, "xm")), + z=attr(d, "zm"), zlab=varnms[3], vecStand=vecStand) + + ## include the second scalar covariate called z1 into the output + if( grepl("bhistx", trm$get_call(), fixed = TRUE) && length(trm$get_names()) > 2){ + extra_output <- list(z1=attr(d, "z1m"), z1lab=varnms[4]) + P <- c(P, extra_output) + } + + ## save the arguments of stand and limits as part of returned object + if(grepl("bhist", trm$get_call(), fixed = TRUE)){ + P$stand <- myargsHist$stand + P$limits <- myargsHist$limits + } + + }else{ + if(trm$dim==3){ + values3 <- seq(min(d[[varnms[3]]]), max(d[[varnms[3]]]), l=n4) + xygrid <- expand.grid(d[[varnms[1]]], d[[varnms[2]]] ) + X <- lapply(values3, function(x){ + d1 <- list(xygrid[,1], xygrid[,2], x) + names(d1) <- varnms + matrix(predict(object, newdata=d1, which=i), ncol=length(d[[varnms[1]]])) + }) + P <- list(x=attr(d, "xm"), y=attr(d, "ym"), z=values3, + xlab=varnms[1], ylab=varnms[2], zlab=varnms[3], + ylim=safeRange(attr(d, "ym")), xlim=safeRange(attr(d, "xm")), zlim=safeRange(attr(d, "zm"))) + } + } + } + if(!is.null(object$ydim)){ + P$value <- X + }else{ + #### is dimension, byrow correct?? + P$value <- matrix(X, nrow=length(attr(d, "xm")) ) + } + #P$coef <- cbind(d, "value"=P$value) + P$dim <- trm$dim + P$main <- shrtlbls[i] + P$add_main <- attr(d, "add_main") + return(P) + } ## end of function getP() + + trm <- object$baselearner[[i]] + trm$dim <- length(trm$get_names()) + if(any(grepl("ONE(x|time)", trm$get_names()))) trm$dim <- trm$dim - 1 + + ### give error for bl1 %X% bl2 %X% bl3 + #if( grepl("bhistx", trm$get_call()) & trm$dim > 2){ + # stop("coef.FDboost() does not work for tensor products %X% with more than two base-learners.") + #} + + ## add 1 to dimension of bhist and bhistx, otherwise dim is only 1 + if( grepl("bhist", trm$get_call(), fixed = TRUE) ){ + trm$dim <- trm$dim + 1 + } + + # If a by-variable was specified, reduce number of dimensions + # as smooth linear effect in several groups can be plotted in one plot + if( grepl("by =", trm$get_call(), fixed = TRUE) && grepl("bols", trm$get_call(), fixed = TRUE) || + grepl("by =", trm$get_call(), fixed = TRUE) && grepl("bbs", trm$get_call(), fixed = TRUE) ) trm$dim <- trm$dim - 1 + + # what to do with bbs(..., by=factor)? + + if(trm$dim > 3 && !grepl("bhistx", trm$get_call(), fixed = TRUE) ){ + warning("Can't deal with smooths with more than 3 dimensions, returning NULL for ", + shrtlbls[i], ".") + return(NULL) + } + + d <- makeDataGrid(trm) + + ### better solution for %X% in base-learner!!! + if(!is.null(object$ydim) && any(grepl("%X", trm$get_call(), fixed = TRUE)) + && !any(grepl("bhistx", trm$get_call(), fixed = TRUE)) ) trm$dim <- trm$dim - 1 + + ## it is necessary to expand the dataframe! + if(!grepl("bhistx(", trm$get_call(), fixed=TRUE) && + inherits(object, "FDboostLong") && !grepl("bconcurrent", trm$get_call(), fixed = TRUE)){ + #print(attr(d, "varnms")) + vari <- names(d)[1] + if(is.factor(d[[vari]])){ + d[[vari]] <- d[[vari]][ rep(seq_len(NROW(d[[vari]])), times=length(d[[attr(object$yind ,"nameyind")]]) ) ] + if(trm$dim>1) d[[attr(object$yind ,"nameyind")]] <- rep(d[[attr(object$yind ,"nameyind")]], + each=length(unique(d[[vari]])) ) + }else{ + # expand signal variable + if (grepl("bhist\\(|bsignal|bfpc", trm$get_call())) { + vari <- names(d)[!names(d) %in% attr(d, "varnms")] + d[[vari]] <- d[[vari]][ rep(seq_len(NROW(d[[vari]])), times=NROW(d[[vari]])), ] + + }else{ # expand scalar variable + vari <- names(d)[1] + if(vari!=attr(object$yind ,"nameyind")) d[[vari]] <- d[[vari]][ rep(seq_len(NROW(d[[vari]])), times=NROW(d[[vari]])) ] + } + # expand yind + if(trm$dim>1) d[[attr(object$yind ,"nameyind")]] <- rep(d[[attr(object$yind ,"nameyind")]], + each=length(d[[attr(object$yind ,"nameyind")]])) + } + } + + ###### just return the data, that is used for the prediction + if(returnData){ + if(grepl("bhist", trm$get_call(), fixed = TRUE)){ + message("If argument stand is specified !=\"no\", the standardization will be part of the predicted coefficient.") + } + return(d) + } + + if( !is.null(attr(d, "numberLevels")) && attr(d, "numberLevels") > 1){ + if( grepl("bhistx", trm$get_call(), fixed = TRUE) ) trm$dim <- 2 + ## get smooth coefficient estimates for several factor levels + # P <- getP(d[[1]], trm = trm, myargs = attr(d, "myargsHist")) + P <- lapply(d, getP, trm = trm, myargs = attr(d, "myargsHist")) + P$numberLevels <- attr(d, "numberLevels") + }else{ + ## get smooth coefficient estimates + P <- getP(trm, d, myargs = attr(d, "myargsHist")) + } + + # get proper labeling + P$main <- shrtlbls[i] + + return(P) + } # end of function getCoefs() + + + ## Function to obtain nice short names for labeling of plots + shortnames <- function(x){ + if(substr(x,1,1)=="\"") x <- substr(x, 2, nchar(x)-1) + + ## split at expressions %.% with 1 to 3 characters between % and % + xpart <- unlist(strsplit(x, split = "%.{1,3}%")) + ## find the expressions at which the split is done + operator <- gregexpr(pattern = "%.{1,3}%", text = x)[[1]] + operator <- sapply(seq_along(operator), + function(i) substr(x, operator[i], operator[i] + attr(operator, "match.length")[i] -1 ) ) + + for(i in seq_along(xpart)){ + xpart[i] <- gsub(pattern = "\\\"", replacement = "", x = xpart[i], fixed=TRUE) + xpart[i] <- gsub(pattern = "\\", replacement = "", x = xpart[i], fixed=TRUE) + nvar <- length(all.vars(formula(paste("Y~", xpart[i])))[-1]) + commaSep <- unlist(strsplit(xpart[i], ",", fixed = TRUE)) + + # shorten the name to first variable and delete x= if present + if(grepl("=", commaSep[1], fixed = TRUE)){ + temp <- unlist(strsplit(commaSep[1], "=", fixed = TRUE)) + temp[1] <- unlist(strsplit(temp[1], "(", fixed=TRUE))[1] + if(substr(temp[2], 1, 1)==" ") temp[2] <- substr(temp[2], 2, nchar(temp[2])) + if(length(commaSep) == 1){ + xpart[i] <- paste0(temp[1], "(", temp[2]) + }else{ + xpart[i] <- paste0(temp[1], "(", temp[2], ")") + } + }else{ + if(length(commaSep) > 1){ xpart[i] <- paste0(commaSep[1], ")")} + } + #xpart[i] <- if(length(commaSep)==1){ + # paste(paste(commaSep[1:nvar], collapse=","), sep="") + #}else paste(paste(commaSep[1:nvar], collapse=","), ")", sep="") + #if(substr(xpart[i], nchar(xpart[i])-2, nchar(xpart[i])-1)==") "){ + # xpart[i] <- substr(xpart[i], 1, nchar(xpart[i])-2) + #} + } + ret <- xpart + if(length(xpart)>1) ret <- paste(xpart, collapse=paste("", operator)) + if(length(xpart)>1){ + ## name is connatecated with the scheme bl1 %.% bl2 %.% bl3 + temp <- rep(NA, length(xpart) + length(operator)) + temp[seq(1, by=2, length.out = length(xpart))] <- xpart + temp[seq(2, by=2, length.out = length(operator))] <- paste("", operator) + ret <- paste(temp, collapse="") + } + ret + } + + ## short names for the terms, if shortnames() does not work, use the original names + shrtlbls <- try(unlist(lapply(names(object$baselearner), shortnames))) + if(inherits(shrtlbls, "try-error")) shrtlbls <- names(object$baselearner) + + ###### just return the data that is used for the prediction + if(returnData){ + ret <- list() + ret <- lapply(which, getCoefs) + if(length(which)==1) ret <- ret[[1]] # unlist for only one effect + return(ret) + } + + if(computeCoef){ + ### smooth terms + ret$smterms <- lapply(which, getCoefs) + names(ret$smterms) <- sapply(seq_along(ret$smterms), function(i){ + ret$smterms[[i]]$main + }) + return(ret) + }else{ + return(shrtlbls[which]) + } + } +} + + +# help function to color perspective plots - col1 positive values, col2 negative values +getColPersp <- function(z, col1 = "tomato", col2 = "lightblue"){ + nrz <- nrow(z) + ncz <- ncol(z) + + # Compute the z-value at the facet centres + zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz] + + # use the colors col1 and col2 for negative and positive values + colfacet <- matrix(nrow=nrow(zfacet), ncol=ncol(zfacet)) + colfacet[zfacet < 0] <- col2 + colfacet[zfacet > 0] <- col1 + colfacet[zfacet == 0] <- "white" + + return(colfacet) +} + + +#' Plot the fit or the coefficients of a boosted functional regression model +#' +#' Takes a fitted \code{FDboost}-object produced by \code{\link{FDboost}()} and +#' plots the fitted effects or the coefficient-functions/surfaces. +#' +#' @param x a fitted \code{FDboost}-object +#' @param raw logical defaults to \code{FALSE}. +#' If \code{raw = FALSE} for each effect the estimated function/surface is calculated. +#' If \code{raw = TRUE} the coefficients of the model are returned. +#' @param rug when \code{TRUE} (default) then the covariate to which the plot applies is +#' displayed as a rug plot at the foot of each plot of a 1-d smooth, +#' and the locations of the covariates are plotted as points on the contour plot +#' representing a 2-d smooth. +#' @param which a subset of base-learners to take into account for plotting. +#' @param includeOffset logical, defaults to \code{TRUE}. Should the offset be included in +#' the plot of the intercept (default) or should it be plotted separately. +#' @param ask logical, defaults to \code{TRUE}, if several effects are plotted the user +#' has to hit Return to see next plot. +#' @param n1 see below +#' @param n2 see below +#' @param n3 n1, n2, n3 give the number of grid-points for 1-/2-/3-dimensional +#' smooth terms used in the marginal equidistant grids over the range of the +#' covariates at which the estimated effects are evaluated. +#' @param n4 gives the number of points for the third dimension in a 3-dimensional smooth term +#' @param onlySelected, logical, defaults to \code{TRUE}. Only plot effects that where +#' selected in at least one boosting iteration. +#' @param pers logical, defaults to \code{FALSE}, +#' If \code{TRUE}, perspective plots (\code{\link[graphics]{persp}}) for +#' 2- and 3-dimensional effects are drawn. +#' If \code{FALSE}, image/contour-plots (\code{\link[graphics]{image}}, +#' \code{\link[graphics]{contour}}) are drawn for 2- and 3-dimensional effects. +#' @param commonRange logical, defaults to \code{FALSE}, +#' if \code{TRUE} the range over all effects is the same +#' (does not affect perspecitve or image plots). +#' +#' @param subset subset of the observed response curves and their predictions that is plotted. +#' Per default all observations are plotted. +#' @param posLegend location of the legend, if a legend is drawn automatically +#' (only used in plotPredicted). The default is "topleft". +#' @param lwdObs lwd of observed curves (only used in plotPredicted) +#' @param lwdPred lwd of predicted curves (only used in plotPredicted) +#' @param ... other arguments, passed to \code{funplot} (only used in plotPredicted) +#' +#' @aliases plotPredicted plotResiduals +#' +#' @seealso \code{\link{FDboost}} for the model fit and +#' \code{\link{coef.FDboost}} for the calculation of the coefficient functions. +#' @return no return value (plot method) +#' @method plot FDboost +#' @export +### function to plot raw values or coefficient-functions/surfaces of a model +plot.FDboost <- function(x, raw = FALSE, rug = TRUE, which = NULL, + includeOffset = TRUE, ask = TRUE, + n1 = 40, n2 = 40, n3 = 20, n4 = 11, + onlySelected = TRUE, pers = FALSE, commonRange = FALSE, ...){ + + oldpar <- par(no.readonly = TRUE) + on.exit(par(oldpar)) + + ### Get further arguments passed to the different plot-functions + dots <- list(...) + + getArguments <- function(x, dots=dots){ + if(any(names(dots) %in% names(x))){ + dots[names(dots) %in% names(x)] + }else list() + } + + #argsPlot <- getArguments(x=formals(graphics::plot.default), dots=dots) + argsPlot <- getArguments(x=c(formals(graphics::plot.default), par()), dots=dots) + argsMatplot <- getArguments(x=c(formals(graphics::matplot), par(), + formals(graphics::plot.default)), dots=dots) + argsFunplot <- getArguments(x=c(formals(funplot), par(), + formals(graphics::plot.default)), dots=dots) + + argsImage <- getArguments(x=c(formals(graphics::plot.default), + formals(graphics::image.default)), dots=dots) + dotsContour <- dots + dotsContour$col <- "black" + argsContour <- getArguments(x=formals(graphics::contour.default), dots=dotsContour) + argsPersp <- getArguments(x=formals(getS3method("persp", "default")), dots=dots) + + plotWithArgs <- function(plotFun, args, myargs){ + args <- c(myargs[!names(myargs) %in% names(args)], args) + do.call(plotFun, args) + } + + ### get the effects to be plotted + whichSpecified <- which + if(is.null(which)) which <- seq_along(x$baselearner) + + if(onlySelected){ + which <- intersect(which, c(0, selected(x))) + } + + # In the case that intercept and offset should be plotted and the intercept was never selected + # plot the offset + if( (1 %in% whichSpecified || is.null(whichSpecified)) + && ! 1 %in% which && length(x$yind) > 1) which <- c(0, which) + + if(length(which) == 0){ + warning("Nothing selected for plotting.") + return(NULL) + } + + ### plot coefficients of model (smooth curves and surfaces) + if(!raw){ + + # compute the coefficients of the smooth terms that should be plotted + coefMod <- coef(x, which=which, n1=n1, n2=n2, n3=n3, n4=n4) + terms <- coefMod$smterms + offsetTerms <- coefMod$offset + bl_data <- lapply(x$baselearner[which], function(x) x[["get_data"]]()) + + # plot nothing but the offset + if(length(which) == 1 && which == 0){ + terms <- list(offsetTerms) + bl_data <- c(offset = list( list(x$yind) ), bl_data) + names(bl_data[[1]]) <- attr(x$yind, "nameyind") + } + + # include the offset in the plot of the intercept + # if the first entry in which is 1 and the model contains an intercept + if(includeOffset && which[1] == 1 && x$withIntercept){ + terms[[1]]$value <- terms[[1]]$value + matrix(offsetTerms$value, ncol=1, nrow=n1) + terms[[1]]$main <- paste("offset", "+", terms[[1]]$main) + } + + # plot the offset as extra effect + # case 1: the offset should be included as extra plot + # case 2: the whole model is plotted, but the intercept-base-learner was never selected + if( (! includeOffset || (includeOffset && ! 1 %in% which)) && + is.null(whichSpecified) && ! is.null(selected(x))){ + terms <- c(offset = list(offsetTerms), terms) + bl_data <- c(offset = list( list(x$yind) ), bl_data) + names(bl_data[[1]]) <- attr(x$yind, "nameyind") + } + + if((length(terms) > 1 || is.null(terms[[1]]$dim) || terms[[1]]$dim == 3) && ask) par(ask = TRUE) + + if(commonRange){ + range <- range(lapply(terms, function(x) x$value )) + # range[1] <- range[1] - 0.01 * diff(range) + # range[2] <- range[2] + 0.01 * diff(range) + }else range <- NULL + + if(!is.null(dots$ylim)) range <- dots$ylim + + ## trm <- terms[[i]] + myplot <- function(trm, range_i = NULL){ + + if(grepl("bhist", trm$main, fixed = TRUE)){ + # set 0 to NA so that beta only has values in its domain + # get the limits-function + limits <- trm$limits + if(is.null(limits)){ + warning("limits is NULL, the default limits 's<=t' are used for plotting.") + limits <- function(s, t) { + (s < t) | (s == t) + } + } + trm$value[!outer(trm$x, trm$y, limits)] <- NA + } + + # plot for 1-dim effects + if(trm$dim == 1){ + if(length(trm$value) == 1) trm$value <- rep(trm$value, l=length(trm$x)) + + if(!"add" %in% names(dots)){ + plotWithArgs(plot, args=argsPlot, + myargs=list(x=trm$x, y=trm$value, xlab=trm$xlab, main=trm$main, + ylab="coef", type="l", ylim=range_i)) + }else{ + plotWithArgs(lines, args=argsPlot, + myargs=list(x=trm$x, y=trm$value, xlab=trm$xlab, main=trm$main, + ylab="coef", type="l")) + } + + if(rug && !is.factor(x = trm$x)){ + if (grepl("bconcurrent|bsignal|bfpc", trm$main)) { + rug(attr(bl_data[[i]][[1]], "signalIndex"), ticksize = 0.02) + }else rug(bl_data[[i]][[trm$xlab]], ticksize = 0.02) + } + } + + # plot with factor variable + if( (!grepl("bhistx", trm$main, fixed = TRUE)) && trm$dim==2 && + ((is.factor(trm$x) || is.factor(trm$y)) || is.factor(trm$z)) ){ + + ## plot for the special case where factor is plotted in several plots + if(!is.null(trm$add_main)){ + + ## order the terms such that they are plotted with x and y + if(is.factor(trm$x) && !is.factor(trm$z)){ + trm_sort <- trm + trm$x <- trm_sort$z + trm$xlab <- trm_sort$zlab + trm$xlim <- trm_sort$zlim + trm$z <- trm_sort$x + trm$zlab <- trm_sort$xlab + trm$zlim <- trm_sort$xlim + } + + + # effect of two factor variables + if(is.factor(trm$x) && is.factor(trm$z)){ + plotWithArgs(matplot, args=argsMatplot, + myargs=list(x=trm$y, y=t(trm$value), xlab=trm$ylab, main=trm$main, + ylab="coef", type="l", sub=trm$add_main, ylim=range_i)) + if(rug){ + rug(x$yind, ticksize = 0.02) + } + }else{ + + if(pers){ + plotWithArgs(persp, args=argsPersp, + myargs=list(x=trm$x, y=trm$y, z=trm$value, xlab=paste("\n", trm$xlab), + ylab=paste("\n", trm$ylab), zlab=paste("\n", "coef"), + theta=30, phi=30, ticktype="detailed", + zlim=range(trm$value), col=getColPersp(trm$value), + main=trm$main)) + + }else{ + plotWithArgs(image, args=argsImage, + myargs=list(x=trm$y, y=trm$x, z=t(trm$value), xlab=trm$ylab, ylab=trm$xlab, + main=trm$main, col = heat.colors(length(trm$x)^2), + sub=trm$add_main)) + plotWithArgs(contour, args=argsContour, + myargs=list(trm$y, trm$x, z=t(trm$value), add = TRUE), col="black") + + if(rug){ + rug(bl_data[[i]][[trm$xlab]], ticksize = 0.02) + if(is.null(bl_data[[i]][[trm$xlab]])) rug(attr(bl_data[[i]][[1]], "signalIndex"), ticksize = 0.02) + rug(bl_data[[i]][[trm$ylab]], ticksize = 0.02, side=2) + } + } + + } + + }else{ + + if(is.factor(trm$y)){ # effect with by-variable (by-variable is factor) + plotWithArgs(matplot, args=argsMatplot, + myargs=list( x=trm$z, y=t(trm$value), xlab=trm$ylab, main=trm$main, + ylab="coef", type="l", col=as.numeric(trm$y), ylim=range_i ) ) + if(rug){ + #rug(bl_data[[i]][[3]], ticksize = 0.02) + rug(x$yind, ticksize = 0.02) + } + }else{ # effect of factor variable + plotWithArgs(matplot, args=argsMatplot, + myargs=list(x=trm$y, y=t(trm$value), xlab=trm$ylab, main=trm$main, + ylab="coef", type="l", ylim=range_i)) + if(rug){ + #rug(bl_data[[i]][[2]], ticksize = 0.02) + rug(x$yind, ticksize = 0.02) + } + } + } + + + }else{ + # persp-plot for 2-dim effects + if(trm$dim == 2 && pers){ + if(length(unique(as.vector(trm$value)))==1){ + # persp() gives error if only a flat plane should be drawn + plot(y=trm$value[1,], x=trm$x, main=trm$main, type="l", xlab=trm$ylab, + ylab="coef") + }else{ + range <- range(trm$value, na.rm = TRUE) + if(range[1]==range[2]) range <- range(0, range) + zlim <- c(range[1] - 0.05*(range[2] - range[1]), + range[2] + 0.05*(range[2] - range[1])) + plotWithArgs(persp, args=argsPersp, + myargs=list(x=trm$x, y=trm$y, z=trm$value, xlab=paste("\n", trm$xlab), + ylab=paste("\n", trm$ylab), zlab=paste("\n", "coef"), + main=trm$main, theta=30, zlim=zlim, + phi=30, ticktype="detailed", + col=getColPersp(trm$value))) + } + } + # image for 2-dim effects + if(trm$dim == 2 && !pers){ + plotWithArgs(image, args=argsImage, + myargs=list(x=trm$y, y=trm$x, z=t(trm$value), xlab=trm$ylab, ylab=trm$xlab, + main=trm$main, col = heat.colors(length(trm$x)^2))) + plotWithArgs(contour, args=argsContour, + myargs=list(trm$y, trm$x, z=t(trm$value), add = TRUE)) + + if(rug){ + ##points(expand.grid(bl_data[[i]][[1]], bl_data[[i]][[2]])) + if(grepl("bhist", trm$main, fixed = TRUE)){ + rug(x$yind, ticksize = 0.02) + }else{ + ifelse(grepl("by", trm$main, fixed = TRUE) | ( !inherits(x, "FDboostLong") && grepl("%X", trm$main, fixed = TRUE) ) , + rug(bl_data[[i]][[3]], ticksize = 0.02), + rug(bl_data[[i]][[2]], ticksize = 0.02)) + } + ifelse(grepl("bsignal|bfpc|bhist", trm$main), + rug(attr(bl_data[[i]][[1]], "signalIndex"), ticksize = 0.02, side=2), + rug(bl_data[[i]][[1]], ticksize = 0.02, side=2)) + } + } + } + ### 3 dim plots + # persp-plot for 3-dim effects + if(trm$dim == 3 && pers){ + for(j in seq_along(trm$z)){ + plotWithArgs(persp, args=argsPersp, + myargs=list(x=trm$x, y=trm$y, z=trm$value[[j]], xlab=paste("\n", trm$xlab), + ylab=paste("\n", trm$ylab), zlab=paste("\n", "coef"), + theta=30, phi=30, ticktype="detailed", + zlim=range(trm$value), col=getColPersp(trm$value[[j]]), + main= paste0(trm$zlab ,"=", round(trm$z[j],2), ": ", trm$main)) + ) + } + } + # image for 3-dim effects + if(trm$dim == 3 && !pers){ + for(j in seq_along(trm$z)){ + plotWithArgs(image, args=argsImage, + myargs=list(x=trm$x, y=trm$y, z=trm$value[[j]], xlab=trm$xlab, ylab=trm$ylab, + col = heat.colors(length(trm$x)^2), zlim=range(trm$value), + main= paste0(trm$zlab ,"=", round(trm$z[j],2), ": ", trm$main))) + plotWithArgs(contour, args=argsContour, + myargs=list(trm$x, trm$y, trm$value[[j]], xlab=trm$xlab, add = TRUE)) + if(rug){ + points(bl_data[[i]][[1]], bl_data[[i]][[2]]) + } + } + } + + } ## end function myplot() + + for(i in seq_along(terms)){ + + trm <- terms[[i]] + + range_i <- range + if(is.null(range_i)) range_i <- range(terms[[i]]$value, na.rm=TRUE) + + ### call to function myplot() + if(is.null(trm$numberLevels)){ + myplot(trm = trm, range_i = range_i) + }else{ # several levels of bl1 %X% bl2 + lapply(trm[1:trm$numberLevels], myplot, range_i = range_i) + } + + } # end for-loop + + if(length(terms)>1 && ask) par(ask = FALSE) + + ### plot smooth effects as they are estimated for the original data + }else{ + + ################################ + # predict the effects using the original data + terms <- predict(x, which=which) + offset <- attr(terms, "offset") + + # convert matrix into a list, each list entry for one effect + if(is.null(x$ydim) && !is.null(dim(terms))){ + temp <- list() + for(i in seq_len(ncol(terms))){ + temp[[i]] <- terms[,i] + } + names(temp) <- colnames(terms) + terms <- temp + rm(temp) + } + + if(!inherits(terms,"list")) terms <- list(terms) + if(mstop(x) > 0 && length(which) == 1 && which == 0) terms[[1]] <- offset + if(length(which) == 1 && length(terms[[1]]) == 1 && terms[[1]] == 0){ terms[[1]] <- rep(0, l=length(x$yind)) } + + #if(length(which)==1 && !any(class(x)=="FDboostLong")) terms <- list(terms) + + shrtlbls <- try(coef(x, which=which, computeCoef=FALSE))# get short names + if(inherits(shrtlbls, "try-error")){ + shrtlbls <- names(x$baselearner)[which[which!=0]] + if(0 %in% which) shrtlbls <- c("offset", which) + } + if(is.null(shrtlbls)) shrtlbls <- "offset" + time <- x$yind + + # include the offset in the plot of the intercept + if( includeOffset && 1 %in% which && grepl("ONEx", shrtlbls[1], fixed = TRUE) ){ + terms[[1]] <- terms[[1]] + x$offset + shrtlbls[1] <- paste("offset", "+", shrtlbls[1]) + } + if(length(which) > 1 && ask) par(ask = TRUE) + + if(commonRange){ + range <- range(terms) + # range[1] <- range[1] - 0.01 * diff(range) + # range[2] <- range[2] + 0.01 * diff(range) + }else range <- NULL + + if(!is.null(dots$ylim)) range <- dots$ylim + + for(i in seq_along(terms)){ + + # set values of predicted effect to missing if response is missing + if(sum(is.na(x$response)) > 0) terms[[i]][is.na(x$response)] <- NA + + range_i <- range + if(is.null(range_i)) range_i <- range(terms[[i]], na.rm=TRUE) + + if(length(time) > 1){ + + plotWithArgs(funplot, args=argsFunplot, + myargs=list(x=time, y=terms[[i]], id=x$id, type="l", ylab="effect", lty=1, rug=FALSE, + xlab=attr(time, "nameyind"), ylim=range_i, main=shrtlbls[i])) + if(rug) rug(time) + + }else{ + + if(!is.null(dim(x$response)) && dim(x$response)[2] > 1) + stop("plot.FDboost() with raw = TRUE is only implemented for one-dimensional scalar response.") + + plot_x <- x$response + plot_xlab <- "response" + if(is.numeric(x$response)){ + plot_x <- x$response - x$offset + plot_xlab <- "response - offset" + } + plotWithArgs(plot, args=argsPlot, + myargs=list(x=plot_x, y=terms[[i]], type="p", ylab="effect", + xlab=plot_xlab, ylim=range_i, main=shrtlbls[i])) + } + } + + if(length(which) > 1 && ask) par(ask = FALSE) + } + +} + +#' Function to update FDboost objects +#' +#' @param object fitted FDboost-object +#' @param weights,oobweights,risk,trace see \code{?FDboost} +#' @param ... Additional arguments to the call, or arguments with changed values. +#' @param evaluate If true evaluate the new call else return the call. +#' +#' @return Returns the call of (\code{evaluate = FALSE}) or the updated (\code{evaluate = TRUE}) FDboost model +#' @author David Ruegamer +#' @examples +#' ######## Example from \code{?FDboost} +#' data("viscosity", package = "FDboost") +#' ## set time-interval that should be modeled +#' interval <- "101" +#' +#' ## model time until "interval" and take log() of viscosity +#' end <- which(viscosity$timeAll == as.numeric(interval)) +#' viscosity$vis <- log(viscosity$visAll[,1:end]) +#' viscosity$time <- viscosity$timeAll[1:end] +#' # with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) +#' +#' mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df = 2) + bolsc(T_A, df = 2), +#' timeformula = ~ bbs(time, df = 4), +#' numInt = "equal", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 9), +#' data = viscosity, control=boost_control(mstop = 10, nu = 0.4)) +#' +#' # update nu +#' mod2 <- update(mod1, control=boost_control(nu = 1)) # mstop will stay the same +#' # update mstop +#' mod3 <- update(mod2, control=boost_control(mstop = 100)) # nu=1 does not get changed +#' mod4 <- update(mod1, formula = vis ~ 1 + bolsc(T_C, df = 2)) # drop one term +#' @method update FDboost +#' @export +update.FDboost <- function(object, weights = NULL, oobweights = NULL, risk = NULL, + trace = NULL, ..., evaluate = TRUE) +{ + + stopifnot(inherits(object,"FDboost")) + + call <- object$call + + extras <- match.call(expand.dots = FALSE)$... + + if (!is.null(risk) || !is.null(trace) || !is.null(extras$control)) { + + cc <- as.list(call$control) + if(length(cc)==0) cc <- list(as.symbol("boost_control")) + if(!is.null(risk)) cc$risk <- risk + if(!is.null(trace)) cc$trace <- trace + if(!is.null(extras$control)) cc[names(as.list(extras$control))[-1]] <- as.list(extras$control)[-1] + + extras$control <- as.call(cc) + + } + + if(!is.null(weights)) extras$weights <- weights + if(!is.null(oobweights)) extras$oobweights <- oobweights + + + if (length(extras) > 0) { + + existing <- !is.na(match(names(extras), names(call))) + + for (a in names(extras)[existing]) call[[a]] <- extras[[a]] + + if (any(!existing)) { + call <- c(as.list(call), extras[!existing]) + call <- as.call(call) + } + + } + + # if(is.null(extras$family)){ + # + # call$family <- object$family + # + # } + + if(is.null(extras$data)){ + + data <- as.list(object$data) + + # check if y is scalar + isScalar <- length(object$yind)==1 + + if(!isScalar){ + + yind <- all.vars(as.formula(object$timeformula))[[1]] + data[[yind]] <- object$yind + + } + + yname <- all.vars(as.formula(object$formulaFDboost))[1] + data[[yname]] <- object$response + + if(!isScalar && length(object$response) != length(object$yind)){ + # format long to wide + stopifnot(!is.null(object$id)) + data[[yname]] <- matrix(data[[yname]], ncol = length(object$yind), byrow = FALSE) + + } + assign(as.character(call$data), data) + + # + # if(!is.null(object$id)) call$id <- ~id + + }else{ + + ### new data only possible if all base-learners have brackets and + ### no new formula was supplied + if(is.null(extras$formula)){ + + ### check for brackets + singleBls <- gsub("\\s", "", unlist(lapply(strsplit( + strsplit(object$formulaFDboost, "~", fixed = TRUE)[[1]][2], # split formula + "+", fixed = TRUE)[[1]], # split additive terms + function(y) strsplit(y, split = "%.{1,3}%")) # split single baselearners + )) + + singleBls <- singleBls[singleBls!="1"] + + if(any( !grepl("(",singleBls, fixed = TRUE) )) + stop(paste0("update can not deal with the following base-learner(s) without brackets: ", + toString(singleBls[!grepl("(", singleBls, fixed = TRUE)]), ".\n", + "Please build such base-learners within the FDboost call or ", + "update corresponding baselearner(s) manually and supply a new formula to the update function.")) + + } + + } + + if (evaluate) eval(call, parent.frame()) else call + +} + + +######################################################################################## + +#' Extract information of a base-learner +#' +#' Takes a base-learner and extracts information. +#' +#' @param object a base-learner +#' @param what a character specifying the quantities to extract. +#' This can be a subset of "design" (default; design matrix), +#' "penalty" (penalty matrix) and "index" (index of ties used to expand +#' the design matrix) +#' @param asmatrix a logical indicating whether the the returned matrix should be +#' coerced to a matrix (default) or if the returned object stays as it is +#' (i.e., potentially a sparse matrix). This option is only applicable if \code{extract} +#' returns matrices, i.e., \code{what = "design"} or \code{what = "penalty"}. +#' @param expand a logical indicating whether the design matrix should be expanded +#' (default: \code{FALSE}). This is useful if ties were taken into account either manually +#' (via argument \code{index} in a base-learner) or automatically for data sets with many +#' observations. \code{expand = TRUE} is equivalent to \code{extract(B)[extract(B, what = "index"),]} +#' for a base-learner \code{B}. +#' @param ... currently not used +#' +#' @method extract blg +#' @seealso \code{\link[mboost:methods]{extract}} for the \code{extract} function +#' of the package \code{mboost}. +extract.blg <- function(object, what = c("design", "penalty", "index"), + asmatrix = FALSE, expand = FALSE, ...){ + what <- match.arg(what) + + if (grepl("%O%|%Oz%", object$get_call())) { + object <- object$dpp( rep(1, NROW(object$model.frame()[[1]])) ) + }else{ + object <- object$dpp(rep(1, nrow(object$model.frame()))) + } + return(extract(object, what = what, + asmatrix = asmatrix, expand = expand)) +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/stabsel.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/stabsel.R new file mode 100644 index 0000000..3842c08 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/stabsel.R @@ -0,0 +1,206 @@ + +#' Stability Selection +#' +#' Function for stability selection with functional response. Per default the sampling is done +#' on the level of curves and if the model contains a smooth functional intercept, this intercept +#' is refittedn in each sampling fold. +#' +#' @param x fitted FDboost-object +#' @param refitSmoothOffset logical, should the offset be refitted in each learning sample? +#' Defaults to \code{TRUE}. +#' @param cutoff cutoff between 0.5 and 1. Preferably a value between 0.6 and 0.9 should be used. +#' @param q number of (unique) selected variables (or groups of variables depending on the model) +#' that are selected on each subsample. +#' @param PFER upper bound for the per-family error rate. This specifies the amount of falsely +#' selected base-learners, which is tolerated. See details of \code{\link[mboost]{stabsel}}. +#' @param folds a weight matrix with number of rows equal to the number of observations, +#' see \code{{cvLong}}. Usually one should not change the default here as subsampling +#' with a fraction of 1/2 is needed for the error bounds to hold. One usage scenario where +#' specifying the folds by hand might be the case when one has dependent data (e.g. clusters) and +#' thus wants to draw clusters (i.e., multiple rows together) not individuals. +#' @param assumption Defines the type of assumptions on the distributions of the selection probabilities +#' and simultaneous selection probabilities. Only applicable for \code{sampling.type = "SS"}. +#' For \code{sampling.type = "MB"} we always use \code{"none"}. +#' @param sampling.type use sampling scheme of of Shah & Samworth (2013), i.e., with complementary pairs +#' (\code{sampling.type = "SS"}), or the original sampling scheme of Meinshausen & Buehlmann (2010). +#' @param B number of subsampling replicates. Per default, we use 50 complementary pairs for the error +#' bounds of Shah & Samworth (2013) and 100 for the error bound derived in Meinshausen & Buehlmann (2010). +#' As we use \code{B} complementary pairs in the former case this leads to \code{2B} subsamples. +#' @param papply (parallel) apply function, defaults to mclapply. Alternatively, parLapply can be used. +#' In the latter case, usually more setup is needed (see example of cvrisk for some details). +#' @param verbose logical (default: TRUE) that determines wether warnings should be issued. +#' @param eval logical. Determines whether stability selection is evaluated (\code{eval = TRUE}; default) +#' or if only the parameter combination is returned. +#' @param ... additional arguments to \code{\link[mboost]{cvrisk}} or \code{\link{validateFDboost}}. +#' +#' @details The number of boosting iterations is an important hyper-parameter of the boosting algorithms +#' and can be chosen using the functions \code{cvrisk.FDboost} and \code{validateFDboost} as they compute +#' honest, i.e. out-of-bag, estimates of the empirical risk for different numbers of boosting iterations. +#' The weights (zero weights correspond to test cases) are defined via the folds matrix, +#' see \code{\link[mboost]{cvrisk}} in package mboost. +#' See Hofner et al. (2015) for the combination of stability selection and component-wise boosting. +#' +#' @seealso \code{\link[mboost]{stabsel}} to perform stability selection for a mboost-object. +#' +#' @references +#' B. Hofner, L. Boccuto and M. Goeker (2015), Controlling false discoveries in +#' high-dimensional situations: boosting with stability selection. +#' BMC Bioinformatics, 16, 1-17. +#' +#' N. Meinshausen and P. Buehlmann (2010), Stability selection. +#' Journal of the Royal Statistical Society, Series B, 72, 417-473. +#' +#' R.D. Shah and R.J. Samworth (2013), Variable selection with error control: +#' another look at stability selection. Journal of the Royal Statistical Society, Series B, 75, 55-80. +#' +#' @return An object of class \code{stabsel} with a special print method. +#' For the elements of the object, see \code{\link[mboost]{stabsel}} +#' +#' @examples +#' ######## Example for function-on-scalar-regression +#' data("viscosity", package = "FDboost") +#' ## set time-interval that should be modeled +#' interval <- "101" +#' +#' ## model time until "interval" and take log() of viscosity +#' end <- which(viscosity$timeAll == as.numeric(interval)) +#' viscosity$vis <- log(viscosity$visAll[,1:end]) +#' viscosity$time <- viscosity$timeAll[1:end] +#' # with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) +#' +#' ## fit a model cotaining all main effects +#' modAll <- FDboost(vis ~ 1 +#' + bolsc(T_C, df=1) %A0% bbs(time, df=5) +#' + bolsc(T_A, df=1) %A0% bbs(time, df=5) +#' + bolsc(T_B, df=1) %A0% bbs(time, df=5) +#' + bolsc(rspeed, df=1) %A0% bbs(time, df=5) +#' + bolsc(mflow, df=1) %A0% bbs(time, df=5), +#' timeformula = ~bbs(time, df=5), +#' numInt = "Riemann", family = QuantReg(), +#' offset = NULL, offset_control = o_control(k_min = 10), +#' data = viscosity, +#' control = boost_control(mstop = 100, nu = 0.2)) +#' +#' +#' ## create folds for stability selection +#' ## only 5 folds for a fast example, usually use 50 folds +#' set.seed(1911) +#' folds <- cvLong(modAll$id, weights = rep(1, l = length(modAll$id)), +#' type = "subsampling", B = 5) +#' +#' \donttest{ +#' ## stability selection with refit of the smooth intercept +#' stabsel_parameters(q = 3, PFER = 1, p = 6, sampling.type = "SS") +#' sel1 <- stabsel(modAll, q = 3, PFER = 1, folds = folds, grid = 1:200, sampling.type = "SS") +#' sel1 +#' +#' ## stability selection without refit of the smooth intercept +#' sel2 <- stabsel(modAll, refitSmoothOffset = FALSE, q = 3, PFER = 1, +#' folds = folds, grid = 1:200, sampling.type = "SS") +#' sel2 +#' } +#' +#' @export +## code for stabsel.mboost taken from mboost 2.6-0 +## stabsel method for FDboost; requires stabs +stabsel.FDboost <- function(x, refitSmoothOffset = TRUE, + cutoff, q, PFER, + # folds = subsample(model.weights(x), B = B), + folds = cvLong(x$id, weights = rep(1, l = length(x$id)), type = "subsampling", B = B), + B = ifelse(sampling.type == "MB", 100, 50), + assumption = c("unimodal", "r-concave", "none"), + sampling.type = c("SS", "MB"), + papply = mclapply, verbose = TRUE, eval = TRUE, ...) { + + cll <- match.call() + p <- length(variable.names(x)) + ibase <- 1:p + + sampling.type <- match.arg(sampling.type) + if (sampling.type == "MB") + assumption <- "none" + else + assumption <- match.arg(assumption) + + B <- ncol(folds) + + pars <- stabsel_parameters(p = p, cutoff = cutoff, q = q, + PFER = PFER, B = B, + verbose = verbose, sampling.type = sampling.type, + assumption = assumption) + ## return parameter combination only if eval == FALSE + if (!eval) + return(pars) + + cutoff <- pars$cutoff + q <- pars$q + PFER <- pars$PFER + + fun <- function(model) { + xs <- selected(model) + qq <- sapply(seq_along(xs), function(x) length(unique(xs[1:x]))) + xs[qq > q] <- xs[1] + xs + } + if (sampling.type == "SS") { + ## use complementary pairs + folds <- cbind(folds, model.weights(x) - folds) + } + + ## for scalar response and/or scalar offset, use the more efficient cvrisk() + if( inherits(x, "FDboostScalar" ) ) refitSmoothOffset <- FALSE + if( !is.null(x$call$offset) && x$call$offset == "scalar" ) refitSmoothOffset <- FALSE + + if(refitSmoothOffset){ + message("Use applyFolds() to recompute the smooth offset in each fold.") + ## folds are on level of single observations + ## but applyFolds() expects folds on the level of curves + folds <- folds[! duplicated(x$id), ] + ss <- applyFolds(x, fun = fun, folds = folds, ...) + + }else{ + ss <- cvrisk(x, fun = fun, + folds = folds, + papply = papply, ...) + } + + + if (verbose){ + qq <- sapply(ss, function(x) length(unique(x))) + sum_of_violations <- sum(qq < q) + if (sum_of_violations > 0) + warning(sQuote("mstop"), " too small in ", + sum_of_violations, " of the ", ncol(folds), + " subsampling replicates to select ", sQuote("q"), + " base-learners; Increase ", sQuote("mstop"), + " bevor applying ", sQuote("stabsel")) + } + + + ## if grid specified in '...' + if (length(list(...)) >= 1 && "grid" %in% names(list(...))) { + m <- max(list(...)$grid) + } else { + m <- mstop(x) + } + ret <- matrix(0, nrow = length(ibase), ncol = m) + for (i in seq_along(ss)) { + tmp <- sapply(ibase, function(x) + ifelse(x %in% ss[[i]], which(ss[[i]] == x)[1], m + 1)) + ret <- ret + t(sapply(tmp, function(x) c(rep(0, x - 1), rep(1, m - x + 1)))) + } + + phat <- ret / length(ss) + rownames(phat) <- names(variable.names(x)) + if (extends(class(x), "glmboost")) + rownames(phat) <- variable.names(x) + ret <- list(phat = phat, selected = which((mm <- apply(phat, 1, max)) >= cutoff), + max = mm, cutoff = cutoff, q = q, PFER = PFER, p = p, B = B, + sampling.type = sampling.type, assumption = assumption, + call = cll) + ret$call[[1]] <- as.name("stabsel") + class(ret) <- c("stabsel_FDboost", "stabsel_mboost", "stabsel") + ret +} + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/R/utilityFunctions.R b/FDboost.Rcheck/00_pkg_src/FDboost/R/utilityFunctions.R new file mode 100644 index 0000000..1d1ed4f --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/R/utilityFunctions.R @@ -0,0 +1,1225 @@ + +#' Function to control estimation of smooth offset +#' +#' @param k_min maximal number of k in s() +#' @param rule which rule to use in approx() of the response before calculating the +#' global mean, rule=1 means no extrapolation, rule=2 means to extrapolate the +#' closest non-missing value, see \code{\link[stats:approxfun]{approx}} +#' @param silent print error messages of model fit? +#' @param cyclic defaults to FALSE, if TRUE cyclic splines are used +#' @param knots arguments knots passed to \code{\link[mgcv]{gam}} +#' @return a list with controls +#' @export +o_control <- function(k_min=20, rule=2, silent=TRUE, cyclic=FALSE, knots=NULL) { + RET <- list(k_min=k_min, rule=rule, silent=silent, cyclic=cyclic, knots=knots) + class(RET) <- "offset_control" + RET +} + + + +#' Function to truncate time in functional data +#' +#' @param funVar names of functional variables that should be truncated +#' @param time name of time variable +#' @param newtime new time vector that should be used. Must be part of the old time-line. +#' @param data list containing all the data +#' @note All variables that are not part if \code{funVar}, or \code{time} +#' are simply copied into the new data list +#' @return A list with the data containing all variables of the original dataset +#' with the variables of \code{funVar} truncated according to \code{newtime}. +#' @examples +#' if(require(fda)){ +#' dat <- fda::growth +#' dat$hgtm <- t(dat$hgtm[,1:10]) +#' dat$hgtf <- t(dat$hgtf[,1:10]) +#' +#' ## only use time-points 1:16 of variable age +#' datTr <- truncateTime(funVar=c("hgtm","hgtf"), time="age", newtime=1:16, data=dat) +#' +#' \donttest{ +#' oldpar <- par(mfrow=c(1,2)) +#' with(dat, funplot(age, hgtm, main="Original data")) +#' with(datTr, funplot(age, hgtm, main="Yearly data")) +#' par(mfrow=c(1,1)) +#' par(oldpar) +#' } +#' } +#' @export +truncateTime <- function(funVar, time, newtime, data){ + + stopifnot(c(funVar, time) %in% names(data)) + stopifnot(newtime %in% data[[time]]) + + ret <- data + ret[[time]] <- newtime + + for(i in seq_along(funVar)){ + ret[[funVar[i]]] <- ret[[funVar[i]]][ , data[[time]] %in% newtime] + } + rm(data) + return(ret) +} + +#' Plot functional data with linear interpolation of missing values +#' +#' @param x optional, time-vector for plotting +#' @param y matrix of functional data with functions in rows and measured times in columns; +#' or vector or functional observations, in this case id has to be specified +#' @param id defaults to NULL for y matrix, is id-variables for y in long format +#' @param rug logical. Should rugs be plotted? Defaults to TRUE. +#' @param ... further arguments passed to \code{\link[graphics]{matplot}}. +#' +#' @details All observations are marked by a small cross (\code{pch=3}). +#' Missing values are imputed by linear interpolation. Parts that are +#' interpolated are plotted by dotted lines, parts with non-missing values as solid lines. +#' @examples +#' \donttest{ +#' ### examples for regular data in wide format +#' data(viscosity) +#' with(viscosity, funplot(timeAll, visAll, pch=20)) +#' if(require(fda)){ +#' with(fda::growth, funplot(age, t(hgtm))) +#' } +#' } +#' @return see \code{\link[graphics]{matplot}} +#' @export +funplot <- function(x, y, id=NULL, rug=TRUE, ...){ + + ### Get further arguments passed to the matplot-functions + dots <- list(...) + + ## AS: caused bug, couldn't see necessity here + # oldpar <- par(no.readonly = TRUE) + # on.exit(par(oldpar)) + + getArguments <- function(x, dots=dots){ + if(any(names(dots) %in% names(x))){ + dots[names(dots) %in% names(x)] + }else list() + } + + plotWithArgs <- function(plotFun, args, myargs){ + args <- c(myargs[!names(myargs) %in% names(args)], args) + do.call(plotFun, args) + } + + argsMatplot <- getArguments(x=c(formals(graphics::matplot), par(), main="", sub=""), dots=dots) + argsPlot <- getArguments(x=c(formals(graphics::plot.default), par()), dots=dots) + + if( !is.null(dim(y)) ){ # is.null(id) + + # Deal with missing values: interpolate data + if (missing(x)) { + if (missing(y)) + stop("must specify at least one of 'x' and 'y'") + else{ + x <- seq_len(NCOL(y)) + xlabel <- "index" + } + } else xlabel <- deparse(substitute(x)) + + ylabel <- if (!missing(y)) + deparse(substitute(y)) + + time <- x + + stopifnot(length(x) == ncol(y)) + + # Check whether there are at least two values per row for the interpolation + atLeast2values <- apply(y, 1, function(x) sum(is.na(x)) < length(x)-1 ) + if(any(!atLeast2values)) warning(sum(!atLeast2values), " rows contain less than 2 non-missing values.") + + # Linear interpolation per row + yint <- matrix(NA, ncol=ncol(y), nrow=nrow(y)) + yint[atLeast2values, ] <- t(apply(y[atLeast2values, ], 1, function(x) approx(time, x, xout=time)$y)) + + # Plot the observed points + plotWithArgs(matplot, args=argsMatplot, + myargs=list(x=time, y=t(y), xlab=xlabel, ylab=ylabel, type="p", pch=3) ) + + # Plot solid lines for parts of the function without missing values + plotWithArgs(matplot, args=argsMatplot, + myargs=list(x=time, y=t(y), type="l", lty=1, add=TRUE) ) + + # Plot dotted lines for parts of the function without missing values + plotWithArgs(matplot, args=argsMatplot, + myargs=list(x=time, y=t(yint), type="l", lty=3, add=TRUE) ) + + if(rug) rug(time, 0.01) + + }else{ + + stopifnot(length(x)==length(y) & length(y)==length(id)) + + idOrig <- id + for(i in seq_along(unique(idOrig))){ + id[idOrig==unique(idOrig)[i]] <- i + } + + xlabel <- deparse(substitute(x)) + ylabel <- deparse(substitute(y)) + + # get color specification + if("col" %in% names(dots)){ + col <- dots$col + argsPlot$col <- 1 + }else{ + col <- 1 + } + + # expand vector col if it contains one color per trajectory + if(length(col) == length(unique(id)) ){ + col <- rep(col, table(id) ) + } + + # there should be no mising values in long format + temp <- data.frame(id, y, x, col, stringsAsFactors=FALSE) # dim(temp) + temp <- na.omit(temp) + # order values of temp + temp <- temp[order(temp$id, temp$x),] + id <- temp$id + x <- temp$x + y <- temp$y + col <- temp$col + rm(temp) + + # generate vector of colors for each observation + if(is.null(argsPlot$col)){ + col <- rep( (unique(id)-1), table(id)) + col <- col %% 6 + 1 # only use the colors 1-6 + } + argsPlot$col <- NULL + + # Plot the observed points + if(!"add" %in% names(dots)){ + if(is.null(argsPlot$ylim)) argsPlot$ylim <- range(y, na.rm=TRUE) + plotWithArgs(plot, args=argsPlot, + myargs=list(x=x[id==1], y=y[id==1], xlab=xlabel, ylab=ylabel, type="p", pch=3, + ylim=range(y, na.rm=TRUE), xlim=range(x, na.rm=TRUE), col=col[id==1] ) ) + } + + for(i in unique(id)){ + plotWithArgs(points, args=argsPlot, + myargs=list(x=x[id==i], y=y[id==i], xlab=xlabel, ylab=ylabel, type="p", pch=3, + col=col[id==i]) ) + plotWithArgs(lines, args=argsPlot, + myargs=list(x=x[id==i], y=y[id==i], xlab=xlabel, ylab=ylabel, col=col[id==i]) ) + } + + if(rug) rug(x, 0.01) + + + } + +} + + + +##################################################################################### + +#' @rdname plot.FDboost +#' @export +#' +### function to plot the observed response and the predicted values of a model +plotPredicted <- function(x, subset=NULL, posLegend="topleft", lwdObs=1, lwdPred=1, ...){ + + stopifnot(inherits(x, "FDboost")) + + if(inherits(x, "FDboostScalar")){ + + if(is.null(subset)) subset <- seq_along(x$response) + response <- x$response[subset, drop=FALSE] + pred <- fitted(x)[subset, drop=FALSE] + pred[is.na(response)] <- NA + + }else{ + + if(!inherits(x, "FDboostLong")){ + if(is.null(subset)) subset <- 1:x$ydim[1] + response <- matrix(x$response, nrow=x$ydim[1], ncol=x$ydim[2])[subset, , drop=FALSE] + pred <- fitted(x)[subset, , drop=FALSE] + pred[is.na(response)] <- NA + yind <- x$yind + id <- NULL + }else{ + if(is.null(subset)) subset <- unique(x$id) + response <- x$response[x$id %in% subset] + pred <- fitted(x)[x$id %in% subset] + pred[is.na(response)] <- NA + yind <- x$yind[x$id %in% subset] + id <- x$id[x$id %in% subset] + } + + } + + if(is.character(response) || is.factor(x$response)){ + + if(length(x$yind) > 1){ + message("For functional response that is not continuous only the predicted values are plotted.") + funplot(yind, pred, id=id, pch=2, lwd=lwdPred, ... ) + }else{ + plot(response, pred, ylab="predicted", xlab="observed", ...) + } + + + } else{ + + ylim <- range(response, pred, na.rm = TRUE) + + if(length(x$yind) > 1){ + # Observed values + funplot(yind, response, id=id, pch=1, ylim=ylim, lty=3, + ylab=x$yname, xlab=attr(x$yind, "nameyind"), lwd=lwdObs, ...) + funplot(yind, pred, id=id, pch=2, lwd=lwdPred, add=TRUE, ...) + # predicted values + legend(posLegend, legend=c("observed","predicted"), col=1, pch=1:2) + }else{ + plot(response, pred, ylab="predicted", xlab="observed", ...) + abline(0,1) + } + + } + +} + + +##################################################################################### + +#' @rdname plot.FDboost +#' @export +#' +### function to plot the residuals +plotResiduals <- function(x, subset=NULL, posLegend="topleft", ...){ + + stopifnot(inherits(x, "FDboost")) + + if(inherits(x, "FDboostScalar")){ + + if(is.null(subset)) subset <- seq_along(x$response) + response <- x$response[subset, drop=FALSE] + resid <- x$resid()[subset, drop=FALSE] + + }else{ + + if(!inherits(x, "FDboostLong")){ ## wide format + if(is.null(subset)) subset <- 1:x$ydim[1] + resid <- matrix(x$resid(), nrow = x$ydim[1])[subset, , drop=FALSE] + yind <- x$yind + id <- NULL + + }else{ ## long format + if(is.null(subset)) subset <- unique(x$id) + resid <- x$resid()[x$id %in% subset, drop=FALSE] + yind <- x$yind[x$id %in% subset] + id <- x$id[x$id %in% subset] + } + + } + + # Observed - predicted values + if(length(x$yind) > 1){ + funplot(yind, resid, id=id, ylab=x$yname, xlab=attr(x$yind, "nameyind"), ...) + }else{ + plot(response, resid, ylab="residuals", xlab="observed", ...) + } + +} + + +##################################################################################### +### Goodness of fit + +# function to get y, yhat and time +getYYhatTime <- function(object, breaks=object$yind){ + + y <- matrix(object$response, nrow=object$ydim[1], ncol=object$ydim[2]) + time <- object$yind + + ### use the original time variable + if(all(breaks==object$yind)){ + yhat <- matrix(object$fitted(), nrow=object$ydim[1], ncol=object$ydim[2]) + }else{ ### use a time variables according to breaks + if(length(breaks)==1){ # length of equidistant time-points + time <- seq( min(object$yind), max(object$yind), l=breaks) + }else{ # time-points ot be evaluated + time <- breaks + } + # Interpolate observed values + yInter <- t(apply(y, 1, function(x) approx(object$yind, x, xout=time)$y)) + # Get dataframe to predict values at time + newdata <- list() + for(j in seq_along(object$baselearner)){ + datVarj <- object$baselearner[[j]]$get_data() + if(grepl("bconcurrent", names(object$baselearner)[j], fixed = TRUE)){ + datVarj <- t(apply(datVarj[[1]], 1, function(x) approx(object$yind, x, xout=time)$y)) + datVarj <- list(datVarj) + } + names(datVarj) <- names(object$baselearner[[j]]$get_data()) + newdata <- c(newdata, datVarj) + } + newdata[[attr(object$yind, "nameyind")]] <- time + yhatInter <- predict(object, newdata=newdata) + + y <- yInter + yhat <- yhatInter + } + + return(list(y=y, yhat=yhat, time=time)) +} + + + +#' Functional R-squared +#' +#' Calculates the functional R-squared for a fitted FDboost-object +#' +#' @param object fitted FDboost-object +#' @param overTime per default the functional R-squared is calculated over time +#' if \code{overTime=FALSE}, the R-squared is calculated per curve +#' @param breaks an optional vector or number giving the time-points at which the model is evaluated. +#' Can be specified as number of equidistant time-points or as vector of time-points. +#' Defaults to the index of the response in the model. +#' @param global logical. defaults to \code{FALSE}, +#' if TRUE the global R-squared like in a normal linear model is calculated +#' @param ... currently not used +#' +#' @note \code{breaks} cannot be changed in the case the \code{bsignal()} +#' is used over the same domain +#' as the response! In that case you would have to rename the index of the response or that +#' of the covariates. +#' +#' @details \code{breaks} should be set to some grid, if there are many +#' missing values or time-points with very few observations in the dataset. +#' Otherwise at these points of t the variance will be almost 0 +#' (or even 0 if there is only one observation at a time-point), +#' and then the prediction by the local means \eqn{\mu(t)} is locally very good. +#' The observations are interpolated linearly if necessary. +#' +#' Formula to calculate R-squared over time, \code{overTime=TRUE}: \cr +#' \eqn{R^2(t) = 1 - \sum_{i}( Y_i(t) - \hat{Y}_i(t))^2 / \sum_{i}( Y_i(t) - \bar{Y}(t) )^2 } +#' +#' Formula to calculate R-squared over subjects, \code{overTime=FALSE}: \cr +#' \eqn{R^2_i = 1 - \int (Y_i(t) - \hat{Y}_i(t))^2 dt / \int (Y_i(t) - \bar{Y}_i )^2 dt } +#' +#' @references Ramsay, J., Silverman, B. (2006). Functional data analysis. +#' Wiley Online Library. chapter 16.3 +#' +#' @return Returns a vector with the calculated R-squared and some extra information in attributes. +#' +#' @export +funRsquared <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ...){ + + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ + y <- object$response + yhat <- object$fitted() + time <- object$yind + id <- object$id + if(is.null(id)) id <- seq_along(y) + if(overTime && !global) { + overTime <- FALSE + message("For scalar or irregualr response the functional R-squared cannot be computed over time.") + } + if(length(object$yind)<2) global <- TRUE + }else{ + # Get y, yhat and time of the model fit + temp <- getYYhatTime(object=object, breaks=breaks) + y <- temp$y + yhat <- temp$yhat + time <- temp$time + + stopifnot(dim(y)==dim(yhat)) + stopifnot(dim(y)[2]==length(time)) + + } + + if(global){ + ret <- 1 - ( sum((y-yhat)^2, na.rm=TRUE) / sum( (y-mean(y, na.rm=TRUE))^2, na.rm=TRUE) ) + attr(ret, "name") <- "global R-squared" + return(ret) + } + + ### for each time-point t + if(overTime){ + # Mean function over time (matrix containing the mean in each t in the whole column) + mut <- matrix(colMeans(y, na.rm=TRUE), nrow=nrow(y), ncol=ncol(y), byrow=TRUE) + + # numerator cannot be 0 + num <- colSums((y - mut)^2, na.rm=TRUE) + num[round(num, 2)==0] <- NA + ret <- 1 - ( colSums((y - yhat)^2, na.rm=TRUE) / num ) # over t + + # Set values of R-squared to NA if too many values are missing + ret[apply(y, 2, function(x) sum(is.na(x))>0.5*length(x) )] <- NA + + attr(ret, "name") <- "R-squared over time" + attr(ret, "time") <- time + attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x) ) + + }else{ ### for each subject i + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ + # Mean for each subject + mut <- tapply(y, id, mean, na.rm=TRUE )[id] + # numerator cannot be 0 + num <- tapply((y - mut)^2, id, mean, na.rm=TRUE )[id] + num[round(num, 2)==0] <- NA + ret <- 1 - tapply((y - yhat)^2 /num, id, mean, na.rm=TRUE ) + attr(ret, "name") <- "MSE over subjects" + }else{ + # Mean for each subject + mut <- matrix(rowMeans(y, na.rm=TRUE), nrow=nrow(y), ncol=ncol(y), byrow=TRUE) + # numerator cannot be 0 + num <- rowSums((y - mut)^2, na.rm=TRUE) + num[round(num, 2)==0] <- NA + ret <- 1 - ( rowSums((y - yhat)^2, na.rm=TRUE) / num ) # over subjects + + attr(ret, "name") <- "R-squared over subjects" + attr(ret, "missings") <- apply(y, 1, function(x) sum(is.na(x))/length(x)) + } + } + return(ret) +} + + +# R2t <- funRsqrt(mod) +# plot(attr(R2t, "time"), R2t, ylim=c(0,1), type="b") +# points(attr(R2t, "time"), attr(R2t, "missings"), col=2, type="b") +# abline(h=c(0, 1)) +# +# R2i <- funRsqrt(mod, overTime=FALSE) +# plot(R2i, type="b", ylim=c(0,1)) +# points(attr(R2i, "missings"), col=2, type="b") +# abline(h=c(0, 1)) + +#' Functional MSE +#' +#' Calculates the functional MSE for a fitted FDboost-object +#' +#' @param object fitted FDboost-object +#' @param overTime per default the functional R-squared is calculated over time +#' if \code{overTime=FALSE}, the R-squared is calculated per curve +#' @param breaks an optional vector or number giving the time-points at which the model is evaluated. +#' Can be specified as number of equidistant time-points or as vector of time-points. +#' Defaults to the index of the response in the model. +#' @param global logical. defaults to \code{FALSE}, +#' if TRUE the global R-squared like in a normal linear model is calculated +#' @param relative logical. defaults to \code{FALSE}. If \code{TRUE} the MSE is standardized +#' by the global variance of the response \cr +#' \eqn{ n^{-1} \int \sum_i (Y_i(t) - \bar{Y})^2 dt \approx G^{-1} n^{-1} \sum_g \sum_i (Y_i(t_g) - \bar{Y})^2 } +#' @param root take the square root of the MSE +#' @param ... currently not used +#' +#' @note \code{breaks} cannot be changed in the case the \code{bsignal()} +#' is used over the same domain +#' as the response! In that case you would have to rename the index of the response or that +#' of the covariates. +#' +#' @details +#' Formula to calculate MSE over time, \code{overTime=TRUE}: \cr +#' \eqn{ MSE(t) = n^{-1} \sum_i (Y_i(t) - \hat{Y}_i(t))^2 } +#' +#' Formula to calculate MSE over subjects, \code{overTime=FALSE}: \cr +#' \eqn{ MSE_i = \int (Y_i(t) - \hat{Y}_i(t))^2 dt \approx G^{-1} \sum_g (Y_i(t_g) - \hat{Y}_i(t_g))^2} +#' +#' @return Returns a vector with the calculated MSE and some extra information in attributes. +#' +#' @export +funMSE <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, + relative=FALSE, root=FALSE, ...){ + + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ + y <- object$response + yhat <- object$fitted() + time <- object$yind + id <- object$id + if(is.null(id)) id <- seq_along(y) + if(overTime && !global) { + overTime <- FALSE + message("For scalar or irregualr response the functional MSE cannot be computed over time.") + } + }else{ + # Get y, yhat and time of the model fit + temp <- getYYhatTime(object=object, breaks=breaks) + y <- temp$y + yhat <- temp$yhat + time <- temp$time + } + + if(global){ + ret <- mean((y-yhat)^2, na.rm=TRUE) + attr(ret, "name") <- "global MSE" + }else{ + ### for each time-point t + if(overTime){ + ret <- colMeans((y - yhat)^2, na.rm=TRUE) + attr(ret, "name") <- "MSE over time" + attr(ret, "time") <- time + attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x)) + }else{ + ### for each subject i + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ + ret <- tapply((y - yhat)^2, id, mean, na.rm=TRUE ) + attr(ret, "name") <- "MSE over subjects" + }else{ + ret <- rowMeans((y - yhat)^2, na.rm=TRUE) + attr(ret, "name") <- "MSE over subjects" + attr(ret, "missings") <- apply(y, 1, function(x) sum(is.na(x))/length(x)) + } + } + } + + if(relative){ + variY <- mean( (y - mean(y, na.rm=TRUE))^2, na.rm=TRUE ) # global variance of y + ret <- ret / variY + attr(ret, "name") <- paste("relative", attr(ret, "name")) + } + + if(root){ + ret <- sqrt(ret) + attr(ret, "name") <- paste("root", attr(ret, "name")) + } + + return(ret) +} + + +#' Functional MRD +#' +#' Calculates the functional MRD for a fitted FDboost-object +#' +#' @param object fitted FDboost-object with regular response +#' @param overTime per default the functional MRD is calculated over time +#' if \code{overTime=FALSE}, the MRD is calculated per curve +#' @param breaks an optional vector or number giving the time-points at which the model is evaluated. +#' Can be specified as number of equidistant time-points or as vector of time-points. +#' Defaults to the index of the response in the model. +#' @param global logical. defaults to \code{FALSE}, +#' if TRUE the global MRD like in a normal linear model is calculated +#' @param ... currently not used +#' +#' @note \code{breaks} cannot be changed in the case the \code{bsignal()} +#' is used over the same domain +#' as the response! In that case you would have to rename the index of the response or that +#' of the covariates. +#' +#' @details +#' Formula to calculate MRD over time, \code{overTime=TRUE}: \cr +#' \eqn{ MRD(t) = n^{-1} \sum_i |Y_i(t) - \hat{Y}_i(t)| / |Y_i(t)| } +#' +#' Formula to calculate MRD over subjects, \code{overTime=FALSE}: \cr +#' \eqn{ MRD_{i} = \int |Y_i(t) - \hat{Y}_i(t)| / |Y_i(t)| dt \approx G^{-1} \sum_g |Y_i(t_g) - \hat{Y}_i(t_g)| / |Y_i(t)|} +#' +#' @return Returns a vector with the calculated MRD and some extra information in attributes. +#' +#' @export +funMRD <- function(object, overTime=TRUE, breaks=object$yind, global=FALSE, ...){ + + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ + y <- object$response + yhat <- object$fitted() + time <- object$yind + id <- object$id + if(is.null(id)) id <- seq_along(y) + if(overTime && !global) { + overTime <- FALSE + message("For scalar or irregualr response the functional MRD cannot be computed over time.") + } + }else{ + # Get y, yhat and time of the model fit + temp <- getYYhatTime(object=object, breaks=breaks) + y <- temp$y + yhat <- temp$yhat + time <- temp$time + } + + # You cannot use observations that are 0, so set them to NA + y1 <- y + y1[ round(y1, 1) == 0 ] <- NA + + if(global){ + ret <- mean( abs((y1 - yhat) / y1), na.rm=TRUE ) + attr(ret, "name") <- "global MRD" + }else{ + ### for each time-point t + if(overTime){ + ret <- colMeans( abs((y1 - yhat) / y1), na.rm=TRUE ) + attr(ret, "name") <- "MRD over time" + attr(ret, "time") <- time + attr(ret, "missings") <- apply(y, 2, function(x) sum(is.na(x))/length(x)) + }else{ + ### for each subject i + if(length(object$yind)<2 || inherits(object, "FDboostLong")){ + ret <- tapply( abs((y1 - yhat) / y1), id, mean, na.rm=TRUE ) + attr(ret, "name") <- "MRD over subjects" + }else{ + ret <- rowMeans( abs((y1 - yhat) / y1), na.rm=TRUE ) + attr(ret, "name") <- "MRD over subjects" + attr(ret, "missings") <- apply(y, 1, function(x) sum(is.na(x))/length(x)) + } + } + } + + return(ret) +} + + +############################################################################### +## helper functions for identifiability + + +## based on code of function ff() in package refund +## see Scheipl and Greven, 2016: Identifiability in penalized function-on-function regression models +# X1 matrix of functional covariate x(s) +# L matrix of integration weights +# Bs matrix of spline expansion in s +# K penalty matrix +# xname name of functional covariate +# penalty the type of the penalty one of "ps" or "pps" +# cumOverlap DEPRECATED should a cumulative overlap be computed, +# which is especially suited for a historical effect with triangular coefficient surface? +# limits the limits function of the historical effect, default to NULL for unconstrained effect +# if limits is supplied a cumulative overlap and condition number according to limits is computed +# yind, id, X1des, ind0, xind passed from X_hist() to compute sequential identifiability measures +# giveWarnings should warnings be printed +check_ident <- function(X1, L, Bs, K, xname, penalty, + ## cumOverlap = FALSE, + limits = NULL, yind = NULL, + t_unique = NULL, + id = NULL, + X1des = NULL, ind0 = NULL, xind = NULL, + giveWarnings = TRUE){ + + ## center X1 per column + X1 <- scale(X1, scale = FALSE) + + #print("check.ident") + ## check whether (number of basis functions in Bs) < (number of relevant eigenfunctions of X1) + evls <- svd(X1, nu = 0, nv = 0)$d^2 # eigenvalues of centered fun. cov. + evls[evls<0] <- 0 + maxK <- max(1, min(which((cumsum(evls)/sum(evls)) >= .995))) + bsdim <- ncol(Bs) # number of basis functions in Bs + if(maxK <= 4) + warning("Very low effective rank of <", xname, + "> detected. ", maxK, + " largest eigenvalues of its covariance alone account for >99.5% of ", + "variability. might be a better choice here.") + if(maxK < bsdim){ + warning(" (", bsdim,") larger than effective rank of <", xname, + "> (", maxK, "). ", + "Model identifiable only through penalty.") + } + + ### compute condition number of Ds^t Ds + Ds <- (X1 * L) %*% Bs + ## DstDs <- crossprod(Ds) + ## e_DstDs <- try(eigen(DstDs)) + ## e_DstDs$values <- pmax(0, e_DstDs$values) # set negative eigenvalues to 0 + ## logCondDs <- log10(e_DstDs$values[1]) - log10(tail(e_DstDs$values, 1)) + evDs <- svd(Ds, nu = 0, nv = 0)$d^2 ## the same as eigenvalues of DstDs + logCondDs <- log10(max(evDs)) - log10(min(evDs)) + if(giveWarnings && logCondDs > 6 && is.null(limits)){ + warning("Condition number for <", xname, "> greater than 10^6 (logCondDs = ", round(logCondDs, 2),"). ", + "Effect identifiable only through penalty.") + } + + ### compute condition number of Ds^t Ds for subsections of Ds accoring to limits + logCondDs_hist <- NULL + + # look at condition number of Ds for all values of yind for historical effect + # use X1des, as this is the marginal design matrix using the limits + if(!is.null(limits)){ + ind0Bs <- ((!ind0)*1) %*% Bs # matrix to check for 0 columns + ## implementation is suitable for common grid of t, maybe with some missings + ## common grid is assumed if Y(t) is observed at least in 80% for each point + if( length(yind) < nrow(X1des) || all(table(yind) / max(id) > 0.8) ){ + if(is.null(t_unique)) t_unique <- sort(unique(yind)) + logCondDs_hist <- rep(NA, length=length(t_unique)) + for(k in seq_along(t_unique)){ + Ds_t <- X1des[yind==t_unique[k], ] # get rows of Ds corresponding to yind + ind0Bs_t <- ind0Bs[yind==t_unique[k], ] # get rows of ind0Bs corresponding to yind + # only keep columns that are not completely 0, otherwise matrix is always rank deficient + # idea: only this part is used to model y(t) at this point + # also delete if not perfectly but almost zero, for all spline bases + Ds_t <- Ds_t[ , apply(ind0Bs_t, 2, function(x) !all(abs(x)<10^-1) ), drop = FALSE ] + + if(dim(Ds_t)[2]!=0){ # for matrix with 0 columns does not make sense + ## DstDs_t <- crossprod(Ds_t) + ## e_DstDs_t <- try(eigen(DstDs_t)) + ## e_DstDs_t$values <- pmax(0, e_DstDs_t$values) # set negative eigenvalues to 0 + ## logCondDs_t <- log10(e_DstDs_t$values[1]) - log10(tail(e_DstDs_t$values, 1)) + ## logCondDs_hist[k] <- logCondDs_t + evDs <- svd(Ds_t, nu = 0, nv = 0)$d^2 ## the same as eigenvalues of DstDs + logCondDs_hist[k] <- log10(max(evDs)) - log10(min(evDs)) + } + ## matplot(xind, Bs, type="l", lwd=2, ylim=c(-2,2)); rug(xind); rug(yind, col=2, lwd=2) + ## matplot(knots[seq_len(ncol(Ds_t))], t(Ds_t), type="l", lwd=1, add=TRUE) + ## lines(t_unique, logCondDs_hist-6, col=2, lwd=4) + } + names(logCondDs_hist) <- round(t_unique,2) + + ### implementation for seriously irregular observation points t + }else{ + ## use the mean number of grid points, in the case of irregular t + # t_unique <- seq(min(yind), max(yind), length=round(mean(table(id)))) + ### use quantiles of yind, as only at places with observations effect can be identifiable + ### using quantiles prevents Ds_t from beeing completely empty + if(is.null(t_unique)) t_unique <- quantile(yind, probs=seq(0,1,length=round(mean(table(id)))) ) + names(t_unique) <- NULL + logCondDs_hist <- rep(NA, length=length(t_unique)-1) + for(k in 1:(length(t_unique)-1)){ + # get rows of Ds corresponding to t_unique[k] <= yind < t_unique[k+1] + Ds_t <- X1des[(t_unique[k] <= yind) & (yind < t_unique[k+1]), ] + ind0Bs_t <- ind0Bs[(t_unique[k] <= yind) & (yind < t_unique[k+1]), ] + # for the last interval: include upper limit + if(k==length(t_unique)-1){ + Ds_t <- X1des[(t_unique[k] <= yind) & (yind <= t_unique[k+1]), ] + ind0Bs_t <- ind0Bs[(t_unique[k] <= yind) & (yind <= t_unique[k+1]), ] + } + # only keep columns that are not completely 0, otherwise matrix is always rank deficient + # idea: only this part is used to model y(t) at this point + # also delete if not perfectly but almost zero, for all spline bases + Ds_t <- Ds_t[ , apply(ind0Bs_t, 2, function(x) !all(abs(x)<10^-1) ), drop = FALSE] + + if(dim(Ds_t)[2]!=0){ # for matrix with 0 columns does not make sense + ## DstDs_t <- crossprod(Ds_t) + ## e_DstDs_t <- try(eigen(DstDs_t)) + ## e_DstDs_t$values <- pmax(0, e_DstDs_t$values) # set negative eigenvalues to 0 + ## logCondDs_t <- log10(e_DstDs_t$values[1]) - log10(tail(e_DstDs_t$values, 1)) + ## logCondDs_hist[k] <- logCondDs_t + evDs <- svd(Ds_t, nu = 0, nv = 0)$d^2 ## the same as eigenvalues of DstDs + logCondDs_hist[k] <- log10(max(evDs)) - log10(min(evDs)) + } + } + names(logCondDs_hist) <- round(t_unique[-length(t_unique)],2) + } + if(giveWarnings && any(logCondDs_hist > 6)){ + # get the first and the last entry of t, for which the condition number is >10^6 + tempL <- names(which.min(which(logCondDs_hist > 6))) + tempU <- names(which.max(which(logCondDs_hist > 6))) + warning("Condition number for <", xname, "> considering limits of historical effect ", + "greater than 10^6, for time-points between ", tempL, " and ", tempU, ". ", + "Effect in this region identifiable only through penalty.") + } + } ## end of computation of logCondDs_hist for historical effects + + getOverlap <- function(subset, X1, L, Bs, K){ + # In the case that all observations are 0, kernel is everything -> kernel overlap + if(all(X1[ , subset]==0)){ + return(5) + } + N.X <- Null(t(X1[ , subset, drop=FALSE])) + if(NCOL(N.X) != 0){ + N.pen <- diag(L[1, subset]) %*% Bs[subset, , drop=FALSE] %*% Null(K) + }else N.pen <- 0 + + if (any(c(NCOL(N.X) == 0, NCOL(N.pen) == 0))) { + nullOverlap <- 0 + } + else { + nullOverlap <- trace_lv(svd(N.X)$u, svd(N.pen)$u) + } + return(nullOverlap) + } + + cumOverlapKe <- NULL + overlapKe <- NULL + overlapKeComplete <- NULL + + ## sequential overlap for historical model with general integration limits + if(!is.null(limits)){ + + subs <- list() + for(k in seq_along(t_unique)){ + subs[[k]] <- which(limits(s=xind, t=t_unique[k])) + } + cumOverlapKe <- sapply(subs, getOverlap, X1=X1, L=L, Bs=Bs, K=K) + overlapKe <- max(cumOverlapKe, na.rm = TRUE) #cumOverlapKe[[length(cumOverlapKe)]] + + }else{ # overlap between whole matrix X and penalty + overlapKe <- getOverlap(subset=seq_len(ncol(X1)), X1=X1, L=L, Bs=Bs, K=K) + } + + # look at overlap with whole functional covariate + overlapKeComplete <- getOverlap(subset=seq_len(ncol(X1)), X1=X1, L=L, Bs=Bs, K=K) + + if(giveWarnings && overlapKe >= 1){ + warning("Kernel overlap for <", xname, "> and the specified basis and penalty detected. ", + "Changing basis for x-direction to to make model identifiable through penalty. ", + "Coefficient surface estimate will be inherently unreliable. ", + "See Scheipl & Greven (2016) for details and alternatives.") + penalty <- "pss" + } + + return(list(logCondDs=logCondDs, logCondDs_hist=logCondDs_hist, + overlapKe=overlapKe, cumOverlapKe=cumOverlapKe, + overlapKeComplete=overlapKeComplete, + maxK=maxK, penalty=penalty)) +} + + +## measure degree of overlap between the spans of X and Y using A=svd(X)$u, B=svd(Y)$u +## code written by Fabian Scheipl +trace_lv <- function(A, B, tol=1e-10){ + ## A, B orthnormal!! + + # Rolf Larsson, Mattias Villani (2001) + # "A distance measure between cointegration spaces" + + if(NCOL(A)==0 || NCOL(B)==0){ + return(0) + } + + if(NROW(A) != NROW(B) || NCOL(A) > NROW(A) || NCOL(B) > NROW(B)){ + return(NA) + } + + trace <- if(NCOL(B)<=NCOL(A)){ + sum(diag(t(B) %*% A %*% t(A) %*% B)) + } else { + sum(diag(t(A) %*% B %*% t(B) %*% A)) + } + trace +} + + +## use a penalty matrix with full rank, so-called "shrinkage approach" +## after Marra and Wood (2011) Practical variable selection for generalized additive models. +## code taken from smooth.construct.pss.smooth.spec() in package refund (written by Fabian Scheipl) +## which is based on mgcv of Simon Wood, e.g. smooth.construct.tp.smooth.spec() +## function with the following arguments +# K sqaured differences penalty matrix +# difference degree of difference +# shrink shrinkage parameter +penalty_pss <- function(K, difference, shrink){ + + stopifnot(shrink > 0, shrink < 1) + + bsdim <- nrow(K) # ncol(Bs) # number of basis functions in Bs + ## add shrinkage term to penalty: + ## Modify the penalty by increasing the penalty + ## on the unpenalized space from zero... + es <- eigen(K, symmetric=TRUE) + ## now add a penalty on the penalty null space + es$values[(bsdim-difference+1):bsdim] <- es$values[bsdim-difference]*shrink + ## ... so penalty on null space is still less than that on range space. + K <- es$vectors %*% (as.numeric(es$values)*t(es$vectors)) + + return(K) +} + + +###################### expand.call() is taken from R package refund 0.1-15 +# Return call with all possible arguments +# +# Return a call in which all of the arguments which were supplied or have presets are specified by their +# full names and their supplied or default values. +# +# @param definition a function. See \code{\link[base]{match.call}}. +# @param call an unevaluated call to the function specified by definition. See \code{\link[base]{match.call}}. +# @param expand.dots logical. Should arguments matching ... in the call be included or +# left as a ... argument? See \code{\link[base]{match.call}}. +# @return An object of mode "\code{\link[base]{call}}". +# @author Fabian Scheipl +# @seealso \code{\link[base]{match.call}} +expand.call <- function(definition=NULL, call=sys.call(sys.parent(1)), expand.dots = TRUE){ + call <- match.call(definition, call, expand.dots) + #given args: + ans <- as.list(call) + + #possible args: + frmls <- formals(safeDeparse(ans[[1]])) + #remove formal args with no presets: + frmls <- frmls[!sapply(frmls, is.symbol)] + + add <- which(!(names(frmls) %in% names(ans))) + return(as.call(c(ans, frmls[add]))) +} + +safeDeparse <- function(expr){ + # turn an expression into a _single_ string, regardless of the expression's length + ret <- paste(deparse(expr), collapse="") + #rm whitespace + gsub("[[:space:]][[:space:]]+", " ", ret) +} + + + +#' Function to Reweight Data +#' +#' @param data a named list or data.frame. +#' @param argvals character (vector); name(s) for entries in data giving +#' the index for observed grid points; must be supplied if \code{vars} is not supplied. +#' @param vars character (vector); name(s) for entries in data, which +#' are subsetted according to weights or index. Must be supplied if \code{argvals} is not supplied. +#' @param longvars variables in long format, e.g., a response that is observed at curve specific grids. +#' @param weights vector of weights for observations. Must be supplied if \code{index} is not supplied. +#' @param index vector of indices for observations. Must be supplied if \code{weights} is not supplied. +#' @param idvars character (vector); index, which is needed to expand \code{vars} to be conform +#' with the \code{hmatrix} structure when using \code{bhistx}-base-learners or to be conform with +#' variables in long format specified in \code{longvars}. +#' @param compress logical; whether \code{hmatrix} objects are saved in compressed form or not. Default is \code{TRUE}. +#' Should be set to \code{FALSE} when using \code{reweightData} for nested resampling. +#' +#' @return A list with the reweighted or subsetted data. +#' +#' @details \code{reweightData} indexes the rows of matrices and / or positions of vectors by using +#' either the \code{index} or the \code{weights}-argument. To prevent the function from indexing +#' the list entry / entries, which serve as time index for observed grid points of each trajectory of +#' functional observations, the \code{argvals} argument (vector of character names for these list entries) +#' can be supplied. If \code{argvals} is not supplied, \code{vars} must be supplied and it is assumed that +#' \code{argvals} is equal to \code{names(data)[!names(data) \%in\% vars]}. +#' +#' When using \code{weights}, a weight vector of length N must be supplied, where N is the number of observations. +#' When using \code{index}, the vector must contain the index of each row as many times as it shall be included in the +#' new data set. +#' +#' @examples +#' ## load data +#' data("viscosity", package = "FDboost") +#' interval <- "101" +#' end <- which(viscosity$timeAll == as.numeric(interval)) +#' viscosity$vis <- log(viscosity$visAll[ , 1:end]) +#' viscosity$time <- viscosity$timeAll[1:end] +#' +#' ## what does data look like +#' str(viscosity) +#' +#' ## do some reweighting +#' # correct weights +#' str(reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), +#' argvals = "time", weights = c(0, 32, 32, rep(0, 61)))) +#' +#' str(visNew <- reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), +#' argvals = "time", weights = c(0, 32, 32, rep(0, 61)))) +#' # check the result +#' # visNew$vis[1:5, 1:5] ## image(visNew$vis) +#' +#' # incorrect weights +#' str(reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), +#' argvals = "time", weights = sample(1:64, replace = TRUE)), 1) +#' +#' # supply meaningful index +#' str(visNew <- reweightData(viscosity, vars = c("vis", "T_C", "T_A", "rspeed", "mflow"), +#' argvals = "time", index = rep(1:32, each = 2))) +#' # check the result +#' # visNew$vis[1:5, 1:5] +#' +#' # errors +#' if(FALSE){ +#' reweightData(viscosity, argvals = "") +#' reweightData(viscosity, argvals = "covThatDoesntExist", index = rep(1,64)) +#' } +#' +#' @author David Ruegamer, Sarah Brockhaus +#' +#' @export +reweightData <- function(data, argvals, vars, + longvars = NULL, weights, index, + idvars = NULL, compress = FALSE) +{ + + if(missing(argvals) && missing(vars)) + stop("Either argvals or vars must be supplied.") + if(missing(weights) && missing(index)) + stop("Either weights or index must be supplied.") + + # get names of data + nd <- names(data) + + # if(missing(idvars)) idvars <- NULL + + # drop not used entries if both argvals and vars are given + if(!missing(argvals) && !missing(vars)){ + + data[nd[!nd %in% c(argvals, vars, longvars, idvars)]] <- NULL + nd <- names(data) # reset names + + } + + # define argvals or vars if missing exclusively + if(missing(argvals)) argvals <- nd[!nd %in% c(vars, idvars, longvars)] + if(missing(vars)) vars <- nd[!nd %in% c(argvals, idvars, longvars)] + + whichNot <- which(!c(argvals, vars, idvars, longvars) %in% nd) + + # check names + if(length(whichNot) != 0) + stop(paste0("Could not find ", + toString(c(argvals, vars, idvars, longvars)[whichNot]), + " in data.")) + + # check for hmatrix and delete in argvals or vars if present + whichHmat <- sapply(data[vars], is.hmatrix) + + # get dimensions of data + dimd <- lapply(data, dim) + isVec <- sapply(dimd, is.null) + + if(length(vars) == 1 && sum(whichHmat) == 1){ + + n <- nrow(attr(data[[vars]],"x")) + if((nalt <- length(unique(getId.hmatrix(data[[vars[whichHmat]]]))))!=n) + n <- nalt + #warning("Dimension of hmatrix is not equal to its corresponding attribute.") + + }else{ + + if(length(whichHmat) == 0){ + + if(is.null(vars)){ + + if(is.null(idvars)) stop("idvars must be given if vars is NULL.") + n <- n_variables <- length(unique(data[[idvars[1]]])) + + }else{ + + n <- length(data[[vars[[1]]]]) + n_variables <- sapply(data[vars], NROW) + + } + + }else{ + + n <- NROW(data[[vars[!whichHmat][1]]]) + n_variables <- sapply(data[vars][!whichHmat], NROW) + + } + + if(any(n_variables[1] != n_variables)) stop("variables imply different number of rows.") + + } + + if(!missing(weights) && length(weights) != n) + stop("Length of weights and number of observations do not match!") + # if(!missing(weights) && sum(weights) != n) + # warning("The resulting data will have more / less observations than the original data.") + + # transform weights in index and vice versa + if(missing(index)) index <- rep(1:n, weights) else index <- sort(index) + ## computation of longvars needs weights + if(missing(weights)) weights <- sapply(1:n, function(i) sum(index == i)) + + is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol + # is.wholenumber(x) # is TRUE + + if(!missing(weights) && any(!is.wholenumber(weights))) stop("weights can only contain integers.") + if(any(!is.wholenumber(index))) stop("index can only contain integers.") + + ## check that all idvars are equal + if(length(idvars)>1) + if(!all(sapply(data[idvars][-1],function(x) isTRUE(all.equal(data[idvars][[1]], x))))) + stop("All idvars must be identical.") + idvars_new <- NULL + + # get names of hmatrix variables + nhm <- vars[whichHmat] + # get all names of data items, which are neither a hmatrix + # nor supplied via the idvars or longvars argument + remV <- !nd %in% c(nhm, idvars, longvars) + # remove those + nd <- nd[remV] + # the same for isVec + isVec <- isVec[remV] + + # if there is a hmatrix in the data, subsetting is done by reconstructing the hmatrix appropriately + if(any(whichHmat)){ + + # construct a list for new hmatrices + newHmats <- vector("list", length(nhm)) + + ## construct the new hmatrices + for(j in seq_along(nhm)){ + + ## check that idvars == idvars[[1]] and match id-variables in all hmatrix-objects + if(!is.null(idvars) && !isTRUE(all.equal(c(getId(data[[nhm[j]]])), c(data[[idvars[1]]])))) + stop("id variable in hmatrix object must be equal to idvars") + + ## subset hmatrix + newHmats[[j]] <- subset_hmatrix(data[[nhm[j]]], index = index, compress = compress) + + if( inherits(data[[nhm[j]]], "AsIs") ){ + newHmats[[j]] <- I(newHmats[[j]]) + } + + } + names(newHmats) <- nhm + + }else{ ## if there are no hmatrices, set the list and corresponding names to NULL + + newHmats <- NULL + nhm <- NULL + + } + + temp_long <- NULL + ## do the indexing for the variables in long format + if(!is.null(longvars)){ + if(any(idvars %in% longvars)) longvars <- longvars[!longvars %in% idvars] + ## create weights and index in long format + weights_long <- weights[data[[idvars[1]]]] + index_long <- rep(seq_along(weights_long), weights_long) + ## indexing variables in long format + temp_long <- lapply(longvars, function(nameWithoutDim) data[[nameWithoutDim]][index_long]) + + #### create new id variable 1, 2, 3, ... that can be used for FDboost() + #### always generate idvars_new, even though it exists already because of a hmatrix object + idvars_new_hmatrix <- NULL + if(!is.null(idvars_new)){ + idvars_new_hmatrix <- idvars_new + } + + temp_idvars <- data[[idvars[1]]][index_long] # compute new id-variable + + ## gives equal numbers to repetitions of the same observation + ## idvars_new <- c(factor(temp_idvars)) + + ## gives different numbers to repetitions of the same observation + my_index_long <- index_long + my_temp_idvars <- temp_idvars + i <- 1 + ## add 0.1^1 to duplicates, 0.1^1 + 0.1^2 = 0.11 to triplicates, ... + while(anyDuplicated(my_index_long) > 0){ # loop until no more duplicates in the data + my_temp_idvars[duplicated(my_index_long)] <- my_temp_idvars[duplicated(my_index_long)] + 0.1^i + my_index_long[duplicated(my_index_long)] <- my_index_long[duplicated(my_index_long)] + 0.1^i + i <- i + 1 + } + idvars_new <- c(factor(my_temp_idvars)) + # regain 1:n ids format expected by FDboost + idvars_new <- as.numeric(idvars_new) + ## check whether id variable of hmatrix-object and id variable of long variables are equal + if(!is.null(idvars_new_hmatrix)){ + if(!all(idvars_new == idvars_new_hmatrix)) + warning("id variable generated for long variables and id variable of hmatrix-object do not match. ", + "Sort the long variables and the hmatrix-object by the time variable.") + } + } + + ## compute idvars_new in hmatrix-part or in longvars part, but add to data here + ## if idvars exist, subset accordingly; + ## idvars has to be the same for all hmatrix-objects and response! + if(!is.null(idvars)){ + + ## only works for common observation grid of response + ## idvars_new <- rep(seq_along(index), nc) # index = c(1, 1, 2) -> 1, 2, 3 + + for(ifr in idvars){ + data[[ifr]] <- idvars_new + } + ## data[[idvars]] <- getId(newHmats[[j]]) + argvals <- c(argvals, idvars) + } + + inAVs <- nd %in% argvals + + ## recycle data + data <- c(lapply(nd[!isVec & !inAVs], function(nameWithDim) data[[nameWithDim]][index, , drop=FALSE]), + lapply(nd[isVec & !inAVs], function(nameWithoutDim) data[[nameWithoutDim]][index]), + newHmats, + temp_long, + data[argvals]) + names(data) <- c(nd[!isVec & !inAVs], nd[isVec & !inAVs], nhm, longvars, argvals) + + return(drop(data)) + +} + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/build/vignette.rds b/FDboost.Rcheck/00_pkg_src/FDboost/build/vignette.rds new file mode 100644 index 0000000000000000000000000000000000000000..38137b03ebaa3c165ddfeb514f9974b870b922ec GIT binary patch literal 330 zcmV-Q0k!@giwFP!000001LadqOT$1AO`9)UDOL-Dc*!4V{(~5DQ9;Cmx3Wz(xRCCK zY&7)d4;Sm~b~epM3*IH{?97|VyqOpBGIbnh?07y{7hHD%CV(@C@86n|a0%8TDtKES<|58!ZRm9Yu0j%sZ6H3}nm z+S3=I`A}V@lP1~|`dAmD4j8&cCtXl5TINP$Z$m2Mhv4U=A^)LOUo+?U?Tx{V@O7V) z4V9P-O#hUX)D%3krVHH1Bt>^*zFwHnit=u@lRLU?MGdh{G^s@!8?u@Dg+IXTcDv8v cL|I9snaF@swPIY<@IFLe-)9%kG6Vzw0OS{(Y5)KL literal 0 HcmV?d00001 diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/data/birthDistribution.RData b/FDboost.Rcheck/00_pkg_src/FDboost/data/birthDistribution.RData new file mode 100644 index 0000000000000000000000000000000000000000..71cbae6b2ed4758a2fa45c52fd6781091f9eec5a GIT binary patch literal 25804 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 Cr0+%m literal 0 HcmV?d00001 diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/data/datalist b/FDboost.Rcheck/00_pkg_src/FDboost/data/datalist new file mode 100644 index 0000000..2cdc2d6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/data/datalist @@ -0,0 +1,4 @@ +birthDistribution +emotion +fuelSubset +viscosity diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/data/emotion.RData b/FDboost.Rcheck/00_pkg_src/FDboost/data/emotion.RData new file mode 100644 index 0000000000000000000000000000000000000000..3a7704fd0b4597241ce8f6f506f4b877d8767e7a GIT binary patch literal 1092126 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ȻOLgj8dOjq%%CGmF{Q+vUbq#2b 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

RM>Q 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

e{cPt!B#Gq~n<#FEK=aneJ($ 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ΞpRaj|_P8l07{70r5&+U72gB;Jrjy~>sQS+4V<@{{$G&n-ex6-RWYhsY*^ z#QWk(O>`t06lpzXXnhSR&s%uMT5V8i+MwT#T|+2dGNx9J_aRJkjO6ZdeU5s&t3wm- zo5G|G-`Uw9F*Ke0F^MCNAI-ta(Y*)NG5Y}d9;q@D7Qx`%yVq4%z}Z`W(t- zHh0I&YhG`g9?)X?ocJuSDjm%DW+j8*+=977eu-!;Y=i2m--2e{!a!}8;%7YY7^Zd? zcJ>`}0l(Ezi5jo1u()^T`aO$A%<<&Y<`s=8OmBKvX){$227(MYEBkLj%YB*D(Ud=! z<#ifwM{X~szi9Sz`7SL`a%r+$Z8*2+Ynl${=A-Yeu9?v|9ExZ^DJ6?=&WK;;D-kJ zCEsvg{SN)Ek8D=Ih@uoH-|H?WB$z7Vo}ptp4-1A5c6U9gh4DPnGa@(xjhFs3{@4E$ zN{;1v@AgVU#O$ekDR>a(1#gBG%NfJy6aMxL z9bU}zAousco-LShP+j`1`ZUbOPP_=XXadXEefjOPvoJ|e(=gy>9t=3veVz$k*K3{+ zvjTJGmkwc41m^c2^x&-rNK<)UunYi%@I z(9*A-u12tOY@FvfqLF>A5AU5g53~N|SDt=Lh4#onN2-k;n#GZ|b% zQ$}R(jPq=$Me0af^_&bepO3oN@-QD-8hRNV&GHG3?F(x8#3(^(7wKzbZ$*>A`Og@g zjnIJVC7yHVo?;%?gA1GUPGfHKfOexjcQLP2ob2b1?=bg^zrw$H*7@!G_^SP9Utsq0 z|Lf!BOc)=P4U$}6zerT4j|L64eP8hbL+BJrw`;vR4Y|~RO#+Yiz%(C|1=k^e7~c7+ zj!9h`HS65o!rMoMDvgApS{7bt(dzi^*7^!9b;*iR%>B^{pA5a1u`HszY*9_xiU^^= z|Ie5CAXeo{_z?_;+AFgr2{e67w)q2WMk^t&n{NE8!Q8GpI-;)`VSdGyB=h<>f|+Z0 z_51MJ1|MT}*(Zbr>8@P0X^O!@TjD0y0%>6`XV4-?mj~+aI_sWP{0^O&H_k;@`~j-b z#e9>8A*f~Ygw5sNI)rCFU)K!&f^sf~oACWy$6YrKkMeR|^yiIJ z{xN`=#%N~wYMU_W5m!>P4h!njr>)-U@_2omQv-KNjG!5|;gtlLH7NLR`@079s9(jm zBBo)kc%N(@_Z^fbxHHLRk`d}BbuI-?*kPK%JGo~2Juvz1icbHe6Be|Z^ROK!4g6Wd~_xHJ9#_Mov(_)qv3!hnncVNzUi5i^cyD*dGVLEhEA2Z$DD;u~e8uOeK z72%Q#!sMIdrZcxc!lds;+m!;$aaK+i(-y(pl25P2Cl;7u*45%MRY#wMC<@c;{b-^j zCRmGk7$ukA&Cj36gvOCu+XpVX5-cY}Sf0xMLSI_uD?VRXKt0YOOi52p!sHK%_H0rY zW<0w2g|PiJ=46_<8GK^}HSYMhu~7qq+#{NEN1|X=lzp}6p%kXC;nE1;J_8f;%K|2$ ze$acZ)MapQ4q7a-bKi857LD#zjO6vHL6w^CZE6x*QP)MihcsJy(6Qta^+3N9(7xmO z?O%ez1nm`u)sO?<(2!m?&8mtFOwt?u{)+WcDS0X|X4g+h&3gEc%h>{^uL+CqKBtNr zB+hV49b14YAwetUxpna*P= zmr7V*LWQiE8-EOb(1pJfH>JX2g-E(<0w3nQWyWo-SA*%DyRVzT8|aUch!@#20zHOP zh3wXkFpJ9SeZw?c%$QhujrL0b^nSEHwvd^E$*y^qBqD=h%0{Zgak>^pL=Mh*hg!nY z(43y@sXGM23oF%NbhPY2 z_e(Nn+StArP{K_3*1nVW7h&$i(eXp2!mz~eX>h2*1=D6++@Bg300TltyBMsZF~j$l z<%=~on5JbT_MRJ2-nCCQUDJaRy^T1lB}^|lbjm+U9y8VrA2!pHLsa{!C1?MSXq%?5pZf96FaOa$-lUJcNNqUU0EWA?mgI>_{ffzft?aro|uzx)Mg zLL};PU%eb^`H^|JXeU2hERucF{iqt6_35YQ?f(#L7Zcu2yIK=;_Y-u79bY2~F!WTm zYNFmAyG6n5Nz7ApEJSG71(OwQZrq6%$2`aV3(-^+=KekyS-_Hpx#V}5ZMNpZ?BAcB zlF9VN90Mzf2f0)*=hZNN&2M*5Z>+GS@6Isj`xZ)bsz?ip;deoG<}R2qudNH$ya$uL z4#n3jKcK#q*duwnTA}hpm&fAlJhY!3JE^NGfaWznjdDJ?hSrwfdD1*Pg(fvy!apcs zLRf2m*pqvDXx38CTf4}Hpx@EBjckR`Z1W9{cF{_-94T^6A&9`-`S!Ji4y%}-S>bg% zxs70&WzvaQh{Wu1$68LrQLw;QjqFT_!a`#6%8j>~VU`kh`+6LPjz?ix`75i?HAVWV%6XkqS&@Y;v~{P}lY_+WuEP<~m=)=7CH z3XbgdH;P2#2an`AsZ7B1k>&jp_Ge)6Ovc}^hGv*6c;;s{eF@WKk@hyFhhWl$?4v3c zZJ3;xXJ5Og5;G6zTi%N~hiL~-uymMcq47QUdmn^W!Jylu;b}W_G<|2s$jS2>D0XS! z%Cn=9Xjt2m^B|oJQ0*(KY=3M*)tAy&#nU_?H*!(OM~1XsAD&U05-=uT_@95Q;BHCt z%U3pG4!6AAMdNLlfh!%%`$<}y#2EL$Vg)@vU){852m^vV9K_vt07R&?wn+wh}qm#VxP z)lQ(y8?AH)j$(!)ef=DZpO{N3C!Fck7Sz}*`8etFRv7&&ORw@)2NwRx7++R&!=(6Q zKguikfg=6V->R+v`W)RK#$1s@OBaG-&Wr6q6Npi+{40KOh9?l#=iKHhoJRf36nKpM8n3OM%Ub2Ve(<3%fGKfD5ux*cVCSHl$IOZS+1Uk z>4cZVZNY&EpL&E{DfKXQ5({{=UPt2+cD@&TqR`y6EA-YiXE6sWO=UvNHJJT6xXho& zjD_jaE%fF}F|Cb_Y~djl%<}O+BR|Y?Y0K8Rdpej|#N?pIz(-8(Zdy4O9Sg0=2iXQ% z&jWRs#yw_G8zxRI&(!=&fZ*e|?tduGg{7lS+vmSfFz5B5yR|Dbm|M48xL}eHa~*mr6SEhh9-;b9;oDnM049reeY&-i6V_Z7kNA*AfzmN@%=%s= zn%y*Z+tTqMl6(O1^?=X(o=FttDd8N{8!54=JFshL=V% z#lqNU-tFHE12NO&_lHZPvzW<7m$6^sEzIR!*Z?M26y=n-AQ+5kTw9mydj_G`?Sg(F zT`H!}KBGO5{TV%21ZJcV>~Z5GX!bZo z(^`}kjT@TSJF}J$?3PzI3~JC?+JxnEl|1NfwdwG?dj_SkjYQCXlR}ibR%R~QF9ZX_ zs=myF2{e{qVtz2?Cu(ROjZ4jOM;!)CL29lkP%#s{<$g;F!SeQr@7a7RLI0N5_WS`} zM7g7Umffxnbu@YgP30S6o+YWDb`BDlN9auG<+baWd@aFFy(k-#8CW{ck!Uc7xWc!s z_o6WSBa8b*IY2i?AnOBPBiK~WtA1bTLcDe9;YlmNQK;!x{O@62VthG zSvOtb);h0sGv&iW58zHPm3PYvu1yM22DlVR8*MPfoq*``UmazEpe@ z!M`AmPc?omyB;lDaY=73ypKl9X2M>`{D4%d#4B2BcC^5B{WP5n8Ok(frgy4F!jxmk z^_;AJG#QJZo(|oP##?W|?+dOl-G4GRqwXFoT7H<6l}UxU)XSfFPBdcLha&tcxvZF8 zyO37bA}Z6e3>5`0;P8P=qMV?+C1IEM`V6)8YnKr~2U8(T!YqjA;(n)FfP$#AL(J#@atj zSdcud!(HWwIYSllO`AVp#t*6~PNK`0n~Ua@eg0<5tkKS*+$@1PiceTO@g!p=_wv@% zP$$e7dwBV$#6irfbJ(4ZGkIMvB#Fj3zJrlF+pjBbzYgP!8y6Vg1J(b2)b$K6n53PI z`T4*JHPUg9Tp8s;L$xjR$jStLX1*zUK|CGmB+3u!r05cK+0|VK#uQN7sps_43+bry zF@4MTD5j$PJI4@YhHyB{k${DaAiX{IAL6JYMk+`;e0 z&oJ%JJB`1!hJo^+@%?;RKlJqzccRZfN6VYw)#oF*h%#g;^WYu2fF z=&T}$SYIBPC*A&#y8kOo{@lGqkVX=HOn4k=ZR-Y0AqT_u?zw zmd-#wx9YbO-YPJ9yCI|D<_*kzZ<8O>&NG;G>gi8oJ!a@UnrYBFwTj7II*HeU4Pk

=Bdg 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 n8aLau=s@R%X2z^8Hts~w$$dNE-p##exzQ(C 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

^K6g_oFNJ6o=HKMb?n%=)ENSWRpQrF z-K9$U9mZU!o4v3t_ZSnV;&I513h@O=zMA^YyjJw@2=7pZs|F^KEW6_7TZm1`<&rlK z*olR*dH3qOGQfSqj|S*&qhVRDp>O{DAl4*JeSB~b#AUa3y;chVG0kHN0~fN0wzn}$ zKMesy=+6bIPTBy4r&eN#{kkpl) zswP%-Z{OeyH^7|Vk{?HRT*K6EIl@vyZ;8JlDXc1qlbDw0iQL;4Z-6rSt=J~>D-i9S zT&JH}Mss1jUv6s@U@9ji^|Jq_h#Bt8jkYpXpyJQ|&@0~zrpJRw^xe^cVmdNn$Y z^WIo;p!D|AQD}Hl~Er)44v<2!=Igpq4v#)Ff1IJ&xvjJCM14mi! z;GJ_mm@^EEUa-r+yvdWT470)@!ED<8Y8GBBouVdIx0Si)k?ZsG1uuS7(3ubW@R!jFl6n%shDsprEDQS=E!^9{deYkw!&Ud+h;q&h?__g#I+l|@6$s4w-$CG-Hbm&aL?Z|ay?G5+hv zky^~jebuDf>?JTM8oI0ezCet{61Tay<$3qj<2`opoFqabos>dv2WF%ZbT zyJyWOl~_+^Tbz5_1X#;SZ06`J`d=^Vdn z45Vi4Nn<+FXmt*EjrFUd2KxO**LR-;X4QQZf3PkH7mL0mhwdU)@97oVe*A^`^OvNp z7OnxiY1X|DC$3^{N1cv(OA5?I->e(A_zz^FN8KD+TY&1Y^+XL;1BUzm?o_Eh!yLMr z$+DMJQR5jAr8i_}V3+*3fAN_K=K5|aT4;C_#MF&{@m<^nVzY;qlnaxAa-DA4cW{bW zaI!kdbB2uOb)T1DVM?HQ6{s<4egXY?uYF6;!t*Li9K;)=#2{+G}qEU&EtqRwV#fu?_UM_ zmtu5R8t-A!-kO?&N3&5OHRH_1*Vb#ys~7Sd`TwiLwv9^R)MXp?nxn)b2WvuvQM#4>cU71ZJ_&wv40t;9J;z z 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
    >thH*#ZtGY<^-uS!LlB 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∈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

    ls}@5Xa#9z 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�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%0DdNR-AiAWu)qIs<_c?bY+>SOUEzUW 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 literal 0 HcmV?d00001 diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/data/fuelSubset.RData b/FDboost.Rcheck/00_pkg_src/FDboost/data/fuelSubset.RData new file mode 100644 index 0000000000000000000000000000000000000000..cc343b9be371113f641275c3df66de2f6fb7c76d GIT binary patch literal 256609 zcmV(^K-Iq=iwFP!0000021H#2SX5ot#V+jb?rz1{*Dmbt?rto^mXHQTknZk=H82bv zGqkOg5@KWPKj+;0em~Fiy?nwjbMLt)_Fj9fwO7sEFs}KA<{BCr^)(vQQ~$St`u{ep zul`RxjfNV{)Zd%$JG=MD>a)8}?>(dbb$j(snyCNRO8viUf>z4=N5Lao3Db1)|9lRg zFHA0KKI4Q-kuYv}ea%JD+k~+D1ugXt8+Ne}X8Ni>bs`DlUAwSf2vf_%?=)j{H;4H1!j!Yu8mr$? zn09aZ%V~Qy30-`@^zJ+Iyg(Y_=S}^izWU}f1e(1x_oLTuVOmY5`YTJAl*Zonil9|r zS-xYIzA$ajKK3O{yW`*C;_HRN)RhNL1@=)0lkI;z?WZgkhU`ePbt_#XOuO{vh~XS- zfzGIhXP&b#%|rc9t82oP0pfLO9amr0xin$gr;lF0-W(OirhZK{*)mj^c3M45o$d&e z9<`DRPeJRFTj}a= zIl_oc@%qR1w_-OgOnkbBJrF_bt@t^U?ugejW-|M@;s1YKy)VBrJ8)VUdy#$MU}5U3 zS?V`V5$KC_AN$46ot7(Jx7OZXkt?fj3Dd^02hml~x*>kv^z(e6g_+VgOlvESla@vJ zJg4*ofehGmX)esr6USdGjZY+D+J=?vh6Sx4@%40AoKNF_ItQ2jI} zYYWq*zn>`==hw^#@pH9?s7FhuK+sw*{(I_p@pGq--ZDfz0>U(7aolEh7Vm#rT|+hi zf|iwfc!tyoG({Z$X>-+&bM<#&>Sy)n=>8O@Pg6hT9kYe$BgFYOO-G!E)AyFL3lOGj zisMewyeDa%Pd_Mr*YcHq-&maA(<;RIL~i0ZPLH2R>L(yj7ja$9)c>U(z`4TI(QMlG z6vodK=b4t7`u6hw3X`RII9d91*y~)|2@R{32>m?=w9sj=K$wst-uL)%$JmVv z<4VQx(sC5XZ<-7HwnCU>!`^;}Fu6cnFN5vapKTHPdWq{`P#{|-Cxz*M`Fj1|eo%j( zcpptQ_?Mueap0+;?@9V&!@eF04SFpVgXt;ElxAAIXL2r-6>sm zqup_#jn*$+(|`AcX4lUSoZsACX!CVri1P9+q0zrx;r>_Fsqahu@~xRdy=M7VU545G zHx5FNTjKm_wNl(KG^fg{-~F5`bo?sL=l`Bh!~e!p`nzV*^Jy;q{(tu;jc2vAuQwH+ z6P2^K`zog@@qYgsKcSH{Uf;He^QE!$d_GC{+gSShui`ihU8K+NBEFtJNY7DvPC{ep zeH)0^BXkn)i|VBL(n`9oj?(9KlHRwW^c?_Z;_xz;m*ZA+d^!Y!edGX(MeUrvdTEEhM@J7&YaPCamo&$n@=Ot4#Xn~+VoNoQ@ z`AX2I)!u72P8al7-}!j4_MM==|Cy(1ah0Hdc~!6Q{uYA1>09TU2g(I~H^-X~=5G-6 zqc3*+KC`EwpL5nL$-_#}FSD@do^fB$|B*lF?%p`Tp!MV^A2&V0U_iXfEZ;?ff!4uk zgZi}-3|35jvfF8r}e|m2?m#EKe#wkOE56MdhAWMkznBYIySp;8^HhvU!~h! z7Yqu!OzT55cfOWw(jF!vw?bntQ*Vsuc{!tv}aBZ>eCoC_QLTw*tX% z=RUo0ZCeP27lvyOnlxE3H0yfxOV>Suq1V{Ef47zjh6$(hYwS%0!^f}kRys5l3_t07 zT|A>iFlsT~@8BG0>I|U2f_IL)>U6mjucENnhyBXB@PYGhjUd6a!^UXHu#^@-)6m9nOFLV@4mCr^z2oDrYOR_#3yf{@b{ZcV> zSLbztS(AaQy#}oo%(@!ByHaK-n2qRmevbKL!EC1L^u0cp1hbVv`-k?MEtu_zemtsk zBf;!^?drz=ehFrV+B@_XX9;HZ1twRc&k1J11}FD9zY@%n58L!>YA%>PxnO71^ORs# z8`fda#z4WmK`+}O_xlUxox^iX&Fc&1BXn1dEhrYuXPr$>?s7yhU-u~QZ=+Db{P4H_ z=GT;h`L*jizYFDp`F(*Z{mKM$zp*D4>^m!%%h!21ow_cVKMr(zCqE&We-QfF84M9D znlyUl*UL_@=vCiUu4f=vOq@J<=IIB5g|_RSWiy%!7JC-|a`l@pSX>^SJJiEou&`VJ z@4z6z!q>skxTdRMp_s7N;M+&R;zeV5Os%P4@vU>dd}6*}+2+8x(tbAu%b`CW^*HlU zu$+@g+EHnO<<{4mmRd#%mO4}4J1MUTmgYrGcJ=KbSo%fz1*qhLWopS6r^RuCW!dV_ zUyeEoRvInSCUmP4ta`M)|Dxo%U^QijzHx02!D`K~?EXXKg4M|~+sfEmf|W^+(HZ6D zf|ajJ=Fe7d1grGR=;?7uuzKsc{&qw?!Me%d_uDk>1?z#o-)wkOEm+SR;!)e#P_W+P z>tys~rC@#2K)b*)O|W*A56eF`U$9neP|SE!CRkT!`}f?kM7ZC?@%oyu3gQ0HwG}rm zo)GRYIi`On+eNs4v}V9$^*(doRC&RtfxB=&wCDP}*d^RA%C}zE=b~``*Y~bz;~j+u zee_kmdSnX^<{3sD*I6VyIP@>?ShKmp1Jk!!OD84@4!KTrP z$V{&_g3U;wtMhn6!Dg-T=lOHY1smP%ez{&zf{jP0?00auV52e(wY;=hu=!Qjx7pBm z;o+b+0h1Qm2oF~s=>DpHAK{_y#qkx1fx<(dK1J!>jf98A+kTmx9U<5@p6qcz{zb5z z;P-v!*A9a1ZbjdYyW<603%x`8{YDD5^3n-QW_}ZFzkK)_HfXtEH^@&&GYc2&Hg=DX zlx+~~jD+#u-YgRAWWDsZUil{2eTjDLE_*IK8rH=(xk*dm(T?dacAha79^D^qbj`W7 z@F=@-^vMD}!M@4Gorh0-7VL%67cVegu)j3SF!0Dw!9INTv4o5lg8ir65%X=P2@a!o z#I1N)BRCvg(O{qIzTn_HdCG8?&w@iuk10KFHxL{kQ@09^8~#Mh zoU~DJywsv`tmy*5@sY=tPp=OOj|Vus z!D+Si%l@OB1g8tnChRpkDmXc2w%7c1NpMO%^!>M^vEcL}&S=2ISAuibREKsZ8wKY% zW}}jvy#?oEJ@)VYvqx~YIqs&oZYMY^OfOjP^B0^y-Skiy?-yM9tQtA>w1?ob?BA^V zFY*N!UGw#>@3#mp0qq9n^|26KUfps||MpFAZTF>hi`||u_ipcj)Bfqpr+J)1iaM&S3ON8>vs>A(FE&6}?5UEoKDzLH z^Y_}t_);nv*y(A@;xUL?l>Vf_k?xc+<;nEEU35t`V+g;r#Hw{6hl;d-dqmow{A zyJFmYeSP2gk=x+D;bBIqEQbnYnL3qqUI_eLlR4k24Y`FsbG*9mEj&vb&JTYSPDd`s z$z;phA#tp0Ty*nQWchd3$yPf$Ayk-napH=(c;~&?sH64+ioKT=a@oe8vhTShw!QO~ zvZQzi)dSo;&lb=r`R&|yIs#?KO`p_uLL#vL4547cCk>iQUd-wFrMlsZ!qI-qmwK@cgL=sx_M( zQvVxLeKha7>MALB>D5+w#hb`wM~dvr%5#W6YkjL-|1NlC^>Xi8#VC5@)cEY)#?>Sj z<99^5HX6C_&;umR!KsszTuHTW@a1_Ku~2OI@?)CJ5snw!ni!T}Ci#R}F-GIOsBqV) zt*^Iukn;+oX2!jyA?JR?ti?-*Bk0#o$5BmJB4DiUU(HuhkPW>*!#+iW@}^vR_F>Fb zQhCITu31+|$q&7?RQCo^)_^`IB6DQOw&nReB{}u`S(vegoIX!Exx?xRIWN5NXGOpD zq#E7Gqv^YH%49H#TPfwVJ@vkM`6NnMGTKY)+fv-q2;Efv&y`+8?7&u?Yoxf=F1phj z7b^U;Wk#(|7wGzzXlO<5CeMwFzkDd3M=@>IM%qm6OR`9<#~+;Hk?}O_(X(C`DEG!g zjK9-~t~5Hb!f>3D6zaj=f4(V&^xj%LbqZftS#0lTU;@P# z?;0_${sD^5=&<*#`9LJ!i;PZblR?oZm!2Jx@f)sAetT9%jUmOAS!ZTi&xF$W>em}? z(@}NzbAKJ5mME>a+;D^OBubxqc}!koXIMz|LdMH z!-YC33_f>8wR-}E)%WqK%CCdR(05Z;zi>t9)Y#}T?K+ce!v0HBx6DSe@g$R`^ZSr% z`qta>d<}Xn;&Jd8@nwywogXFLG_2k{av4Sbo)i3hvMwe5c@byYGtr2e_(moZj5$z1p1a6B*Xa96Phf1sI&kJ8^Q&jtf!F?|DpoBJ8%m%K@rA#A@ z)g^@kC~Id-qo37D6y0^$>62~BDP`J)yVtw*C9m`)?UpvPhv%j3-QO?Dp_6?Z+)BRk zm%?Ig2ko@5p=;Zwp42LkQP%nnQ5gpokFnY}1S@S`y_wVqiJR*jpZaOxl`6AMt3!XtvUcjI zUf-ru!4Qt0AjtBupkv(uDx=)yKSwtvrHHfT9wN0)xy_-_T}aQI|4 zDd)_xA5(7ydHgYW67_Wxa)%8pE_&1)G4l8R7X}0%xcc7p3H|27b4dHSdb`X>x#CW} zHcnG0whb~U1|{Y4u-bg9qFa^z$Sfe1(Qu* zojSvk@06<>{jvU}X^8mP?$5a7LAX0*ZdJ9df|B~r9IV48@edcTEh#hYE7(r|Ui;X1{|^cpQ2b|0gc%iHk2g#>m`KSw zQ?srO4k5*e(*w;6>QU6kAHM%Qswrj3!aV;2+sI?^vB$Z`vM6bPa%8yGY6_U&s@~%3 zPwATOgs6FAj3{AD^2r0=-y%Eq>iK{@jVbLQJ6Iy%=zRFsK&1l(CZBy6u55vvl?fIh z?uMw8eH<~^eKN}SWSud;(1B9<@zWB1s_pfY3b!G;N&64yGi8(#JXUC5GoLc{e|h@S zWC84lKbSBxqn3>F-;IcOt-gJ9YE!OzJD`$Oi>H*SP{+O{t1$Y^@` z>r4mN+z>deJXvCUcsRv48wNV3+fvlo<&)1wwkPlP4*ln^8-&US12;F=T!6rKIjtWJ z|4Kg1=A3o3Zb_-)byGysbrsgm$H?zu-qX;O9(dG<8urZ!Bwzo>cJXhU!1nd+2NOFQ zQsC+>_WSO9LHz0U6(>p(P<4Ipp}5lDq_`CPS8;SJWm~fYeLwkE_n0%n?INX_jGJr_ zm`Y~zI))@4)~D=O+KtTHOrf~l$EWq3ITIJZYTpVRlmq)mH=C7jX+w&*OMS*>2atR4 z+Eue^CQ$nJVm}{;b(F_;%R_4^@ZgfWmc|bV^AGph(&8amKm4NU8}0}HC5~@rpXmx& z=+A{?x?Ln?&uxpRj5|l+d^ui5gjrUPE9Fg5rV*hx;b=02-#Bz*xJ?VfO}CEO_S<0B z>wsh4qIle&T5{p}v_Q&8cw>Fp-;*A(S-eskZmr!+PWJU7*{HQwUKJjvf=vNBf8TG1 zwa%(ks4;Xdei;VR12X)yoU);*NlV}trZ zY@x(nbALAKFrA8D^815ZvwI6J!IBcM506jxF@W&}{SA-9-qOlg!%0K$gi+$HKMkFK zf1v!6>$3dzqV4^1GOg&lBEK)Rp!tJK8Nqte-*KeH&GjTtBU8k5LmS0lkcO z=$)o?^`t!Vau9+aFMQUvY!sPjb;wTYsX|hZs!uBuEJ+#g`pKmhQ^~Q3&ck_T4Jqc; zpm}8#4wTH#O&4-&{&$DmWD@0$nt4Qf<5`O9eXD5h*E|F#y+}wXRFX26*bJmhwi|4h z<1$+wFXJh^woe0}+rug7))%M2BdjRbZ0KE++ubO+StW}+DM~$h)4r+C(@munNs9ZF z`6Rox_4H6mYSlkrY|v^7P4b-9Q&W#3CnR|KZs|a7#!U~u)E-Wu$)Puk4uwOu=Xl4R zW*y1hG@!M%Yfmy?>{ONz-j&Sk?|tp#S%b`~GgtJsZO7Y1Wy>8`&PCb%N6q)|YE7Ok zTRodrU<2>HevcD%tq|6#bJuU*(olzcpT12ZZtkO!RS|!i`u{>$v0%Se z_M38c^=B)V5-VyW>hBmy?rT43s3-wr=Uk06`xdI52%OL4TiXV)676_hk~Z=TI@Pxu__)NA><9WY(Kb>iOX zwv=@7L{sNeys9vROZD%0*{e(iNo#kZgty0d)Tuu3#9bT`4J zRfFsV8w*PCIC?*%wGlw z7Qr&0-YajVI?nFfX#6}6Z^Zq|p4~b378Mt!bfe72UTgZw=2D7JUp7P4aiw9_ z-(O$IyTQO^$NH(C^P=VxTMlVL1-B!-2NoAoVwlOOMwzMP_wA))tHG}+R(c-k!@X2> z^)6CwzlD}b3*@-4VYTjvwdr) zb1Uf9LT_A;T58!uec_C8t`>k%XV?rKntS2g=g*Q<0; zUY@;q_PjdUwZZ&=_J=bhYxP#udZiyd{ki5Pg1o@Vmc==Ib|?o;563S!i?+AvW!IKC`HzWWJ7jkn%jQ zhf+{PtFQYOHAkg72-fVK2J3oz(U7nb^V*1K-|%D z1N$ugfg~v&_cQW2bMJ&T9v&ZZEq`4Dg!NWdlddi7v}f9VP8f-I!ynf(K6`;8X1!kW zGIuwnUugff!-@}h_~7KFquV^m-TQ0F@yuBWe)iqs=a(Urd~A;Qg&2Q|=$Cq}?Bpm| zXPS37)NKV>PF=9*kY6u~-))W!h& z_(zEPyG9)eyr$p{P15@H+)2gZt{T5QuOsC`xx;X;T;xYowpI@*G8(NO)Hxv@K`e@$ zb^(^v4Z1{4I7F&FkqjUp<)U#dZRSOg{E1dzMh*(%5VJll&bw;d*eDwisak$6v$M!pRV}Qik>z5 z(tODIT8f{_63dsA&%<9WL@XH5>XJMeUX!=nb1+>)_KKzq5v_p-}NB>cXS@j}) z;3`M*STIJI>hqbRYyIuZwoIag*IV4v8z>OoK|8)zXdm*q()oJc&GSg8e$B3!lpo{2 z*nK??j~-8kZ|d`cEM$(y96n@H`oE*&o6SmviMDmnoymOl7a_^G+Q;#;I$g2FWrdnqyC3?|x{V&Z)9v9?Z_~0*m^c&W_RAiIsp7T1-cb*`x z&GXNPSS3+v%0T&xH`k#W;F+){?KXK7)Vtsj9x~kM26v?)YBaKk~ z_Ks)a(yQdx$;%|L#E{Y$y4CVH-7gd>3%ai$vlaJKo6f2wx2E!*eViv#!tS&KmNVN> zlC#gikj@_vkk5dm+3+#9&$F6QMRLXcWqaeD;M6URMVut>ak$ag2SX@sNd5%JZt=Jr zvGnEb(oo9S_hbCl0rn(gs8+M}NH=M!-jVAg%XdrrKP}by{pG0s&UQKo*SV%1u}Gw; zqreU(Pw;$PmyV8?CgMT*Du-tC`coWRh0Ai_G&g_V{&w4t(XaeP$MhqV@w%z}^Q+0^ zXkgg%d9O8y2zY4p!f^sAdK)yW|DqlhTIIj}r4frjmgQ>RMd9jcZO+fXi`0?f-2=A= zAWq8LGvzzm3(H(7Czu5U6R3Da;3stog}eF*VY93WQ`FXT>kJ!brll2$@k9vJDDPH`dwIjEQ*{{s>);U zJVkQMvBL8wE|R79S^f9LhbbhjOXrs>Cmbkl8!^NU@2NEZR zrhHyBg;e{`H?iONneNFRv>4Fm1cl96HvV8#F{Rwv>U`?<7~puqhF^0YQ}D9K*DAgq zrO=4tMfFr>h*`-1*~z3b;`<=Us+%l6-{U@=`K~=eclS7QtvNHUUPDcaU4H#*yL}T# zsowPFpT15J>t{dvvTFv#g%rQixIKm9>&;Bs@lKCY*AETW`#6F^YV|I~?3xApO$UbW zy15Af!!x#*&#r(|-aLlQ|0O z$ngH79*^A)ub<;5@A=q+l6W1Vi1ho%ojEjdFb>Qby?EZ~%ZSa5YOXW13H*9aUr{;8 z5f;|3H=Nb%j!SM;&Ayzy3mXr9kf7RpdA}?54d}tvGc1CqZ1w4p6lhO6(Z_S^f-h2d zi$$+`mK;R9*Y&xTGkcPM3_k!Uyk6`B=Y9n+jCz;(&GI|^K3YBgsH01Wo6>Ogl44kH zs!O)rw1*UX62DIlb*8vGANp5Tb%5L9w#lm3%_zM6y!HJCDqyqwPvNExix9SLe&aL7 z>Ub{w+JldI??~}*-TGe#AJF{|r6UZSZzDOy z7C)QK$L6P7^%u62AV|jDL?gEZ9=4kcgEW_-n=`noN^}2$v-?u z2EWm+<1XYVk=<;atnlkRD8j6CoV{AYLEHx+lk;&WMgF=`&Hmn|{OhbR^b!{g{yCS_ zs^h>lOM(KlIwJU}Vb6lRXE5L99XNZHA;MCRRL8h&MR;=Gh*!S4lz8E?+~Lno%DcPQ zGGKWtN@r1N`*kop{AKQ|Cr&VlA8Pv~_5zi4nsR&N;;&?tSvBPEAWc%<`OP*&glN3b zUfK3A0@{zh{Ir|3r%7?qciWYU&m z77aF=d2JrdY;DLe%vXtI?Nw1PQ>&WwYqoEUg1A#GyQH|#xCY4Obx_w>`QdMognO<<2 zf`hW>C|3H@qlPnA_pN9M<4ymDbsiQ^IrfcPmt8QY^zy#yOvRZZ8XKhbm^pxw&G&R4 zXLyWKeotGzbH93Dx0x3%Kc`6^Z2N086QO}Rk4FdDliQLVE1U!56x`|l#~*$gkpBo$ zXP^%$Ij8tT%9Y3Pzt~M@<>Iqs)3g5Z`Axqg@7$lh|3)pso5xpoh5PHG^wi50TU)zR zT$+cj`Vrw=a9YiR*o}yFZr7^!l`|B#vwC*@$2pWC<{1=o_xgudp4tc*G_Td*=3`LS zm2E^VP_c2E)`6gh@E!B?P_Jtll*GfBAym|V^jx!{`Xoy*dzf;+0fozgCf+x@Mox>b z>a}}Wgy>wS@1?$)2-&uKm)o1$$c!BPvzz8eL^QqZJ}0v&JN_f2uBYDkdQqHMccZ)8{#6C-nGTQ9CR3B<*HFsZ<#B#zyQh&eLxQ|fc#+lnAddI^3t*WB!tdnHD z<*?T4E8E~Z?7VY!<~77@X)vkdUOANh>eY5*I%N-CsaY&oA+672%gsk7 zZk!8E#mb@ii3jh7n zv43INSyGNp+Cw;qQ`3J}Qs9UmTbG#xBJ5i9Rr#oRM0`4}zT)L+qH^+=_-)tu6=*@c5ew6vye~CPk$rxVVbqdVn+%+ zxADgbn`9_h6;nTqVtYmp9Jcuj-P%zX{p^(hi#4CmZ@xALDPmm?HIZBPzbqYw3dO6? z*F9rNw#Q&YNZoXVby$?GH+($gMsFGfL{w7Z3g@}I8}FbT37^+fPufm%+mL1VNck`$ zJG^o=HaPj>5GtHmI@1MCy^<~|PEV(ViRDA1%Z^gfjUT=C9PdcUPg@p`F4_ibc0A4d z34f`cm8i~QZhbg`Kvs@Z*+aq7*vOwqZoDk};fVcIYInU;a>xEiOj;msIpz>WKFRBy zHQ+VDrC-4MlNuB_^ihwe#g9=lU5u0c%U-ryuYZdc_Z?Mb`Qen-OKt0DW)J8}fsI{evDxvUI9(?VNJcyj>N1z)zcSk?~S zr;awP=#ovD5|1-9=cjHs=HgP9e9bMRiV@sw`+!vnM~W}57dmm!DvGLF_1>(%y84qUblcG=oCpX9a<4h6~@Fl?Z; zpue|zUbo^K6VewuwW{BDHu9_)fVr4**miGog6u5XAGK}O3b7(?g%aHvJrXo35O%7< zued%kOmAji>R%CU_Qy>Y&L+=njosQ&lj zq?P%UYs7iwWPI9WPQk1SALo}`zrcKlsn(}Nrv{%U(8ya8n% zXE$6AQ7WG3Aa>N3S8bP$p@gR_4IfILmLnIn+Lr-E8zY+8;3NeVC8l>U^o08;uN~n( z{!o0h(S`%(N)Yjd2NsC%h+CMk_#JSY0X?ylmB&ATygz5mT))~CR=IC%G~Vr_q#Pu# z(M(0yoO?YD)?BB&{tUM1L>8-FeC={#4-#3Le(fe@^Z6A{sSh4~>^$lt=?IcGl7ibCF1UTGZjjAW)w`)vPMO!&~9T?u6}*rC#x;u+m$ zzY|?E`*(6r$}qSmY!4EyYQyrLO z3Pg7vbZ^{^<`nYsWlqyJCkVBTA5ZDn4JT?|nq?gOhpOAJZB47};W8!k^6A=gM73{e zy!H1)Qb@Q#LeqOkryYsM{S7A?*moO?G`FZ->JS-zI%Xvu#~%YU8{1zEK7hC*J68=m zP6%v&%Ei#26g3Q$-=;~)D>-0EsoTyBeROv^xt!{`I_vo{O3+@vrOEz01pdf)^xdVJ z(kjM&cQhSENe^tGURp@vvY88zyWh-dGBuFmPIc|q`s*xmJHNVT=)89%>z**keaklr z>31*fT6{2>T=}U{qT3p#BJT;YZ@5kdIbEY#c~#URM}Drw*P^?W%(AA|`{8rqQoFgo zn?d!>r1opgHI!5pcYERa0Es7kJE)Iraue}Oc>THNsB1bDahzs-g2K-pvG8cS3PI*i zr=IWD9ZA zgq_jabM@Iqb$-hV8%-(t=$k!*Qxv3l#DK21r21Z2=S4#)db|6Eq__zPn0V{d$5xB! zKe)!t=ebjl4{NTCR-UyAEvOL#)7~C8ZJ#X9X$Ki#WN?hIc zBU!{ZDRj{>7D2(2=PA$0x7!xy2lJjGN#e7GAGEuaIdm$Naa`v>Ia8Y6YKBK}`!X}ErL%&i8^91(NPuS);iB+9Pm z!W1Wz+`RqODGGHSo6~1cf9s~$^-uMzsBv@hy?)@=kskV##@JEady#Bad5~c^B!5&NY!1{@tl4-s*N}iALX@n8CPbV zA=!}=8gsh8KrA~=0+?7hkJfg5E{*NX-*Q5f*dfFXKX?|UDw>@t}cao-!%sXF#V2z_K z7g;(Wj^q08acW@1BEQt%P*FypZv((dp8hF;v5|7`2-yNI1%CVRO-M$z5b`Ds9k z*tNIkt`ZQqx1HDW5A{*4t={fWWFzElm+O8>=|~>>j3JE_e2o=8jNr5@zqx;a4<1SR zc~ao>>wnIw&jGiKI!F2)0Pc1yz2Dv+aW5y2vzwp`csx-jhQm>#PWER#??$H5{u;e^ zOrvXyW|41+MU#L&)f7Eua^aYMFOc}xe{<@U5K1bY`LFAW@g(z|8Ici^ilm;gUI)9K zL-dA8eSiKoM99*plt~6fboEDd`=%dftMi;%kGF5aC?NUvPX7~$Ff#vc<#~D~*^cks zb_NYZu?r z81Opc6Hb3IkLY~9nbh!6;vd!JyO5S!C64bl*G?%&L<#5%=v#Sa0&dg5vG(jB``MRl0|rEwxZYXxdwpKzD{AwhEvj^Y0rN<{GeoYmJxOS7R*@`+j9%fhBDsV zTylCjyW2YXW=h&xw|2{_Hx$x;?A8-K9Vkw#=QyezNj{tZHC%tin$lcq>VNuihaA6m z8Wj9#4E&vstvPve3()Fa{j8}^DCm~!hgKgaQgDZ@w>qsUM2V?c_2(BJO1C$>e;0e*M|X?Rce5x)!LY&SjpVc|_Yk;tiQ#*rYQ(S4ntyyn zH^?R%m)t&e7OCPoq~gaS{t)Wi%-hAUEBP%my`8ZmmI5EzoPJz$g6_lO-@x)CsOt3d z`r9ib;Fh*{=hD8P5O28T`|miuhs-~6w4)p5ke3thVA!bgASjImMSs7_i%`@cNHx+6@#dyZ0nk^76^7h#sk3;ARo z#`7N}?(kev*03+deP+5(8HK;lP(^g!h!j!Rg>d7UpKf-#M6tgTd|!0^jYCrvJ$*`! zQHZ`aW28`6u>I1ldgTZjZ*t+*;2vbH{i$!a;lCgk^Fm~*v+s*_0#en%K--|lB%h#b zl=XNzne17#Hgx}GWJ`H+Nkf*Xf5%OO9?LrHXhsTFg&Nr(UYNa9rk->o zo%$neTFI!bueTyeaK58kRzmK!uWZA;mypV#Q&5kiz2GvvLTgKp9Y`C@`NB}BXQkEp zjz~Sv15G3)iae_{hFa{XPuaH<2kAXp1pmW#TdjLiOxa=_i$unD9ovp##drpOOZ=`} z9^nMMxTuZ{^e8BBakx5#qVyBSFV=(_Q@W@Vqi|=t^A8WNM0AhP!@l3<(Nk%^(O=kS z*sM>LRLCEP7BX4Z+i4-f8U1NnDtWrz8Nc^#H}a^o9y?n53*xow?O3&9G`ZHEuDIqE zg^&);QF$2(@^~;rZ)Msy$e28IX&yo+xN2XjUw|xDEs5Vn$p#B*{@PxK%$xHm$y%>{ zxb;vMQtXXB_Iq+Kb)419b@W#=N__9TV_x)EJTmXSGXF&t0>3>ywt_+_HGmT(Db2pDV$x+=<}4s!i5&W6nrPMZA{f5 z%93!M1U5YProsP0jGyd53)~XpAv$E0x;kOuL~`^pygI;T8B!R_?2L*6mUbGyaQIs| z#x^P#(di`u^G*l+YFLZBi3g8ua2buN)EC3#{f6SrC|>Wz$qn<{jcaRPJl<)fe};Z)WXl;sIQNrBg`}SLWM%T_>Nml zf=5QA()v~<6$=AGW&{``VK*;mQ9=ga_$WN>MWY61H7NGj*?&78DN&K2W$w~wwR-*b z>brWxpuX5mhsUA;PG6cDeXLa1|VLgYi^5k+P&ZmvcM2=zjvUPv-03?ch9fWWi(hLgI zZZs(H=qJh}CPSzP?i}U&yq=Y>*49p5$b*X&}4Olmx+@vg(F2aK?LK^OAmGG zMJF0p`x=(HQ&ztYgZ`d0K%#nZ`WDPUlK<+x^-4BS%9yJxK%*?N-VT=@>&`!Y9Ek93 z#~D+IF6PX<-{EF=N@uLb!>;7VXjQ}A)#vXmk26aHNl$Z(NmbHl^7;^bt6xl$^A4d1y#={Cs9>hBW@)YfkLu9Xo& zr8>a6j;elkr5eZ$)yo;!t*{UtrGmlSfjF#`l}w$r&i%@14R?ILx!&?OhLUopF8&4@$< zml18JKu)8Yftcgt;u4SMAR(`KV`|zsq;BHEA}GG`#2<35Q+R`fYyU#^-24#TIxqNP zcSlsGwcNDXdMG^me_Co%kV#1&Sm4@&f+QZ^xuGmD(?T4J`ZX?6#IQe440Fel={+x} zWi|;&-Fr3M=B5*pYpn2Lo(@b`?f6>Oa|xoQ^&HtfaJzr3K!G{-Q}$$Rp;JrhbnYjt z!aa#cBoq0VNE6owa#dZkn`}QpiNmLu*WUDlcgmK_$&1$i`x!D?0@cn=g*X@Pp{oUITdtu_a2IgBRfvFZ; z*HXckUuzsJZ$T!Vhf3xSaO4ZJbU3jZG7c;0A-3#5dQzy8V$~0Q!4FIF>Su3yVfz7u z-C4M8hVu`~*6V$?&C<0{Nbx`@hn;$<^Dn+|5iarYqL)Rf6H7mmZ8-ILx=SxgnXbtg z`s5HBF7Qw-P9_RN{Hn$xa3yJrQP_rgK9q0N}hyx1*Uy@tP zaHqFDLXonE^IqvTv#nTcM0elLKGUVp41SM9KAo)5hvNt5?uYz`-4u0bf|M~l5vF8+ zUO0x$WwRxnbW`bWtHH0{+vrjJ%rgN6^Jc-F(+k^D?4h+yPqb|g(?7cN^rowjS}Edg zu_7Ow;-zyiQa!tTvsS||$MWyceZyez(6;Z!PCY20Z(Vv;7i|iTRoobHJcD*TI%##x z%#UJ?pY*G9Ye{Lpa!(gT2a{`p`Ll|;xrq3>wcL15FjDyRF-9~WE*)}3I?G&;naC4V z@`!Ml*=u0}WYV~Y@b$Y&9S<;qR2{0GjT-;{qZKNM`#(_Rn_FQKjm?peJ7~tWL+bT1 zPQCrK&ZkIkUcjT^h>xew&UU859tTV&nj63)^jY=agy|?9%?R1O@b)1)=pG>EEnn|s z$N+Ufioam*(Qip*@SYX2NOAYn(8?y(2&r9Xuwum}M5=?6%ZvU%KAsms)aRa94^=Q) z>CcVGU@EOm3n)J#zw?~RJ;>?L0>mQ}mR0vaXY3)ec3PF8Tl*RJ>j&?AbIA==$#*Z_ z+f$5K&eLoR`|fL#pMGjcp&}0onT)o){x?#RJN9$`{1r)ESmkd%Vwc?%j@B9GS$h-m>t~{w#5MM^Y&la)_ zirks%u}Kdki~L{2_u_RsvToE^<2&P(lmCnfs zk@8nn6btLFP(tj7@bFi;NKGK6a=#IfRn=goP6>H7Z(R9LGlrBRj}*}*#swdz#6dOa zvwDNshm`h*gx1k_Avf#w44e;bH0>}Ufl`;)h2J!+ zM(PK4Fd9?9>i37Y&L4pUs|I6BJ)S~gt~E5}f(Hdtz-*nxmXzMY=}S=U07~k=H)G=G zV!BXp>RxQeWF#;)Yfeb;L?EXFEr;{mNbAs&3`&#qI1gg|9u{x?NeS`xPQv=8xc2J# zz-F!rq>A|wWr){Dkm|)@ib;iQOAHabIC{!i^VJBeKk&@RocWX>je~Pg{*Q$3TPbj7 z$BiQ&$Y5Fh?&qApTSy_D@28nv(2u7GJ5}{~@Us4p5B^?n8l~E_)B3^;~#_kkNK-ah8jb>%fT0^-<-=4P@}Pfp#|oMFNHK zJo_k8L(0!;&6FW^Qr4$^(TgaOmq{N|I4d)B`HjntbLurVodGAC#L#)23{c8W+p*Dj z%a7f0h^k5&^}t3(!7L1aV@>&0Y}yQ_6vwhQ;bXiIe2xJFx^NTqR*;LYgHux5=?C_8 zhl0ZwyOAO44XALynbqnL49cb^OrZ;>vkSbVE*q0i^^oFy+ZrHn`^2ts!U0s>WP#)} zM9E)m^uF$`gc-KexPXcnj3NEFIQ(cM9w{FT;isUylph_VF(T>h*Weo_K?9?_PG} zqnRf{0%p!P@?Am~8A@?UpY$et{$nw75|DgGg!)0bcX*zBXM4Op!Ot-ScpF@I+qsM)vo9+rPVNRDlNYR_2Bn$D7G=zF zO6uhk8Q(hu~mJJe3EO}j-fm$Z?OHc)+2Y;HA*kzg(D=gGLy|M3T5T4 zpxvAL>+ zGt3v=^k31uAtj0RQ^is? z=T&Ypt) zNcGlAp-e@!ZVm1qcfZ!us|PHDpY4dh9fi_!^)6hNJEC$f_X|U~lqbhe;sF>H+@4xc z=5m8l#XJxWx{OF&A94oQwa7%QAsY~D1hvrHm*^Xb6iI)R#AsOo->ArKn(>l5@lc5K zkGz`>kstNENFj^nzB~Tp2B6n{&Z@mbP`#cJ#`Ypfy1)2YGt?2xIdW3PEb5fL0CMj( zuljWujD&29*J+_0kSh9BA?{UFyQi*&!1Z>P>$TMTfT(LnEU)+J;N4Unh`_Y!+a_ug zL5VGY#3efz!IMvi-FUQbrTRZ?nd(# z-Q%E4ocGnw+5>qn-msI8!lOBn1VJo(%l1L;6h84#ax8%wKqeo%`MH)`}D zdwb&kEafdICB1!A3v2?Ky>=gw&latOO zf1QYPq)YmO|LQGrW-rm=9=V@b=@c@@ME%_FA5M7x6GMZ2a$4UyjRC!CCl9R>6tXcbVA0hGFbKlxm zU+Bqj?!SQWW!-50z8XsB;r22p4Yrhr4%iMwuvO*jKm*bVyIXqT!%YNsKBZ|?I2}3m zydaGmgEd3v9BhHW$?rE=FEc{ew4qK>KMWz?z39@J4sLJ`c0rHYgGk}}oEbtQc87AniM}d|V06+RcDT>wtz!`PuCASMW)CTv zo2|a^^8qCf*uLrUp+j(Mq3rzRZ5Mb;^(l{MgPxVz&Zlr*uNEkpmxDC0SN1#fV_7Ji zr93l*moFZY*V~78eM__vG5S*H>{Tz3;IMDk1W#Qga9hiU@NcTr@A}>fncS9g9PCei zo2jLvjdc_E=EdsQfeDl!|pm*W{kJ`z5VFinLynwsXQW z`5yOJpE~0cg-JdRr{!-J|5>vJA%jnsEU#9fRIF3tZR1C$XTOU%xOSz;puuvK;Y1F9#OGX)Uh7&^Wz8gWH`uAiSdkRpm3 zy5t2AqC9?&t1iEfXogaUKP^itCWfKTa_0*TfuIT}w4Od=E!5 zW8L_)hECO1$q?$ znXi+PA?mZBP_N3*88Z=|RK4z($p(sOeRn*i9;K*RdU-i@OA&0#coB7!dY%&mk@MFo zs8GV;&Tv{>XG-Qil%0^n=zmczNLIM(eA1R!%G4fx{( zh-7kRi%>+Yvh|;zlZrt9BPM58AEawzpq(WkmG}jX(Ik$F~Q>2ja_|^s-BH< z-4n=CunDz<0>%3$FOzF;ooj|7s>S+2|eqFxoLVx0_0j2+cD3mJ^wzM~3>Yi*fRCX&_J>l4>MsNMMO zd-^pSBr$u85Ob1qp8_NJIutogAGjDHUxQNj+!c_`{U$8Qxv*o1K05@Opzq{mqhgFYac$fC1v{t)a8w_MD(phZDH|g z6zt%-b0`lmKJo&jGBmAmq&ogmhe2=tk(+A9nF7mCB#RVvF2T#^HvgDmKxr(?96bg( zJiR+aUdKo$CQlDJqTU|KqF)u&Wcqhs@h+KOjJ7oRCyA3fY{-a|C`b zt`~(*cnY^6H*ef|xs@zEe0x6v?jkewg#~DuSKg)P0G+fh^ItmXcYuO@k<~he{pstK(Or zhPNE!S3(vf*2N;4e(Kz8Y(0uiiW{G6wTFWC_xjv?*%X)@9~n0HLk4tM@~f6=9U- zag}0Qq=ato9FI_C#EdQ`b5I?nbU)Xp7715H9!=WsZ03joBVNzQM=F!a%#DGh3r4D_ z3q|U9Mhtub1+!tg`bs?y7=eB=l0|Y?F2F(+_D{ps*m zXA>86%#m8b7aZOHX;&FIZWla5t?YNLn}oED6PZE;DJMg9W{>#;%P29=aFOzLpFan+ z(?e=u&QS6zHi*hGa~a+)kNo-%NS(B|GopI^I-1_34*3l2JJ=Y7T*u#(yrb@FADZ?8 zev3}Gd62JzJdx*!(nn&xrC{Mf;&+M|dB|>^=4B*EaYME`>%X9MCtD^vieH4#?~S&{ zth|W$wHE@q+>);&QsS03Sq)a7g1jKdJInqid3`$GQ=wUo^oAmy zlXmlE_Sh9qVJh*F6Hlr9L!P&zgvKp`W4ugYukm?az{g=xWd*VZ#6lnlxxc^yyLXYPkJ% z+rcLgvASwP`Zuqcxq>ubGzS;l+9ec*L#v;1P6c+#%UUl5d3Cr z?yJ&fqG*!=@836Z2~_d;9(J zm4B}g*tXH@gcT1^xlz4}4L(55;Fro0#F~`s2u>xkZBU|_^Qi}tA3S?HIn5R_246e` z5?MG^s;iFQe)k*jt`1p4mi{j7*a|6PJ_i{qudTj_ccR_|;NeayisSTv6L1U`^}PuU zw%8e?&c~CPQ8!(P{j=nQ%_i92&r6PNYk{1OqCO$nv_Y+NGap>7*LnSfhtuKpkpbqO zu=WUerut)yFsq5T)AfHNZX4e)>1f)SRgvQ(5Wcdb-J*`3QfT%mH@H~q}7HLxF&!JOw1bAb_a zt>9QbXnRFhH{|d#!XQAx-Bk=u8uXXstjg2D6d~K!?!DK~g02MF9C8S1PGPLf@8*c` zj?+~8_X*_9WY3jph+=8K-xg#@{DQ#9F2^GDn&Zqxy5 zr&B)f8;26uFnsxl(_uafJ0~ZT!w;WTLlP43aFuJ@M92OV9i4M#{*P$bFc*+EZ;>eF zLn&hZ0-01FH!5Wt{#~dfeYpM4W65`>97DuB?@`lNtG^FGZsmMEsJNcO1=ZtNf$SLG zNV?&x^?qGXjMIhO^lP`YfD+^kKg5h)@UUm(d7p6$$>rSc@jidQA+Y}Xv<^WB5Me%a zS5EOql+Vgi9qEQpA`W zkdI^r0_Tu%U5L<|a11iZ=R(zz(XY-yasC!lj#B>n(=zo;Ldw>N!_y*XkjtqTbKY4! zgl)jq6*ERpL`dg1S5{4%glcovZ{i5j#CRAP|M5Jv)1Hr-^9otxdud(qUV$_b|3OBH z@3?+uzYzb-uY;rGSE$x|+)f;H4QZTaJrfFE=Iel(dFoZ=`vmfYVGPkF*`Rz@5l1ZB zp3c2M443iUhl1xXPIQhx&ktnLC2GP!%Pz>|_B`r*F^n5pAn?CBVu!h#oJ$q3jM(!1 z-==snZN7ZZtcAUiCF)ZV^!Y)hI@Lvr31s&D%1)Oo>=JnIf#Psv-V^LQ({Q3m2P z#;vI+=?9lEf0s_(dLdaoxf>oi2bI__2l={B_NhZv+*eMQ7x>Lb&?V=|S(zRvy2^PV zC||{FAdf;J>VU|*IPb9b)rr7IZfpS6XI2M#MuBEKT2EMUNIjp#eJ+Ks>u2Q6!<^xi z%wgY6h!f`_3M9NNpJIxF8}x+ob1P{Xp1NhKMcYXKP&@g`{_1>B#N8-p zn@#27paLi@xKA^#1XX@Ie{B|WBwRo>n*0CZj>IDlmV9c1&OJ11v#kf||7`1ZHXslR zk?%vry8By=Xy*^P7&lUaOSdIY9o>-Y&jQa4NPC)YZRW8Rp@tn#ZO|MGm#5)pY(rL{ zU^BzHFT(jYoM*jAMa=l@-EIlVh?sla)@E5ZWH9#t>k25=zVH3K`Z01f?lR^%1xj&Y z0?RfUm%vZNp($b3#5HGKx7eF+UfQpKL7cTTN9sMu#k(kCP$zjF7pg@^J`Ao+hsDD}cmCw)QK;X$}_um<_( z=d15{FG}xm-5;_!Tw+Wi+`m8_SBP~R6ny1INEFRz>AhbdZg*bU`})@*dpCqB%_*8c zKPO5ZX!Gv!@i@e5Gog$l@@sjYCgi{1{*1_AWpxib$QN`SXExikxDGNf`OMM-{F zNk6$!7bO)ig5DA+r-(Xtvw`}9Zss&W+IKNQQ%ZhIfm1e{^;x!t;v1haUa(Gs5{1#D zADq#EtN}lekR$O?o-9gwV%p$6g8246`#+x^aN=Yu`K#t=?UjvCq|mwnv2Mn-}}YX_)zSJbu*Q9gApY0 z!(|$IId$4Ukj1Jt>(?N$6BqU)JY(R9SL2>S$rin2{934(45#}RINzV1+T`#k^3d@4c4+iM zcpc>eM}+m~e}K{rYYc323Q)=I_69-5?YHJrsM+(o~Ta%dydvxPfor!0p&l3XqSRm1X)F2m zIfAZ74e{yv#U64=-=h+^krVl@>p7=!c{XHrUhh|p%Tw>i>h1reBboG*F=t~+XYPA_ zk07S~xq?Nf+aUkUhvK=)4p4D>_@T(ntkuLf>!Tv&azsb9fBCxAN*`%{C zP~gP^qFjV7@7DEplpL~W^?FV^>5JI+W7tsw6GO| z#ESZBB#h+7IzZsm_pLj9QOCK%8ip?%L`HAsXILM83un)E4??Q-5Nc4ZSM&1_IoB%Y zb#0}9=VTgtY;s2=Ozs`KwNeHZ-%s8{(bs3mDMdE~?cHZIsJ$t2MP4ytd=@F@z0XFZ zZs)D-iZ-gN7Z#S7GoW5@kb^*$hD3^jN%*2T`BNFT-@G;&!w+9!|> zWoWER!cGe)X21HGTf zU}`kYGsxif?cI>wLadkMt>ZY<|L}!05f4C3p{TP@(&Py`d5FIGh$w1xe3Vf`^*Z`? z$M9kgWJ~$l$uTA!8rmenOY$$sE#mi&?5j@dlb{}KSB=Y!>AxQFW9>H0ocbO90S%0Y z{>VlID<>YvK@z9APeHKm6y^Ym^j&P>Pe8#~o^T`ow5Vrv_$~UbMEtyXtKODA$o1kI z8OpN6`JB$&AScWv$LH(rWVVe(DmPwPjXVn4ynd!Hoe4O<^2EfRNR;{!D2}tjj|l}Z zd3=+Z>Udx*b8bKahdrE-S0nPSm3*6702Qk`oa>8>ntaC4A}gZ_>lVKLNcLBi4FXK&f63-^w)h(!5XPYm#0XulEG8 zCF4vS=H?@d%b~hc0kc`%T7o1at}`cD|7JH!|Gh`vcu_y&nZZUVzdc@ia)}+1q;sKo*rxf9PS2qj zu?~VneZx_98M=u1F?T?ZnZL+|w>ce+6fUdQB)2Z(e)}39M6&vDolxkE{H1X$;-NUn z-_%R=7Xc*xMT)rZBFaF+Vb_@RxWN5ZYQfY1vfblgZndi9SLrl_@Zs%1-a|JX+1lp_ zo$oc~NWfY-(w}qS6xrPNb_dd>_lsn%4b5Yq;y?i2DQz2K34OUJ(cxsmj_?MYii zbdUY=_DmWQ$1Hp_SZ;x`$Kv_$R!_tm6QAl^n0K+m=Em3hUu$)jl-V3uqv$c+F8ob% zK!UZX50>q&KeEWn5vih|DWc~UuiU$ImwLYSV}KH}xvgUx%GXQLinTm}Y|-}*fq#8x zSL)kACt=sbt243?fAj5FzrK@D)uu+bHyNPRbyy>65Z^shibXHScfx2r z{^qimT|gZ|9&)1wTM0@N{-@lO;pGKzYGUWRqxx8AD4z%>HKeh z^l7r&$+T%7Wbr;ZmMAJ@!sk&abP;tHPO(qk%#wFSyyPEHz}n?p(L?!Nu|Au_=j|2j z(F^I4?5N(?ba()b+(9fLYD>3VUd`1hC_o~!mG-qo@{Z2;Gqp6xtCzL>_nZ(?_T=XP z!u;#Lf0#8N`CY~NrmAD@Xl@{PC@%mbef?^en);t%ug8Q^nJ_GLvv7WC0fp#aKyhQf zSeku$h8))BodZF@7><}N`3yDa=#+P{Vho|UR{miTOyw|nETAm zLIRU>S|%az!@C)`?Cz17ZS&yQ2d6_W#ff2(A9TzXZeR%|j|+BE`12K>#{WvmOV&1T zf42lANPe8@QXi27NiTVFdG?tjQTypCt3Iy{gd4YEYYQ*N8fkx(0=cb%I#2iZeY0k= zDP(0T_Z2&5BSXrAlihj3hFI>0)(!>hzRr#5_64pF8)U{$7>Q&NH-t>`$t_xNvw!QH zYpCA9fjzuU;zWD|-!fF#>J31K6t^pP@R>Y^g)WK{rlJK6?-0u6y0i&G$!A zC?}$#VzQX`S4|Rq59KU-nYsqs>(T9>{X*y|zz(QgCQd_RAL z)Cx|RR_`zDIO`5~4efPZ-!?<0gsZq$h=J)6!J4=*ED^6yqkybG%==P>7%&k*$cz4wBBDae<2aS7ZW z`hYq=Wdh6j>Uf_g6!31&`&z;G>r%D?ktF(b!sF?KS>B3iNaf){FXVHdo;S$9ySd96 z13U7Q>UOf_4Dc^UvE&P1_KxdgkjdccDNkViWXvx6O=*DW{|ptkm1;tkb6fYBv_tdr+dpd(36-CCBC>Mbg29 zc4{=Rer+n;c6;?m+Fbr$zOFt;x}N=%u?NYK?d$Ei*$N3=o&Iz@_ywwiTpx&3W?QLc zfg)Z`7bw)NFh0K1N~DN=YY^GAK?9lYYYJYPI4pScIHYj;;bnT%^5dq(IpYvj%Wl|T zou{OfTo)q9iNijR$$5V#6XPrDc%V+?;U|eYI>brwhieP@b*Is$@bArlJ|~1cXf(HU z+bhJl>)t%H^$6~o%>H|QO|onGEiEUW3Rm?~@zGen6homn@`U z!o|(4KSIuZ5PT8&of+;!himdl7bAw}W?KeVXG z9cyY!d58GCp@ad4KeX@n2?^@xVTjQiq;gu&NMvfn#_!DehxCWMpB0qi=OT^UG(MpG zg?zyvOP#ehv+_Y;r2p8Wc22lc82ry}#3#tQXm}`m7och=gYSnT?FsjnMH&O)Z-4-mCH;pKRZ7f9gg z!Yp{4n)y1e*AqnR&RV8h*#Q~%M8AQ!`Fvp`NA&B%6J`fkQ-Gq7g~Q**b|O#i!?P2z z`o^phiz109URKKE1t`sV|97lj_vP{C75Yf!WrrompC8K{N@0EKjqZ@28A#%Oty)M* zyTvjR3Z1|W-YJV^x!!vb|18_tq+}%nB-{&?)Rv&^Fq>6rX6zL_#B?a8xv<)() zxXjJ3X^Z{Sm&2=VEw$Xz3`+FYr>)A*@z=i1KcHN9NG;~FhR0l5@!}Y*q zJ@$RxgxCu7I<9E6bmbyt_h{Xl4Avnri{nTVg% z^}b%TJDuFHqiUeb5Xhd)y=l3u2x;67d^Iv9zHPSX&x{1#=4J!(JV)KhO;MkdPZsZ1 z?FdAI#JfgGVgGwBi6~mm7Y=I1GJ~dWcq92;MR3|@C#Y8O0}3j8zAwWvdt~n(zoPI^ z^m#$V#*q(jwJ~CRtuwdd2Fm6z8%DLs5+d?`ZFTs9Hz2%08OueA@b*nnwcU`z> z?z9`t`8TPd09U=e~0Yiie7P*9YqC`EkH_Bo)tPkrEy!it%N+*zXCd0jv$lAp}bJNE+{# zbp?gY2B7UnIEeZ+^*Rvy%E+ZS-k7x+I9){6+eGiPbM6OiVauRh;P>KEikbi** zvUlM@y^P>)HZLh^zQ2~1@kzS2!fir5lck6=n6^Ht%tW~7^&R$ey}^N}g-*GfgJKWRx%p_KB2+-+Qt zhHMFM&XMBc_vb_&WhyJH+>3(a$Novf_C13_sz;`AJC;^Zs-v{=?>`|?{ZNM8oC4pm2Vx;{LX`1L+(w5lR(wj+hNNgIVC>AbJ#%F1h(kt_K)MJ63w@%v;U(%AB7S&X8( z#V^12i^bVdstW;0Ymmy?lTQAE^qJS@wfd7z`>tI(^U|$~lEgll>U@&xOi)}P?w^IC zPbi8?xPg>9u9C3=A8gHSb*!r_5Ip~n(bGY1@z!`tfxQLe;KPZ9ki z$a%9hV+g9_m8%SyLoV;D;)WR39Y${zq9wg*k*Da79mTp?^|MA2Zx4AE@#DUzBP)I6 zeir>((z)KR9vG>i>!8_WdbT)yY};;7i2a2SvB_t_tR`bAli>i^MOTQpV?Bj!+^)r1YU2KEw3+`bpS`R_SN8TS2 z1(Hv6q}1Odjj6mh?ogi_OpXzWqC;`4Q66g6O#3#t{UKEL<@{wtFht?+tvXTn)!7AqI^+82-ijSbawvb0IM51@J!Y*+}C1 z^+feKz!wsfpN#rnvlQ7I^pcr(U3 zSmU{F$hpx@ow%$(zSutx5hE-^^fHc+kJQ)Dd;gOLHD3&o)P*%bYYAl@GwS?F`P?42 zAyP!X2!(x3|D+DFP`H@)cR^+X4-gSPyL0YMyI=(E{PpNzU^f(O3uzzUuL39%_36pX zmT`-_dOv6N6CdOa-olt%NDX0x&rT?E;DR#>J>%nYXX8L9co=&TvW;gdHdkrVBZ)tf zD*2nZ{&LDZR)0DatPEQF8u=m~O^!dmvkqEhH?Zf4{2@k2=RRen$cSYP7q%e&2_u|0 zho6YUA(WvOox36Yh)J{0_Ud)^P3+%iZ93Kd4h=w<`S!{)E&?({T{n~yM1L`*=Pst; zhMeEu9uz0a(`qw*A&JQcdj}%p+(gz<3<_&zKoN_=N9?(6Mswh3jiwosp9D6%ZD%g)|~kaPHRDpDC*-&uVwkNn3DWGF271AtP}jc4+=IYk)~ zzb`M833z`XOc+x3>wYXANWM%8G5$nVjOZhz;^EOoWb(`Fj<^%7a9WI9i7%~UQPFiE zn{N*Xko|xeEeu1!G;uws28g=7{HgC&H0z zbCWr?AZTNUW7;k2kR!$OMZByPj-pxysBeVZw!_JNBVHp#^a(}bIR*$9qkK8*TkMNG zZ5?L(4I|@({^wT8kS^&C3$(<(z&_`C#O4f1h3v5YigQ|BktF#)`pmj_u$g}WrEuG| zrbtu{ae5gw1w|}O{CNXKX3SW3H3~RR(HR*#xKJ8FBZ6B85AZ?I*tMEY*`JUp`H2Q! ze)MX^5jys$};9h0?6*7QPw#23%)$7sz*5oMv(uu0|>bzV4*b?!w` zu9)x2m`l&V0Hk?qsqPJ|Mce^l^VAac^DE8 zQg~aEyGWJv-U(yACog~696Bq?Gn`gCBSOEeQCHn{h#bz03G9%xPOKB{;I!z|i2nED zRGWB9D5QSexy#sb)*G1;KQ@7vz2_mHwf}Q^g(%)1Ck`oWcwc5CtWm&`gJJF{mg?~} z^B5ozkIF;CJ2(6{7x5oEkNV)h8p_EpEbRRXkat=<2g8_KdWVe&=Qh4mA!{}Lv0J}A z!05Fb`VO71-Urxm+7p$%MgBly+tGO=c5Op2>-LmsPO1*9p!$21x8#e5H{8>0V$Qj0b28jQ4km$r9*&-9g?*Q(AF z*?p+zCs?~`Q`Aazk;F7p=F9*~FXw?9*FJ|_o!s=e-Wdrma_?rJn1*b=U8v6kUgqkA zB;GE08}fO&*&0g8FD6>@>yx(?*Hh#Nk>@UBHdmS<$dvpFWRfqklFLdp@T7h`t4yGn z;}{d+x4X=z!exp&t`K?R#r!zaK{+q4ZAR`q?kfb}ck;N6=5vtA+hJT($MYf|;ojou zdnRo82SqZg7Zf2$@|Az!XgF|}X&1^6{qB$;`IZ$i_EooZ6t8ALlPe0hPh-x2$UE5R zO6TkOaGu!6cJb*1gnm2jGN}1FDAmdH^037ebjo34=FbnvmHgLZkCbj0YLtjv>D(<4 z`z#`e(>u3QXyCQ!KG%NI%1e{|6YJFZ=TGjRi9FU-r}a6j>zDC&s)gx$h(6BZl@yU!=@9) zFV>=f(>zB~(EG~+W@J|34)1?337IR*XVwtFH1 z+!eWvQ%@p^hg-L4ox}r+k#x&S?joUrY8ew+ol$>haJTw=mhi$NPRH2<*&63ANj(N2 zMe<>hNqt+NF5`g=YH~$9x#Feh=N={TgO!X;Gi3`3QaRBdo>E^*&(b~d$rmyqKe^!0 zce`zf!r;PFYetEPpG5Ga4dR>}voYo-YO>NvhA+NPK^#gx6(9 ziE%Wvg~g|;9wRTD9oHj~E9pscM~iunlFLkcqfqQ4k1VFTIb#kLZ;Nsq??T42FJv%Q zU)u@fm(wup zGMdvury^b*wNJ~Mgs23=6~m(AA>(Z-w2*3j+23P9@&DGhYNMF%KOPcZd@Mm1kGZU~ z9b&rO-}LkQCM2@#A?6((JBfUo17f|PFqJn_RbNNS(YBXXkq0lA zHYFqOv;7Kkv5tW}Z*FWv1vqC~CnHj~XZ?{3G~zuhpJC z6A-8yVcnpl6pzQQcv4!SK!_eISb8H}!lf0ArqcTI|9D7gQXcsvci3@S^;>;Ct4_u~ zjYrD&bM}eZ^AX2+C=+qz_XL|gvNKQ~zSS#oWevFvKi<`1*&n2}4($tQfd^ zUy&>A8oj0L`JODK@*i6uBeO1k@(W9(c` zGoOr0GAmcjG()(=rx$hcbD=t0#|rkykn|u)lD}vEQPEEd=4ShCKNun94l9h(KSk) z)ll%Z!~rP#!E`;Es9eGV*iguqi~YU;Ye1C09Jf}=`aRrE>6e-DYcRzYZ~b|v+cacx zo2mgwV{qr~A}FJ;crQ<%jf~D4O1kb<=jSU~8-+>8k$k8!#eP^QJSLvEeo|lRNS4J; z{D7n#qCY{kIV-TggeqNpuB!aAF5Q+qLxQA>$dz=os%<mXIs!=j)c@6!M|g8^1qK+fpd z?+&1d*<|TEBA#CFqGkdIv?ZqqUWHh#|e6fXXWAXAJlowOzRm* zckq;#+coi+`(x}x;1aR#W1>Dw{2t<2GqGQNxx^>TZNZHS5Vhh|)6HGhAXCBvi|(<; zG;i^UtqzkrP)PNdWU-$+If(!nj6&XyW<4Hn=D-w+-i!RrJR{N9 zCWPC^HbM}$lQ;%dH!F3dKZpE#ufD#meJ~17a3gO7kIXy&I`SRzMb@ct%o!I&Fa2YMdnR;q zORrW_w^9(Mh(?Pz}pH4YVpM?pFqp6pYF>!=_}lwWnGzWZteZjaP^i|nt2vx~3q@kTa)dFO;A(YV!F@&gLC)G+ z4t|cfdFRy`t2W*=XAR$*qiXXd#-K+UFC$Jtn9`~K9FN|lxk5~ffM6a zj>fw^!``*G90%1YE;K=In1;D}%l*$6Pkrt%`GI-!ByQ6!%kA z057N`kGEwXgW5MD9+oD?#boz;XX{p`u~5upM7jn@W7WF7v!LX5o2wAp?DepfrRs5# z>JLxuOk@fyU=r4eC#C zrH3a8ocN9+8$J;c-t|TH`ZjlwDfMS8E@cMzM^G+3-~2wD0057M-|x-+b`3eAFE|Pr z{d34Yc&uv699@w-g&TJu)r=Qz=yId%bKRzxQF0m!u!bN>IRhD?s_Vel8;c@aV`XetWVLU%Q}4_Z^REe#PQ?04HV{LoivEi zjJ2{L_v*+PuqyZq~AQzM$Lcwyyy!A3B*~W17`V@UJQBWuHA#(?aeQ)zj814NG-j5OWOUg!~ud7AD zyT*UNB_g?1=dRzrrz1t`Bb4vTZs-mYcpsTuB(vl7{c{vczV533@V_-Y(1o1aTCaj! z>`N;>r{Bohz#UhR#QU4qBEKUqMB<55w|mS^+fl*rXmNRB!z4qbG8VX-E1nW-CvY0& z(z?jgk2GYJ(ydX7e--kCOuJA3S@CV$oL!^ zHD(E~2a4{Bb>Dc_KCG|$IdGxxeLVdr@+wkx^MVi@X1`?)xO8dK&^wXIw;-2%<8s+9 zG_Q_w@9@GZQXeuw**mftU%F-UVs8|2dA)jnUnlyELGtgDwP(h%j(9#*j9U|rbKwAT zBtB6Jm&c7nepjx?Kn`=4oHPwj1~58W2iUZSa&MDF+>zRoH%`Vq6V3C_?~I00 zZ_&O>+k3!d!mMB4UoJ;Bw{2XHC#KvGf=nxm&n?rc!^0658fM!*L6YQGs}lDKWNdoK z-T^X+2N^H%#S$f4HEjt`%n-sw00fc$ z;RDNjCtfjK1_f{Tc@RlbURu8QySCr@I8+5Q0>etA^73c|ytVT>AM|QVS$tXbqA*VP zABQxFH<2dkS8`+=Xh$kt3=+0>W>vuWKbFpyQiQ~!ZqXS&93WJ;E#w2xyN08 zr$Zs>7;74fc-McrJSFdY>LB@ZRv_<)s9R7;e5%~n`x%o7d6HhYfVDX;wLmV<$FHD( zxg+*YL+vMS@PI6BasSX;q`PdY{c|X!d8FWW0CQ0AR6G|Ie0WAfF`5@5@L1&SBkzW& zpH0-{hPsfk_5w|IKq2ualBN72N78#HN^zKKBPYz^xyX0NGZs!hNJUteQR%hr(~vCo zo5W*Q^_%$*WrZTXP`Hv2p-KQI$KRrY@|k#EJU+nveh}lVoqT=t2c$`PY_g=6-4k6@ zl$hR$Wa*kiMjZQsBzF2AJBG(SdBGiz*NFO+B2o8)+-Mccgb;6aq~-B7+DL5I>H3ek z1EAc_rolS0;r?swP#_m|qzPqft7`i+M4^<=JQjVNkT7F$+0a+6usLzCmxsX@xE;R# z*SI1QX|qKBSiaOZLKVmhqyOW3nRRXx7q@o>9!v42(v+ny8h|Y)#v;0+?^w_GI(XJx z?9(c5%loFQ^DTbENc}1L>E%m)DLLGBz9pWXXZ>x8aCU}G{PjDdpu8&Ta#Fbc=yNQ- z92q$~w>eZy)zbL}tm0a=d#lwJ*_^K28N~r&yzW%c{OyO z5tq-D>hEzm{{OZdX{UZ(OeV4o{+ynnj_W1-%qYz|Vt=!rkaK#N7qX@P*ZC3;Ah()@ zM@l41cwm9#JCas-=&3NWGjb&TXd;Kj)c0qiV9s!;dBXOg%Xr(D`|%^vmNj;30F`uI z1=S}8)lX~sKmK!=>5}O)&jcdDlH>nKXYF~;KS8;~bFPx=kQtI+Qn<)JA|(s!6Alqr zTkXzkku2#ol-yTGfy^i|9{A6HFps(F93O^UQC~`_+`qgI1JCR7rB@xWoP;o0_{Nayg@U8G68i~_0NsNiir1|yl<$t=O+1&n5{hk~7= zzp0GFpd%1tW^MJjTNF}w`?**oF(P zn=17`FyMTd=9D7wALSQ$ziK>@d|sYfi}l08&D?MvyuGA6Yn99Y|&HgbCS< zExGnKU7lp$H{RM4#Zugw_^nO70(mDCsH57$7oG7`^y@&1)bGu4_Ogvb_t%Hz)A)Mp zYYULd(}yF-7yG!9YU7_t-%4|lBl%ffG2;zzQ7rL_mE10Bsrot8V-5-kXt(yLI)%b> zV)BV~Nc=yd&O2bo`fcMvk=2ya5Fw-}tAx9dG)XkHC^9Q08b--XL{_p13CZ3Zc=o>c z9@n_Xv!5qXiC?|f`9064_xH12dTTD6pWJ)X_{Xlt?7NCDz1Vvt^2gI( zT#3*&dfms`82kMteu=c2`|j11uuIO2gXFTkpG2PM1x^(WIo9CQ_DEBhikttNYvlw8 zFf$XIl)P*N(*9P)8aRZf?i!bW#NDhv>-fsAAr-zC8E2GH=XK__2rJRCbuh;GV>}@0m2Udi(%9o0V`B=TtxY1&+Ly{>+8E+mI>T zyz*T3>$s{F2mtoOwC-mzQR4407B2gWiVgBU!?%>@JcR-TaCl7Lq&+^ zVvZilAb>6GheLK-)kq>&?LpszXNn4pMGkE*+m<4Ob!G_2KEd6YjPf7iw2FNji2Pc# zfcqAiYMne7c}0BAITW7fHlz!O+C^ROA{)Zzn^e2r}L1xO)Ua!E7jPc zu`QFPa_Ju-gJ}GZ^@Lw?-$H48ANsn}`r?Gu@3JoY)Lvzrj&9O-7 z^pHz<;fkc~i?{Sts_r}lCC|#S>kA^zBS-i<>S=u8D@4TqpH1b>d+T7A^EAJMT5!TE z+zCf_&Tosp{>D2CMz6$=T{;vUdD{=Wx@OxTTb`fc`L_++KJs5UME`Jz(p0y-iad&= ze|HiKD6n_9K_?8Vwsu}NXSpGT4C!yP);zeQzaOfABR&nv>Ig1R`P;$vF?SxP8? zY}o^xn16_p4Ut8E+vne+NUd?K=eLDw0N|3ou0VLT{+$HG8-bjA?!Rw;w~tWNf&YE3 z%$-6Pm?u%L{4{e=awEmCzK_$K{{Xkt2|nTL9v9uvk(%>Rt?fG3+fAT$+{;zP+%&!{3=ioIch$?3~rg1 zyVY3zX1JA|c{E&g&%D~Q&OCTks`O=ej?+N(AiNEf;1m^VUGy}Zb*a!AkDuvO8*4ph z!b8oG{iLUg`_6n*2@H|3k9h%s=hgzoqLfzP&M!fbv!=#{)^WjenstP;QmY* zk#X$hTg$#4JQa@dPZOvbfstJQ?Vq%}=e)-G$W-`}YmupNz+YhU-Am4W*>{gEL*+-7 z;hZX``XMku0pAc>$vXDn*UT4js&z|ioRhu7nYpnYAO5%x&X(k}O1I5wtSx`>fobs6 zVt-;f=TyNbdY+Kf6S?BQomx7#|0n<6jFmo~U+0Oh$vr_C(QO67g>?*Oebf3uO;g#9 zRR}(%1OaeobHA2Owx--wIDJYPHxYhq>VXrpi>&^W`@tgmac??}Lb+$%SBP6*0=rtr z*%4WHwpQ}j0_-GAbx$W8qBqD=``a(De|pEw1CP&vs}1$VC$WPM2snnS0|lXRpSu6| z`(eB?tJ}r7LylwrL+47r?8<&j|8V1% zaNb32;j6Z6@l*Mms6aBDk^bh?PVZI!9{ds+a=w;dRtKf^ee(U{F?k-DQL_*DmFL5* z1lJ+15lR4L^*?Gc4DS!(d+Ey@Fpu14mF1-Gy$AMl^g7&%Ju=6$)A%a?N95hlJY`QM z$uS;9)^=JzZ$gIbp@J{-^X#PccB-%&0Dv_ zHI9oIKQ@EM*9o|C*+&nDhy z1Yg<}wVm)Ii}}jfI_(1^SvnVoM_xSr#)ikO`d>cZlN7jTv)RSRY~Rkj*sYwKh=BUI z+FI`=bNkY1+_TKUsUvv@vTtjE=-uoe&yxGwe#@9czn#8_0?Ge$6Xme&DmbLSigKO` zcGPQ4gcLX==O$+$pUWH0zrEm_p|8Uw`s#1I89A383d8;ne{W&+m_3K>lp-^*0k+G& zvq1R2F7eyjYjNF``R{FmyWG_inG~zrE+41P<=*_wj>nLDiGsfx;ee9Ew?g`K&Ydoj zpVu=|6=HCI$n#$NNwr8va5~S=^Xt`V|7FJp$W?9MW606?xes4ZKy{Q|p)v4lD4s#a zoJ|8@U+ngA)Wr`2i zr(X9*kgjCYx8US0e~rKP>sydTr|6eYqvAc1v-g4L@7;8RzhB}15>+M1Z{5b^fRDw!)NWPjm6kgG-Rf|8_CAlWsKf0~ebr&B;wi>@SMWL!c zcEBsXtt=(S{0_OImkj4CKN{RLWt{Z{B(DeQFO*x?T5c$FM)6E_`Iu z)6`}XTx--94y~~YC`NFL%K1PhO*?N`fSk8j*BvZTMn%N`T(~!T;XwEl-tcuC&8k)R z!BfR>oFSXjPz1IR*yIY1bRRcx^&i(D?ZutlHx~7=>RFnLEU>K_we-iq&M$3Q>f;!S zEW+|Vw*r9yiWiK~b80|^0L63kDYedBiZg75Oz{zBcu4Sk6izvpR)$8|`X75A!M}L! zbH=^-mr*YqgLhT$^m)HLfUxqB>_finAGb>1f1uC%qaPmoKjcXco+nosi)=-Ar?1^+ z4uwPNguS&Vp3Uv~46HX$@kd-WdK$G}uZwfSeTYi_Wv11AWk>IWQ{!Bg0`cX$tH`Kp z-4hE{;0dD2uQ>th);1e>d&_hbs5WaP@`Pi#Q(=%_vi|o3#H+xjJAT}H=%poA9m@XC zP!V(24hr|+*m2f#7s{U4E%VF*8ozvQJvXyd0fbE9%x5Uh{m%dH$9+o9&=|RMIhWa~ zaC9HQM{@odC2)zpwUDOfEjA(`zfaD(30FV3x;+ZX-EnduaEm<=Ex7VYIn-?xGHJD?N_0p_z_s$!v&x7AH zjs9m@20|oP?HI=y+2iJ}N-VTG7=#BiXEHI2aIs_Ilk@g0jRgXytv;T)pCLNs8fD|i z?8m-4GrvDFh3k<&VesDb(+=Q0rE758&OP+k=k_lTBa^09TU`i94oHZouC8m~A5PEb zTW~#YmCyMG&K9)RNB9>Y&8%wo_?VyJs#E|o+vG)e&2y#qKyb3wqfvN1(rD`IdJulj zeMd~ig+alpbElCN*q>|MaMj*AC=kxFkN2~-0*c4$um_Gq%o*Kwbo09P z!*4}&nR-yH^GBT*$d=#x)QiE7emeCOVn1+BM!xg~E;Wy93cJ+xe&OPIBu`hHPDZtB zuz%K@k9^qEYkkk0!&xBwjQyml{opUSdbY4Co&Nac)0-Q+{%HTpOs;Azb{ua1}G`@Zjg2lLz1L$2uL(tly!O`%%H_rR|&jQgU+8awio zFMlUo!h!NKmm2PmIoHpAN$J7hYoqq8$O)4{F^)pfyX4FL5$#89&>)lxAESghgvgM* z4)@A`g74lq2Z3$OtId`@*2&2G)JY>p=0(}(6<7(WDLbr-Hi%LefgZM5??I;R<{PiU z$-7FoJI6e3%OROa-cPnY|1|C2)wKGfKUJ_j>`iIk5P-ABS1SFxbDGLogPZGkTRQV~ z5qOC3gk6y%zU8#;%HNHg+h3pVUwr`OD^zX@Jd&g9R^zok$Wd$Go8eP2&Yj?;r+(ZV zxFt8xD?V(01HK3RPgT+lZN0ZG4*dOIHL7Te^wcG|pH@aK?C*K~`fIvvMZWlZ?3}Xz zkLzgs=(Gs3&+>bbtJ=c>h#XZ0LU<1BtM~EP1;~(oJG-Sa&LNNFHI2^0E;=#KsXMGc zVK1^&yv`c9vpN$Y0ntm$H4D$kNe?cqi__{lz8eKj)=`FKADk4fx$jezH;Xf}zj25z zCO~+nNhVIcqrgYVQZlETkSFt@br&=uhuO}m_3dt}4^*Hx1XawVACc#->bdO4s}U64 zp0hwb7|2okyiAoVKjD-TZpZ($=^{l)2{_c6#KwHl`_Ja*?diAqgt@pbz>qK*v zP2zSOyLDddt9^gKDRb9f$NrUyl_fJ>aWQ^*wL63`#`nT4d2BxES3IXT9dGeW z3phCN2VwEgGr$o4IS@h#y+ynQVfBQYYp)*4L zRRA5*$;Q6;FPy!8%Kbmj`^5Sj)S?(!)UDS$kK{laU^hnTC#+A&72m_@h7;aze2?3f zNmQC&+t~JTJ|OIG(lPQ19IA}C(W>TX-t!2G)EMV}xZMQ6eGXo(2W^?++wn{PlPP^) zdSfN*K#uUFE9N=$`e_&7S;CwXPg#0>f4Oyj%bYQgIhiUi_&2EBIe2M1(c>Fc~>I#P-OSduqXVJqOKi zYqzC|&n=C)V+e}xI4X0x&_L!qxYT0oV`R~~vc>Pn7H+vqbS=N!&z!X2ZJZOCCV2z? zfjn1>h>kZ$=0v-_Pu#w|&P*H>zI4&E=SUe1|6w)9w`GeD(m9{=H}*d^#QW~gUm@B^ zaZBMUWgbp;7Vm4*X=-=vDrirzz9~0d1(m@07IQ=jmCmsd{AxYk4lcFdEPy7tCu`$HYkwmSG;8(R$7{myjUn0TePA5UHE^s`pms!u7GJJ)@-+73j%ZkW z*(~fQ8d|fftmmDAYBS;fN(mL<;`aktqJPU2J$aV!Q1VpV%QT#RNCAG3r`ECk;Z*Xv z74T8juxlaQeU*S5_F>Ei3n+c_5ai3xUqEe9Xb}pfuZXN=-&y&7<}VaKLV-wcBUADn z-Lyr&b0&O*3;Sm;(v`lu9OowRJS|Vf>8wLuudgpOX!j{n%1>>eRB|Njw^K~$n>gMe zZO4f4aa(>rWe~9)P(HZVVgHMtJG*sSAKLGMo#IWVS?|H^{C#=muujR_ROzN{X_7w} zU_K!-2XL-(jqW^Od~6lde(c|SfK^9`F3G){Ip{^4%YlH}>sG+`33IP~Yc|rt1p&^Z zgkSa@9_ecW@3X(RY9#MJoZC1zdjH00!%H808wE=4`6`O2yia+ox`Ou#`JyW-ko>La zLe{T%t(Uc5$tYwT_-@&#+aE%j)c5%_ds_uS3U<*ky5(NYw~^m*34C`D;OtZDIVQQ+ zScJB59h)Zn`$Ea#j7(zvLsE3Le%0spM|#87cTYNMhjVS!Q$;V8A*^(wZ=)txAp12X zC_ujQmrlU8{^w4$pK#E2^1E*zdgJLgkt>`k-;9?3J}|HZkx}f=4XJU*b#Px%x^ZMm z{hsAx?xaV2x+_keAJx6VOoX;8{~dC+sNiM2Z& zsrx=?jsng@hA)@;hX%GRjX4s|o?H*?6Wv|papn$q#8;AUl7M*v&PYCt_A>M5vgdRE z`J0$>YfD!gKsA zlD7^lMxny`PRHp^S50~5>Z8b!e$XZR+`x3s@$?FB*C~0*A<+dF3_L#jLitZ98m55S zu!~MSruccgQQndOIX|OV>dHLvzxX*{522wik@La2_xW=>w^0f1kfZ9g&B&LzNn)=W z+@P!$_bvJ2BRi|ww|i_^{C?T?h+nlxey<`m_N)iH+Lt#+p6ZjVzI+gK2)(?Awn2R5 zp|_}zUy5wP!IvDx>BR@XzP8;4*wtR|DU_e$`_T88D)ix5%6nG(5uTg*zgGiA_*T=4 zaSUGRPrSl8@vAXFJ@~#Qy>K1^%Jwk=l|kkvdd86;upJKGx$(IkXCH<`_7JYylmN&2 z^Ut2zcEftu$Fa^NSMr^s7g<-}9YnIqZ;>Vbxh(a^*G8V`3?1@wx$W!=DwMj)Cwg?v zp)M{&HmHRl&InJlNVvYyve7^9sJqIl2dpw^D zcE5f{nq0KL$A)TdDJIcfGv?pQKVQ3Q$(nbfT`d;@z{rs2V zn#g;j0_K6hA_|8#q);a8XVAu@J`vF|r$hb5In&g}xnpA)L_j{r^sO}3d zoJux!3p_(q@C{tbPTmWda{gs2J5@UJR1EkE6sa+7eVms0b*^weTvFEsUSJNGm*>22 zC|gb+gof~YU1-~N{qeWQz}|^;JdYw*$z4A{RE?FFp`s<{p%qK+X|Ch}d+t+#AqZ{V z(EsnNZ${dii-%r+={aObE@i$d#(HKawf7gY;1EB45vc$+^@67}pDUi$%CB!bqjbS31XP~tVq{4_lp#8+0=0gA z8x_JM^0BWLUWGB3fFilKgKC}G5Wel~ukeX}(BGQeYcg`5XnJ(3LL z|G*`@(1Y7Qtm?cqjzTqFv+B!#3E$NdKDGaEha$;ywY%9z5dEJju&w@<|N9&|z3aS= zOyO(g%llfBOXb04>f6A2C;W&3QamvAvVE%+YT8-L^A5U$p+o>By8n zH;_F3lvM&+&ky_aL-T3f|E|@?v0pBqd4b3h-<+p6&u>?KvCB?XBgi+s5)a)qqBkNk=km2BjMYZuskPB-I9>YS$jzYz&}h8WC4_v@@p%+?up8|1eg(6Y zun=y!7qv3xN1Xa1?Sa#;PK0v}`~B_g1I7vUI6ex0ONt{IilbB39JV(c0M~3XU__ub zpf7X;j(k7`-&HtP^7Yz_D<;D6F!Mk?;%jkAU6Mz*(%l*V`G>M|nXlw{l6gO8NQQdf zP82E5;KOh)_-mxqK_YOG=l?#=w}x}+bJQ6iP{R6!qD_xcCkw~RJa4zxVV-DA*#hgM z+~he?$utrsyos#g$|wb&@UBCWGn}dNKAT#71N-H()wtvtBduGzA0(x3~ry@Nv6TCWfsO{RR-PRoU}x$ucQ(cWek3Y9#dKD?r* z^9ujzbh!$AMPLfq^R3S-!t-yiCJ@6Ys)ymh0bD7L5 z&u)J3NXHjeBVXo!iwo}WAKqcuPCeK5Z(IIGWXt?8;HFs12N9LMMKFzU3f8?QKGj?` zMy`vj0Ur#$?e{Era%j)s#Qxvke6TUDM)+;Qb^L_fNv!t_eP(q5Paj5%$`RWP*l)Dj zo-rB@D16!VIJ%~Fotx)>0%sl0GY|0o(pGSd0z<%k3-3t|-(IWxysf#2t(t#d?M6?- zJCQ(RHsq`E$3Ucs{!YuFaqdkh5`Uvda^sw1$j|mW0+&1NX+QaUc-C`0Z9JiJT5(Lp z7i@uB$)etXV;&vTV{o{TIY0r0og9Y4S3P-e_*B?B7gg>EG_b$;q;Q{4m9YNTB|a5z zUKct6t$NbBJ?FcSFTS8W!f<_1L#PTJC!F&WIo7F#vJeiaD zhp5IBVTEBFX#G6atupg(WQZOqUpVghlsYo~cGZvC zvenq(G25=lzPmSsE?GaP;?%%>iWW=D;GE0f54Zmh!Aokx7p{hv>rdMm;hfa;mjzO9 zWs%I>k&nW{%IkU^NTT9Rbzs5QozEp-T91~VUQw$aX8v8M?=c#LAkgKe)2$Lw>%QlI z&M$iApyUntIHv%?DYU3MjjDTSoHQ8jUS3lz&H+twOHYJBdh99)Hb;RdTR>SYJKN0gxkd!#On ziVmPq>bdakYGDg)yY-q!X2T)#@I&|iJa6hxZE^a#$vqd^7Q!j@QGjzQY}sAjXl+%h zaM5+#GldhO`JW$XJr~heImg1M#?Q@BAa!Rt=RQNfi~C(W=ODmC*r1_@;8gN2>)d>j z{~ljo){E)AK7Zt^s|s;ijq94gt^9%4!7hFH@eyfDx{n(O@2PuxzqYFtPNcW0GvXRM z+%Gf#P!ql2-o*+?14#Ysd`5j?@O}^`1qM8?@t&tp=56`HOUYfL78!6!F5{{D8?+wK z`CSw?QotOzoZMIV-%|!p_=Lyl?7@DSu=Vs?{}GBlSW@@qkw@Tsl6i)XrEgm&#!kc{ ze9u&LuNd=5y$vY-je?JVM!vG?w?aVb&#>eIWDBP#Q|i6~6>ri5b`=NI49N`U{FS%j z`A?x5OE*ROh)4UZ`QR&C7R7$g$+K-el(shS$E)Dn&-*{O%n6<1hb<7EnwRAHC7;2^ z^8?#ixv#=1uB{7lrLWJ(WPd~<>lIO1myE!d;8$@2o8argd=-}(19e46IDdgZRRMuO z6V@#SsNDM5iBOLEBH&A@;Bf>RvM!)X`bT$?;_f!!=wRoU<1b8rQ}T%%vKI^}JW>uE za{d%i>Q0{rph0DawqQPh|JKHtydnolWc1m{IsCtH1?)YaZQ z$!1a)hUg@Y4*&Sfx?To6pU{gr3r;m&`2@!!$L2KOJrw>)T$di3S}*;!jd8ffcv-zIY5i(M|jQWxY>u2LHZpnZt)RD$o<`Rr|>~2B*xeogFz(JtmyH3dt)jk@<7J z%&UA#?s7LmdF)HdVs0FA#jjQf`t)(P4vFtvct2ksImp0(yeD9^Hwk%~AzuUHH z-O}{v*>i9fv);%}Z~x5gaJ8oEuPGd=ZM_-Z@7ezu;GfTS@|mSApLV^2@V^gd^qa60 z`6`a>R^$oa-7fz0$`_ft7;MPO^_Sg~GO9tn5p+!FYq6Z8R)uvGxVc`b^ z=z99<9|VQpT3wHXzXRcEF@E{^rMq$Bo_3cmJl7vi_1AZWr#{Ki*f_y4!fTR!kz{6g(MpaLz@6=m~w-bKaJ5j(O{` zY~Iu6k?h^E_&=R}tY2dyG9bBzj869=xFgTe`sufkP1SV0h4A*MJ)+~%uMql_g4;SE zyFKfS@+FU}Nalol*{^3izIS53in?khIR>zpT?`>lZL?BU?x#K;fC2!o7?xq#lU??~K1|S?7iLYqUSOEQaO?Tn8Z42@9XRv2%aS&`E3Z~tA!NY!#T$% ze1fir&tTs&y87bg+Hh`Hf;Tu+J9Q(p>qsv363X{Iv+nSmMJN^iVv(HNK8537iSS_F z>*v!rZpO>Vk&?P1$C!sSfZ3YYLf z+%J&rl|pwx#qrK$&Z$Ra|H7XLVvJMBQWi2Qg9<6dXGSw+G`>rzQn+OnrB}| z_+bJjeu=6M?2GdT4%ny9IgI1!ZM)rB`47}o)avWp?fG5_%09v=JS01Fz@ZJN*VTHy zsNKjdML}zxzveDiK?|^d#`VFqFg{R58blYXLIb(O z6}TVv-Rc*DR*TP-l#h7?;dl9S%C@@RRd(yoeVF%)Q5t(JAAt>eAE#bbbQ1aI@g-30$pAwE{>`(TIPSlm6#Yjg4-{xFN zpKv#f4$PN6BYlkf_tFDnHeG`2JC&n^bG6wo9S}d(Dd8P^rm`+gf15cTCuBYY>Carn z)-~AvJbX3h(XHW7kDRrzZ(xq9^K<4c6>&~2oR71wK11dmg`zL>T}9uQfzZf1PgUx1kL*%15!@$o@Y6y;-VWebtu6eka@J z+Aoy&HZFm4KJ$p(6L`<%+C?!ct6)E^f>+@au7IEQ8nzSlkG#2k<{X4md@tL(aXxa6 zoZt4&%t5NyqX44_&^Y5#2tLt=yPhSCPAfzx9%0M{1h*?=9s=t1dKy9Lw<0%le;#~B z1-l?3`}?W@zwf@Y3M7QH^7pzL2_Nnw*=v@t|Jf;iWyg;cQ_&ULd43;)3ZK^mg+zlG zIRx3FXK@G@)g}2}HM~B13F|ll>hZf4rtmXkN>0-Pd8D3wA|I}MKg^l*=W%F{Gq)_Y zjJXQYZl_*&AoCRR2>+V53|{%(qQaZcp>_6!-;gW3d%N%hw|!OT^Jv;6+v#RKhIY8; zj8%8s;kmT#5d@`g)1GCHN+iV3oll*kXJLPXaH_u|Pu?#-*({cx#bMD~#b_M*SrUam zao-$zitm5@6UFC;^Ht`upStZzhXvy@ad!0V;+H2D!XbInLDp^C&I#wqO>0Aa9bjF; zGn@Pk?RwUicuUj;gd&RZ`eZJ$n41i}h#v2kQ6${x8vmAS8_&JNdzo__P;1$lF!u61 z^Ni?*yz2e?0Zyq8&WK(j_%Q9O-oY7_Gxs(;3U4_by5x$TSX}FYd)obtG?@###pmXq z!#-D!Jg<)XC?MUA0?8%G7v6+Rje(jVQ|>LN@G`w6oU;}FOo3Ca^N7F!rEq`Gy0@^3 zb(sv;Ykh9+kueSqb*$YCCzbmxqKK6r>Q-x6J}Mef8~QqmFDZ~I9E4q;Jq^Lnl%Wc- z+lEt;3365Z?<{01y!a?Mq;4-#vg3A0^U-%d5(p`LC=*w z&)L&zBc@lvE&Lc?1_k|`g1vy}zkx|AI0VLXe12;KNO1Zta!9VQPJ>H0h_QRFwmPG8 zNDbxsD!iWgSy`e}_o(>Tj))FY!PLl6kKaB2@tF%1ZtP*~81clQmE*p)oq91Q}7N}qf6bZM)KW*mHf4^^yV?RCGH~;<#h{?XENR1Dc zBGQ-wW&1#D+4qCgtvle7oRi~k3_1JW@0W1yx?#~*lFz^;IliIEO}@A|dzdgD_Y*mFB!h5*?@LPxa zxL^9g=txHN$B-#Gb3T~|xoUVS!ha29Fo*i=i%MV(kMuYC3HG_2aQtxM-UT6?6OO%? z+!5_Rw%#*(a9!|x!+pMEBlG_YMBiB;xm!;8-ZJF4qruU$01goMgQ^zoV&PhcNVHiF0>T$aVzgvpdyq=eP7r|8Nd*rW9!fX!~*OC z%D=1{U*ufPdNz9v??L6c9z{xc+~sPn*$YL41F2t$EV45W|J9bx{%G4zC*FR%_mSV= zn!$P>x7st+f$JZ-R_nm=8|N*0d-FXP;J(v#uwZ-Ytv?zdqU5Oe!Y+Mh-oxq(fJ6N? zpILnl=cfmUku3No_yX)lc8i`gjGJ$~`ebbcWuF+BTHOArZSNv1{>F&(>%lXGWBD1O zi@YzWzHNgq^Rg2@;g+V!_vKbH!ZFr)#=793a1T7PcXdcTt2bePX+Zf5kD_4k+Dn-o z?m!Nm23Oqx*B!Jzt7pBZbo~s3UwBLoHRc?EU^704&3S773QgJ2wjy8gBs;-TOs{); zXst+i`yNsQcupD-ol~yb2VMiuLOTUOBKkD%wey8Dl_%$DQ6~jb!?qhUJR>vHZAU^Y zt}Bl;L9Y1YgEF7gA0q*5CbVW`6SdA;^?LS#U35u~z0_WOgn;lwPo(;cZN7F9qM`$I zh#xLej}{ikq0^YZoerm)eauH&ew<$LckX|mvrF<8g3KYcWhi}U2YBhW|7b1F$@{5o zq!^Z~;FtNoL+;N^+0&WR`P{3?Gxf>8x|q+3sPxBv&dq>H_L8b>q+8wKp>QVr!W(x< z|C}y)ssXw8(>UK3KGDDHJ1cHl@!&L^6@S)Q*?W1$T94i6FA*df^!GZv;v;n4qypVx zm;Ch_KAJ}zV@r^(WUkHOkn`KWmbnoj$w3H6o#9pO_GmBbf}uZBxFD$dnP zI00=I&+#g5VVz@1F6&S2J*{f_Y6k+n)xsSS(LWblX5UYqoWlh)cAvfmMbnwvkP^Lb z`47CevA?E-n#i(#Xi{EeD~@5gZP8Q14vv}D6K?T6dfF0({$04F54Hco+;v|I&QtJn zPO0rc1`S}YLbQ_k6@?dCw7mb5hhXo*c{+BgcAILb_*wly2+?-)t=ACP!h90X3GS03 zPtoFfBtn~c9~QcubvnVnST7oVNa}Z~^CP|3mtDPtxy^pg*~U2<7f;QBM>yf0XPHAE zmgmJKTrlUi?90}r{|OKdv*QUAsK>V*a)vYS#Ywp7`T=<4IrE)k{((d0)d6~(KF>$| zHZq`8BPKeTX+_{@u2PS`fcC4*H1?-sZpM=?#p`2ozc5;T^ti$gP&|(`%A5RhIuQ_o7is_ zZ2tILPiTh#g%^AkF~ysm4aZJ3ut4--lJ7Kz-v3S_=)$!{1%Tk>Tr=3|n;5cdauXJ? zZYR`C={0R>k~{AezAZ$Lpnb!8R=?z)ITg?NcVwvY=sB1-zG@xlSK$2AdKz~gga2){ zpoXW0Qyw9i$KCK#nRl4YMz8&;l!rE(~5oeX|f*<3D5MD)Ggi*Ie*W% zm;2ZgH&+j7d{YyoITUCeo_{zuG{||WR$s+BK$qyhi|3ApQgAa=h2ked9RgM%G{f5=Hb}V ze_U;Kn19<=Y#4gejBf_O{Q`l>7Qxe<*1J!`ExtqhDz&JF?~c3~kAG}Kz^3kR+d;{N zj*Q_t+D^w@``=I`b0DYqiYioJ979O-9yNMPkLbLkISRmpkm$IA9he&)`il1_F}Wv0 z*D^mdB7CPRl_Nd@f$<8giL;_h^Ymmsr@Mgt_z}e=Yzy~x#m|CE#V?J5{y*Ng1)0xg z)%*9+E^GDtM<7z#-n9WGOd5Ys&t%{2CuUQ3l%m0WF_7 zTdBjmXNs)jJlZ^U&0GzCSPAtJ`IG&6Ig*QzPq@jy7NJ1i_gx>p{?48@eQgJy`)l9J zZDt|2iszGI(c9_0$(G$4F@uCFSKv?bUd17t6sP$8{Zdb!qA6spQ_vc5&VfU8AW_jb z8aIl*c92?};^eNQUpCou8`66>{QKG`{YPW~(m<86)6oRj(O zu&d*}4ctF3STe8qNMzDD?ok6SIsbhJnV%RE-*2c6EqoSOpVuSrUE9ousQ8&($%T!( zt}U_pakamP;~$>GYmx_8aXSSYe~%JyUbLO_1Q8TILKN%X-h3z>5H2qI*;pJ`?RM3d_aT0?|I}*ISQ7uU(&Hd z2_8_fo%6{;1DW#`q_l|}!tga9Bhz$5WX~5?^0BuOlzDUbOLf2^b|Z6+gR5D06_)$8 zT8+7_KB7I>8|P$S=@DIy_sMTJj$i&e!V2He1a8@{x!O}h)gOAC^VUM*Cw55wPu?xc z5C)g<4t-Q!Kl&{Komf}sl)Q}4C}l8%*@yJRNoc>Q#VLwp{_Ol*0c{aeJhFW#mYjen z=d`0xd^5hkl>ihGtNCnj;)(zGs`&N*mfzyZfyWMr*Uq_swd*IBzij*yIyheZU z8?Xz1%q2RwbkV=MyD?WU@VWv6B9fv2_EA=ydtqN?>+b*UL84RD7Y#S1l#j`>`We)oj2?c__|ZocrY?CSOT0*;ZK`<0S? zce%pnzXHeYl4nBp_cgGc6r;yAUJfA6JK4N36cKL5F zBJH@J3*E_|YdDX&+0iEaT!%ANkQ%~ru2whUxk}(Yny0j~zEAeodd1J~6(4PcXhQ8b zz$07$PcP;#8j+fZKnt&&GS=fb@S(RR+F+(8qk9#lL;L;X4h! zgZ?<>8+M2Nb9%2E!u4vS23F?}?O(MhM=HcThKO*P3fA)X;oq%5YKWd-9eKXg%>`9F zcPgq@Tv!}z^T?Em%YU*Re!)oz-^iCfChTB-lD?AtdD>Nkk8BRV@~!Q%`a8~@atV(= zB=zSxask|N8?=`w7uFBwIpz>Xg+F2_tmk03RZP=#oE1N5uH;*IMqTrWC%zRC=26+s zDf{+Q@X^+FW&&y8+y?y>WgJKF0Q*y&$_Bd|d5TxC4)JM(&wCT@C&`d<9KI25GSb1P zxPWUBRrTgk1fuLCk9Q<_&g;mP+zDUhZO5AYoPuYc0^#5sQTRT&1EK3l2saGrGLQGk z+}0>!z3$mB*ng5OzB=#T`^X80(BohCcqVfP{BnP|q`q`=9}TjmQ%vf8sQ8Gv#-)?h z{{x3XAA2_hVh$61F4AA?Z*#rLg0esKxPU*jB7hv>NS zI8V=(Mz`a-*7&ZGZ>DeR$MDEp(>sIfOHZ46M2>^wICB$x-!mUPsJNkj+kT}OzHlz0 z*RvkYIZz#>uuCqxBai#S%I`U!HvAF&W9JZ3Yp_?~S;Kn7*q1l|b!dUrH%XpSNci^= z;U>o(;@q;Z%tK-?aNbh2%-{S@6=;Ku0P9P<;;-;a?t6sm7kFeI=3dR*Pjikksv+#* z=foj%_k2}uwt#yZwF~2{=bGnSLGgP!WlsKf2#C{mb++VBipdghlp zLFm;g=mx1Dt!nYm*NBKOwJ?pjAim?gCy5FFt3ct>2B1Lgze}yYkn7&P@7!B4$MuNq zK;)zDGany>e5udEvMSK-gkB2)3M>L5H$0Wy&x`A@!(GQPvSo-k=ckzUmzQWmI<%-5N} z<~z;2ld$;C{lfcoN#3t(7U$YINdA1$ItPQCvzIL#Zj2k8o*V|Tnd-?e8TJ##<`dIeAdcIMz#V@xyLox zgBV+x_v(%bmq+qYa;>8N^%H4U-Nk$M@bSyEh_sz0JOAv9R-G>SZztHNr8$Ya{T_lU zF6c|RlzsMgSs#fq*`R z_XWyjyMk=a?L>s+#v!5aR{|uUfG~EpE73S`Rtt#io+3gT`l+T+Q z?uK(Y=b$*`T=71vf>Dr7;}BX`)JqETBbIfD!%q=xT%Wj zwGeLM*y-O<`SBtuM7LksgU@FtjjgtxMo8*L?H1;8IF$b8A_{A`aEdQ}8BRIBi-%F; zcpBxtlT-o0?ofka>l{|P2-~^$ndAHM2NO4r{^nzN6{c<&d}PFr?bM0A215<>brt-Nj z5(9Z2pn3UybjbeQ^B4i6zJ>1ShmSt&f#Pwz&xr}|%pv(U0VNx}3Na;fnFD)(_YXBX zcKZSL@9f|3^N&vdm$u#gDps!Pyc&6Gt-coFuepBKN3kATTVEEq>f5OZoMZlhN5!Dm zhnv>tRp$}%UvE_e=aEj-lg)>r(|YupqwqAM;D*+Ss&&)zFdt{1xAzyG^QY6)y5%h7 z+{$&n_a%~PK84t|D)7p7oW|eHGvOB>TsGMz?(jmd;2eg4+y|bk@1g+&3dlat=?BE4 zl5Z=zfq?L#eZtR(%Dozr9F+KKRhT13`kg=x&z{DgGyXwV2K!sX!hg-|ptoycUB3{*LSsiv3m?&;X$~&k$mV+=&!%M`A}9NDmE}5 zw^Ytg=ZCI}Av1>{>}LIoHk@_p_CX5lh@wLZJP4=cWjTMki6-PI79DB1@CzK`Q!V0L z8{0YAD=lk(Pm{mSJ_+yh+;974xF7E}bSk`${z-u_a3z#r9D(jn(8d)Z_R-mX5l)D9 z7vYv4g;O}Xjw<%sy0f`Ys8oD}#}Ju7gAc187w)U~f;zCEb)xm~w}=hp`Cmx*PSKl~ z_odMmV#1Axgt`8TO&do9c2qY~35^KRdNTGdGGFGt$|v(?zx=*Y2Xo|nl85ObnZ~*; zF!$2Y5TbC5OfHGjkO6p*-&|zC#(T5j&xRir`Qf%I*l&=W`@BgLw${Hf>j~{3nPa;f**u z)Ad~oM;>^t`RHqIw(WYK7XRyzKU)PaAbdT6A`R%E3w1a25vuV=K=>!_zX>nh7A~3J zM0U_3qdhW`DgX_-%sbrby0`|~i+t~y3t7MBl|5rkUS+Q2ZuoX6KrCX+m9d>1uxR%) z&s~E6=NTYd{NhGS1&l}dHr{7?R1VuG$RpMJ%R7)zd&q_GNc|YTiaA|@XQ?sWkErNI z!pg2U2k}2CaBTzf6fXQHDD2J%>%PB*FqJ2fBOLIE=!!B`?3N3GmdvX#%bACjEqz#4 z3-&2JUBdbXr|en7 z!Y9mem)jK{Bel zvR)x1{DvIKC-Qx!3T^~CknG@EM2k6B*Qazn9pDu`izzupQI(T*3C=FeE6o#~y>Ap@ zLLNlm25PUGBdlU+`ohh*-iWBW?iwUI^1td*=Q@Ok;8An$g)qqGJ}M2VzqpRnZXxi~ z{cwDuK2QWZ(ZJ2B$44^Xut;>VMdGV+HlcC;-8j@~;JMVKQ?^}gm{XfSfad^V8bbtr zhA~JPTcOwFq!qGG%JYgcj=`h8u04oIzIuj|)y=ie5B3wfC0{5;wvh)f!F-AN<-Y9h zqi+c{L0YadxFb(E2foc}VUO78-WS3| zDS7Q%@O`5OAjpwig~)I+updN@aJ_@lPsW>2nUISt+3V-5W8G>%$yxd$B0SNMMsWjo zz*~>^E1vPZ4|mWsw#z>F0^En^N}i!d_~Zfcp~Og}W49yrrvh~%(3JVEF@@*r4=;1* z;Sn98=Nr!F*5`0uZDlhR_={2-?+sll*!DMs53}A&+rWNJhw!AFV|YK|lw2v7)NjQ{ z`0p>Dpnza-QoHf}78DIq{C3;fJ|vV*;lu0u^>6jQ^Kd?%v6JJ+q#UQ56yox2b$=cJohqx+wM?>MVrv9?!W!|qUta9=Y@Y@j%b$n zYrJvwf+F}n=i5eSFc-)#a~$u*0;=3#e$4NGM7Zg$)oL+-0^zOuCUCA*4euxXJM*;M z0oE}_@8X=h#3MA&?+^V+&LwdT;QGZQ_m}=ZI&gZUxHtO=G|`beE^>}tXp{noK@*Om zBSvGkt5Br+g41xQa=AGUJ-y9#=GsZNpC_}grjT5E9qkB<4#p6^t$u=ZrmGMTeGR4S z&^_o8o?xUVFHNn#UV{E(Qwl1(ZglR`H?U4MZe_iX#LbV zY&&wtx4Zr=*oC0%FSGvSJW`_{=kSG@mu}Sq+&||x{(%OPNZv$#hcoc@VE$J~#kX7i zf!f!3q19vEd_?9fiK#RvxB-O<+P)SI2qa^=Fxikvwy@T z@1gq?9Y@1aA-U<1x6e|ej)=@D{G%vG?JsB~`~3SCtG;A^T(lk6t+Ao>L7#y(fa|pA zYZO1!8rr)glirBx8(FUys;1c2JCH+Ty^(hKR9mzFL2{YfeuDNK*?zBvU-l3_$!(5H zpB|yp;>E3SDIa7K1tXNO%(`EA9ud5e=Uic#3wWdti%K7rko!nqr4B4O(@BW*5WKd1 zuf5!77j(%_C~m>ICfWnMk8m|s;9mq^QUR;b-ekU^U2;8&WY6SyfdAg(qdxgGGIEk_ z?|1)xI4Y|H@;54@I3l00?%9a)KEt?yx!l3Age7sqE6N__k2mo!}bb~KO}t60HxnPdcAe-vra$KMg1QVU-De4Nc>$v$%psHlmQVr za^6Q%sKr)ZQzOkm${{2RR3?CigBN`A4y%To?M@+PUznZ6o3NwwNYS z@DeSf>ueaZm#w7OufJELbR6rIJhK0fzDi)eghY|<2p=&vxa~D67!DSl22Of zVZKW_+0Gq*z#;R{LKW9_jSW9!ojkYvTYNd@S=;0TFTqdO_l|Q2+)aig>wKLi`V8sU z{7EIuKv?pE-#h!_`OMd>pXYzH0GJB5JdaM{O1n0yU~yDRj$2Ilm*Kt27>K|y74!+c zE$gCV9c7QMV)}+7HgMsS<^QaM{+w_gp!#~&3x|%e{wG&_CjrsL2Dxs5 zMk<$$D-e{Q+t-xO!?;HYV-O`fQN?#~J;l#~o&IM}Z?^gi=5qxV{$x5Lk{{+3-DOOC z;t9!p(uopNYbIRJ&VKiW_x4%eFY{E4f$YaEUe5W4+WYKhaf;4ANb9SszJ>mb3L1tZ zpY_o86zA2}^o0kXSpP%qH3{3^x3<5MeyS^qZYRN2YeZ-pSZfDN;q&Ps<{Sr4cE6!( z-BRm5r?^b(_i07J5AP$I$vHk*N^V;lhUDRTTJzpm%VO?$d@$!4_=T61xr+O5yX<59 zs;pjE!)LUem@x8_(mSj=?5tJI-uDj*BtO*bMAyS)goQ8R32@y2}e)Y|d{&_F7xy%95TGMOy5Q4J5(qzx&vu&96<Y2lY3%ee6_8r-dUtHRA$^bW3zJFoo$T5GzFMFuKCia1OODHJi z2;6F%{{w>UNl@}OB8m$#&$dd=dtLdgZ-+)`(p$~hIUQ~l2CPC6)=d1A2~<% zoqq9i1TS&Du02L=@6QM<;eDC+C-wu!cX2L7jMhhu)8T%X#+UcQE_q0P;XH(vurD@} z{x^NW@E(2ggAT)=L~MZyY(-M`ImR*?*K~vHW!}$tAEUA2w=j;X05=p%f307~dlIMc zBtmbf#XB^)mmQLeVjslMy+alD@8a-RPc^?%H^;VXWw&{`UtfWJAnV-1YMwV8W&_Rz zHYT5#UDWXsf)5e^tUG+Nr|}7YJ9?6RnmLzg;9eib^~}%oh>lvDtqN+yBh3HteWqTN z|9EqD(cAkM@_nWCQ2;dC{DXxt_e)&&1w^M(*i-FI z|Kliym0k8>Xp)Dgy~^{^knqB_!T*x52mUs9KYgjyDtLQwK9l!RnjhO?Jf?yPP;rUp z<)u&X{=?Ig^w<3movj)V=!!=>+NxtY-^(dn1kVIMZ`_BOvs%)K_p0Ul*OHJ3F4@c2 zUs1qY+o|B`dz-EO2V4H=v~Js}74ZMfT$q3wd$)n_Lp3Oe=UQc~LGX1ofI{>ur8Be5 zs<$hnyxtY)->|RHE4jJuwwx#Goy_~%O34|B2@f~=6?18Vvd_|g_5;*)-lA1fZQ)WTF-B6 zhWPJ%9%;3hKkoVBY}452mtdE@j$h_rLGfuu&(k7nJG_gSTOCvK!{JE&$aS_Mxe{*C zTX=mpAIls26bxLua_65*QT(S8&;Sqlj#23-?*~B+om|7;~A7hI|f(o>PHZ@N1lJ;|p^h zqSl#pNjb8gF-Eap(=(R_>wiMO`eAZRAwG-eeSX=aT~g}?@7;DF9tCfmM8 zat4jd-H5P?CmW3dD(haI0`m~(%!g}qUh_GptU&sZWJn2o;gj5&$cwDA2}z!gE}VQT}TK^ zUXON488+d6{+7lIW&&P0XM8Gdxvufc7K} z^nHku?QnPy!4KKbtRLgwM-x6^w2--&+WlOQ>B9Tb?qQvhF^Txt0`6xwaS#J>ROnBN45f)ug4M)H$KI+&e z+OK?sf}D#DFYl%Ne=`cYTGcuJ^* zL*WH(fJ^vtM{mBWPx^=o+cy9BC1;%JD3mLiS3c~0cLfw|YZDLB)rHz`%I`_=HQ<9)J^(tM^*f*~A{%HEu3Rywuw&rN%5f=77r zv0oN-c;dNY=wDI3^-pjW5x3&5|8lI|GRN^Ko5FDGxnur#`DM-%a*2<|&fHqtG3lo_ z36D0g)hhRj&LF6;ru*QlCJ_9$aDU4@^UyPV&qQA$LD@-+J@Du9+=3sVr%TS!TmliE zhFkOo9_ddjCBHC6Q|9BpA^Ib~Pa)v|>Gadioexc8u3uER{rcmqBh^JuqqU+y8O^#k zmC+p4vd@nQf4@-PyP)WC!((_(q>KNvM&BM3PEcYLfqb?=tIeE1_n!)6fFflN+K!;q zzhTimN9A+yNuIlQC;Oa|Y0QH(WMAPvNEoG?;oHmSh}nquIK^{0uU;R=J|~xo`$};_7?`4&Tdi1F#tZ%+4zOOVb*1T zOyz6rzc1~>b9CQzte1<;WG;xYmi+>5N;Cg547ccCYjmuhT-Lc2SMofnqW%gZZNVj6 z9mjVHXlOhBV|CZP`XQ|PyV-*MXTL_^cPd*JAlQO{?N&Y1lYQQv<7$wGkoYyC3WwGi zo8E13_st*8wE7g@>v)yz<3V`j9`$^u44|kq!vn`VBUT^D=W_H3ey>Bqch`OF1Jb+D z80Qx2y<~rj-jaQ1dLGYXHHD|14&BN8_G-}yM}>=7NaMS2&LJrN$gsS(y6lx|&Yh5| zbFV_;V8&tyz{R`DE*tQUE#ltLuL+X-< zl4XxU@C@f=6{)uCR%nB0!5>F~vPs>6h|JLvrK~H--=z)$*q>E~egyv^eZ?=(geM&N zopYcA6nmKQJ^Xc;7wm0LcCEJ%Y|8mz_G>Rt5-$8n-eW}w7h?Y#`bqX_Y96j9Ba&06 z9p@Yxe`(;}=Ue>(?5EV0Q|$3X=ppXoswa`Gb10%K zcrINedbpq(6I_e%dL=l4{sxT+mm~Zn>s*7&d0(B7eWx~B1rNg`oE3-68G@=jAA#^X z&N+(t2R-}#d+XqHbFQ2=nm8DzkQ$-{+Auhf6`mihr(r%_@{b4$A4Lz)01GS&{rI+1(9Q+u`;V`0G2&Jv zma{GOFgFrt9QQ2pGnbKz^%SM2N2_o{}~_Otl0BNT^l)t^@X$-HP&<{eSFPkb^5 zbqL=(b%y&m{{zfzje3|H9R7z2yYHY6Q#T!AwDqfVCz8SoaFS}P!AV4g^BNKkMqwH2 zKD1AHZasmE{6c5uHKAEGM zS1I5pD%-MOzcfY1(^v5Q%3P}0Z(OP;CeIWP7rn9D<*2AC%glbwEhCB0=G$1iI?92!Llh=X8ahVt+-9 z{+Oq>W6O^tfB3ZFP8fA~KkXA=hF5a>e4{A z0jUp@qMy_DbN;L^jdMfnC3L+uLQwYEQOUK4S;cM7%QNA#GdDm}+~Q40ZQ^>_5S^h{ z^!5HLJU22YsQ^_JA0oTwGcfwlIB^O*0resx`ZoJX^>0|0?ylijt8(~yI2A_nUYuxL z`^nmOUT<69V2Azv$NvXA;V(=6L_~7D<5zQDt|@xU$UD?;S@qp|!U|D-9OrRq>u4VJ z8S-VWW{%`MLjPW_KaBgCvy@Oc;O7vM`EQ}(@!SRbzszF@HyQEe52<_1wrO9x z`&M_gAxf|FcQfI5oAn3r7Zs?@dauX^)4{3-IIqk;oVkR>Lk6{)QJZ+wG{{d!RQ$XV zQpbL@7rN~EwC>EePrX0(jUy9!!TBEloDs>X3aPozG}z_6(Q0z}l#I6nBF9t^1Ck$e z9cO>M8x?A>OD=M_Cj}<0hNg6lMTpK|KVwMvX#UEwNo{NAz$* zY}9XTvA$2D2G#zc0|YcA)5{BKR^6r%i462Lht|FzZpFKMR!;6;KGJ zzqKTSApF9m)mo^)co@Q~_C)x7_fU7#qC31n&Oh^}kvwlAN*+9YVco?KQ2vK-55DGo znA5KA5!-=*T<`weDYPW|zy*XG(&D5ILMuf_tgh$h;gy_*P&VtMV-r~?vU$tkzaG2w zE*JyIuxizHQrCEe6YpbA4Jz|^ex@x_ojzisCkYQxfe|pW$2-IO20$+*TU7&SHTC97 z)?pf}X}@s{n({_JzBev;3@sJ!<@!ePgVz>gwAs;gg>I7-zx}>W1ei{ zis-0BD^9q#rmAm*l9Qx@+08KCjKS zt(aeSzT;IX*fq|XkIMWq{x-#OEQCo^v)(~Oe&q8%NPgG4{~~C;waG~)v}zSZh$6BT z-SaKX&lG4DeuMMP4B>|*CGRmPoQ)!N%r%B{WB0Zlk55KO@{EkG6vXzNZPg1`p1tMO z`v2uTIzDI4LVSz@I3ZfiysUuYP55B{@=Yp?P%M08ze)0(TM$!niYbUn9=p+MAT_qo z>XMD;Iiw1B4(Ad+aqMp9bA{ez|AfQFIw%!N!|T16)YiWJ`EdD#DC zo^Pl>&z<$=+y}%+eLnn7gd_*rKb&Iy+QRz_=f#Kf+1KW5!2G~~JP*-y-+T`I@k|lFV%aOTHwHIWBx^>L-4Fj5S>M>Ro7n(iO(Dgw?+X z)z5Mca!lbg9)(@iXSX3N{a{qiEB!g%7l&U|080cF)*@lmhoobj1#KEIAH3Cnzu^RQSU<$9iq?r;@ zz>ss^D|zY>$?r2dvyR52d<~u9Jjy;m=U;?#XoS;U&K6F*wvTP@`g0pvoOlS%-JIL1 ziN7K~mi4}-M)ht%Kk?W{kGN#1u*_E~m? zbG-(|N0_4*xR!l+QSqfjWp8JQuTy)G&-2tA_QSgCbA1tgMHvFDpNHq(_Jj%~fiBNO z(RHH#psM4}D@aKWl|ytN4&`f%BlOLubq0jrfG#;EQQ2pO2vdF1I=@y6hgEVr!jk9c zoc*BrQ*axC(g((bSFE4As^G03tn*#P_1%K#4w;LO;`cSwam9fz^CrUIg*jk>P3#Xd z$1@MVvLDZ%%S5N^ui?C1`;b*Q9f2V^Q(ochd$ZIa)jFrxU*Q!VQpxPcH*~&gFe=88 zL9!h@YAyUWoUFsO9r6ypdElav*!Nhs&$|t_?ooS}yR4fSp|5xT_{*(M_{ERrl|CvY zdUj3xSG!^E?Q?el4DK@!=tT{0DZJtr^!HIfT2!7t^yY8>i$VL7^WC&*%qNY?e$SZ4 z`cb0=``k6jr_$Bf?J5{fer|N}=NXclRQ(#izuI8#U+tf;pCYXAPS+wT+$y8HGCU$O zSOt_K^b`C2lWx{+=|k0^6}}pdlH_ZKa+!k{RoJMfpv`BFZ(zO(1cZM3B_d>?Sj9x# z1oKh)=Rbp2INg52<$aq2GsSr)B_Feo+gPEDoYwcI0&Ec>?ERq)FnY3&%kwbnot<@6 zUJP8qi8|e|yPW&zbM;}*X1!(f8j>|WfcPgok2aT+J@pnu#Ag%|j!=lk zyf=LbeLCw_ik{^9)7;Da^T6kvlV}W~viSuhWzH7bq=JWGZ^%9#XN~_)^wLH@^&Z$( z-uvYzUvGUCQQ^cmn^N%mT*O^GFO80GNQ5o~#SiFEd$u1?tn8Yr5fopE){K2%(Mg== zW=!LLQ&a78cNDAjaa*_~Up@9LIv#guZd$NC^NR^v!A|iUe)ECV4a}4D? zXs7I1BX{szUthvHQBBotFCZlMez2ZZM)$Y?pW@2|5U$|7PvhY0YIf#H>H8Eo8fI(eX6o~3KyU$u z+>h0hdB348=0D#qxfWsZ*GAR-Vm+r1uumc)If9}4ty}c#sYveP941}ipRR^a@+@m| zYr^Mfo%|kRFEZCfyTJJd0U!ID^)Z~6TRdHX;9-7B58#*o@g4nP+U$Lbc*m8fe&SP< zNKT)zP3FJTX))glQIfHQtaDF|8SBBT#%Igm%;LSG^9t`Z&b&CT%cjR>*uFbBZGES~ zgW>p)`^K0&&vEfBnhUtkieB|2Ed&vk`!M_w>&f)vtb4UfuA?b=J;6o_AOhnI&jXUv zlyMWGx7hdOxQ%l$+_$lAEi5_;gL77Fi|QSHt<9M^h$<}8pKvNJUpK_hlMv)K#H?>? z{*_}0zQX(ihx8dG4{@$spptnQn&c|SHuFB;7|8QF4b<3Oh2jRxd3R}?hZU>C`p2k} zWp9Dw3iG=4Rut^G9d_xLqry>7NuTcch4bv4^fYu!A*{-!K2{w{0)pQWlbpG*@K1xS zc+cWfb;Fwok5+~#IBR$?l8YCk7>!yf7@L_7Xv`x6#8ZeV%+YA*vL^|CedWEa1D`^G z)+_gKMsNl_Mtfn3UbS+)TD+h%NwWF};CHf~Lp#rVa6^qx?uJkNr@ni6AK?3yp98<> zAxh@6Zl^;0l5T1z^=i1HG`3x4+b6l-2WBoR2=saqp;9?FUt}G8Kxdt)Z-8(_PW`(0 z&#lGK`Vo-yEcPC2F)6ylsw?YRKlXt2)_JA|3GmS=+%jJ+17_z?A#1YQ{nQ*u+PWxt@+7QK0uGRPw=x!*CH z3JSF9aOT8B%Loj50AbnBCl9h8Rj+%28eI5Ar{I)4t;qXZuC*#7#Auq=AZhiR%r_3y zaPT`*Jjf#`eoGk(V6JDrmS6nZLCM{Y-_Q3($-*JyUVW<)W;4n4c$#&_(W9)VHq!yWjp1bjeGz8|?dvcV^vU=vB^#GbC3wndH5ENdA6%%xWK|Wy3v^^?6}~ z=MlyxWq7hpZ~XYaD>u|fthX|B!6i9c3DJASWM2?0B%wtLj>9x&c;LVLD!7RIJ#CQi zX*LX+`j&qWjBi-Sq5Z==*x~{CTdWQe?iPegi6izGHP~*1g`4Uq<(wS-OU`p}sJZ%E z|M5RkcL~3%F6W-Q)c*BRM2>R3tmn}|{5`au%;O86WiD0 zTg$q!FEt>36RnzX9^YDhDEk5Zs*E2DpVX;-(S`VeJkKbRc}<1z7~DSI>$%@iK2zJT ziiZ-#-nLn#iIWSg=Y)b)G7+w1ziv?c@Ls0^y&-&vd4JkE{`2;kBNo^H&gzRN@IE)# zP#NRk`;Ptk{*(0jwn9}+KmE-+4ZeHPs^e#{PdTb|hp;F#J=m;yPSh;^x!>3RPr+; zYR;WR>K)Dn)_-P>onN?t4$&b-l#SS`H=b7mZ0Pr~K0kPzb!_??)&~}gZ_^b1qQAWg zq(xB0wS^I%&ikB_KFrlIZzG++z3}}=^4n(6+VZ~65RQ(oH~W-b!o_#Fek`wj{%@Q~ zUVgUMt%vYdv-#nxez)%1ma1_bJb{$g00*BbIJ`Jrk_@X%BP6HI;iCLGc03 z$M6njpP44SorvTcJLO*0HS)=P2#0W)qK8?RS6p8i5aE1<=Uq;kW)81J)W#evU2=A{ zNxavHNSuNN&G&4-o?iXZkDsSwU(-~!W98Qf*Z6i`=3KqN-(-)N z4&SB$^n)W(oB1!=e!ia%e0hA^SD|8#OLRd;nTr z7ZP+K_5k(Ix&Lvi4SEaSFsy!E4WM9vY-umSe3`kdy2_z$3G+U>Mq8tL*Lb@4p#8}? zd=A-vN7l1mKoeh~vHG*#fiK=cY%J#sMLt(S6-d3OE-tGM^ia?e0*cr11)K`E_3nRp zp;~9|pY;!E|MEV9l3%Aso?o)JVLnQppxD-DU`mclK=>)4Czx{>|3x(2>Ze~9E_T@j-x_ulge|Btx`kqbj{7kN6Uz!ZS6M?`9)rg-a!$}w#@M`&XZhYq4gZ`{MxWlEQnRNZvJJ|3&%PmK(eA~5d=l| z6Q89FF{pgbPlQU8-A-VmRR~Jmt1Eo?jWE^ys>4T5CltTLIMnr3mCjmcVvM)AtRUjd@ zS_zyG5r2A0eA4<`>?;e1Ue+ml*Jz(x$IX7>RcOM?)JG9sD2U);=4I+$=0ukCqyYO7 zFrA!d8+d~E!NGwlcmVNlSQlLK9qaeaG3?Xv*UTSV@E*>X$6R*5>~&l+KdbRUo)tZj z?e2W{11pno-pl&-*f-3DPsm;%{)8HEBle044o6h>Uy=+ zH|e)L_6JhAtnUkFbMBjSFwc?QqBD+4-ixXBQy*j1((e5hl;uNvnEM>ht<057%yO>J zYLgC4^jo1x{P#MAS6wRei%=2ql&romi}%6WyEj?|VgQE0eYrlG*2-g0tZ;pI!&9XM zn$R{g=PQ~`^2`o!y-Ogc*)UqE`wq?tcM#|X(Kvs9#baNwPTDWwe1q&x!{O@2de5kQ zj)v%P^p4E=h_1MU2xth=lwrtt1k{}5UPLZ8Jv6!W09-koqZ;nUTncSB=Qo&lGw;)^ z$8#R-6`o@nqxrlF54){L{hc`ot|r@X6NKcvjFT$xy6vd^g84mV!)P4X8A0JT=!?{V z1m zhdRA+V%?=pR=-1Qx`$=&JP{$83;KjB6un6mY|!svuKy8A3G8|f<_;B%fw1^o0u;Ad z@)?44meRlvRkPHE1HDWc{GiWK!Y-@sB9Og_xa8cM%Kp~``Yz@TnIz|XD}eaToa<~f zW!{rHo`P}@qq-)Cqm11qe+8pLO8>JuEhFocj*e#U9cLO3a&n~XfV@Muk z;6)Xb3fCddqlhjh&P55dA6TcSE4l9gtA3N`><;$tm9$`eYy1n+FE2qrI3A(C$_R>h z35_Wlp+wFvQ*wR%JrrOTF*Ucap1(7aAEA-q=v%nHq-*nbxP@z#Mwq~ZI;Q=$@O<}@ z&DOc61kTVJx2doXS%HM;LE~GR6g#dPf>`u7B6}k`!)gOI=OH3o4pUWz6lfVv;s1E%a-L@NVfLk&PhVR*TFZ$=GMCgIVx5Lt`l>{kIiuu} zGH5GmKhq^>-8ZTac-E@Bl))dR6BSq;;g-x%(1qKteaXIUQ>_P9L4U{Bp!cM$C=o8U zm*Sf1SoNCp?a>JHSzWg(!3_-IeK=Tn5AC{_=-{^M37R98!YRCXcNg}ZM8(fx9N>Mc z{wU|6#%`c-Tsp#%tKgUWHd?-kKppUi4nA@V^MRu7d;P zIN#eZd*#yh%r&SuN(IC_P*{?SKfv4OFB)vy_B8DMbiBQegMl~PS?}G5nDD%#l5Z6f zpSGW>nkOp|5zdM}j`gC)j1l{@`&iFS8o%!$&No3&eDFcZ+p1c`{gLs33JQeYk8_^1 zca)G4@#{F}*R0`=$j@t>96^9M#D%M398iWO#BZT{Zw{(Ak{&hzU0w4H;Tp^QyI4or zt4n@^QOvwM?Izx*MHQCRh2mC=PTkmlJ9Noe2oj#-{=;yMXB|K^lk?0p;e6?Go`k4R z+C#cKDnN##pfW3fRrO}|I2+{B1Z+vLlZtwSaPnNPUd)*s_|<- zgozTh+v@9u=c#$RpC#loH!1@_*SFCcy8@^u-?aG z=l^Vde*8S>0||Kc8_aLncWaL0=S{E2x^`nWbBx1Eo>(8jA*?eBNiKZ+4c2W{o@Kvg zStI7P2E`9yNZ%J9{u&v!5s>_XfaI419#9890z)|0qjVnGwdSB=F4w7E*;{(lnrp9Z zhxjfJD7)VZM5PXkK0;q`e}wNRpvGSKg?}9JaDAc=W*^T<;YGx+=e{m1zS01>-j=mR zP>nYiq3VUM)ZoF`N zK_$m~_rJcwypNwp|0~oMJ_&b|gB0ulxA=6@MEAYa^Z0cuvOkAY&c~QMPYLO}63tl; zsWs*2G**+Rae=wr0HQ!$zlM6=+;F|j`S6Jr+!uwrWfgq=O(&QtH)Ax4ALkscDB+d% zM&VM}&9T<|$K1@=HO${Ji{GFN02^<(>AB?>|$g0 zL#^PdcZvq0C_TZvhHw$z2m1G95Ihcz#=0;51@jlq6V*-D^OqbVz{n~1gg2}mVJ?9- zjOTXl7dijg_=$Ck&K+dSdk5Oqo2+wrpI7g&U)(7x=XJ+#}(%jAcwBC;U5n~JMw<2ej z{Ip~6EeNUc&o>A+A)!GY;)=%}MP-m)$bKl3J#t8LE{tK!b&fwq_2L}}4pqTK2uN;S zK)5jhIaf)}@7*Hw0kjaDBxXXK^oJ5cpLKflJ0uXelg z=pg9w{c0naj}f2G`czXmk-F%&O!3XdhpFHh7}?BUj4x+?TDAD7bjkH`(fE7pZ-|NC zQWL$rS;IqJ!2JHG@Gy!$pkVB57>BH%YUCIMtuC!`g>|2(Hhui`&?Cin&jL?YWUK^(T`1KU!`XVEiB$g zWE0QT^m|DTd>!JF(-4>ahhCR;e?~HH9Y`k-$@}-o$*5@#fjINr7u zP1F#U`Yt%Tks=r|0t|43k_nX`g$8sr$&bkkUH(;u<#of^BupTs)P=Q=1-gv-zAgpuX zK<{4{|G5nzCBM5KuHfAH%Ok51`$O)9Rh<84NF5fIJ&lo0<-7HMFHiw-i0`9)hmO!q zH0BzQ@CVH0OMFH#18<|WH9u$ZH~1b83U^g+_TrD_wSR{x`ksKFW{q%G0~rz-&S7N>p&9j z_RPObZ0B6$i0~NWUvM5{jV>bAm-lWic}{)8F^H8Nqlt&r4{?3BHNWVEhTm9!uW&5A zeOZTH2p>1vzwyZGZbfh7)sxk zJi8=;As>J)@2&PI-+LZqU+ME1)<5CDVPraFzfxJ-!Q*f-@*Q^GefBkx9a-iCs#}wRe`YZU_*(# zHK6rq10?UFf&6z!JVLK$BWQz|1EM`bhEuEGZpm{s^CR|Gx<{x$Pb4I7C(@EYQj-v0 z$v)rWUCPjgn8F6!0QY|0fBETgoO2P{&D_7mWskMZ`^%qq{aOkAO)5C+z+1}s;K?xa zcJ!~+-~`d9d4AzK$Mc6Wxi=!>H#Ayv4z(U&u3!8buD^|mthXthM}?~&e#w2(-)7yQ z_9pMoJzdm=4Ra*x8C`GhrUgB;-`PiB@+)DvC&P0q6-o^>xZe^&TyYW`AbuOyEBZtQK!x#} z%xeZTdvtDbBZSs+{%!am??)4I&Q|Kwes@RNe2RN`%DR6@c>NfR(+_QWx7QTJcW_=^ zs2TflLnK@NUPtg*=G+D+GWWAo{EwA&D3IwKyqDV1<_$h2>*#LVy1MoA%k^9w{q_DY zRyJG-?OLwWG~sE7<$DQunada(!TC>m8RzYt-N-tr_%CaT6o#newuawUU`m93rE6d* zs#JU42&Qn7jM2=S(Ql(T-VsO$pDW&x)*Ut&vi~!y`1^`$$6GvemjScmp>DO76(BA- z;nnAubEvzROW;lxJ%0X1pY?q5d{{rc!g^8sFePt7e_e7CuCdC?X0uTudUhkF@|h4O zI@!R}aEZ@STRLV@trtxgk_TqUygl**pC9G}?^(b26qKnPv)+hbA`bQ;goo@WumU3L zSeuW8%1a%KQu)v0G9L?#<(wp4IHU1~oMRERQ;f~GaOds&wdc)6@NC)s`^8S@kRiN; z&63~cn#ulrtv_=@k}8L9JQDMmXQs)yt?lMLskVgdPuVa(<2hIjpEx0Yl;~4b=Uer_ zbguu4|D=7!eTXS8`H%2OKBaFnjjLXSCV541^_&jG&i6ilDca>;>%A1-`4Vc&KSuI0 z(rx?hhW^ub3pxnoU0XohJO#^bJlN__9q$oc=#_c z$5NLZJZ&lKiaepIWKf1VZ0Da#Dy{or81E-^;VYG#=KItmelJf=KG4hG6FJtpzm&XA{W|r(Wwi6Hq?mgL2UyG`tF8T`S7RGZH4d@Dwwyx$a$B* z1c+0+(54b0+D5&30HOC-j}i{n|hr z|Gn3bcg?W+tCqYsjj8_pXN1My9guxWRB{H4r+EH*R`UPiRn0e^o|=tF;b;=hBYY>7 z;d>F5{dd(qH3)#&i}i&@EA}hs>p7P*A$3T+GszUcg;CCVobmpgN1W)$=cxJ9+cc0v z;&$#otCjp<9Sq4O^gN`D;LtL-FRRfZ#DzbrKghg9?e)7TC;%m@tQi2)CcMkm%fBd&44CHYU< z`|M{*%3dS!1?TnF__eg3*axA_oJtBEn4*93h>tT#*UQJ35#3Ac&!LDPRA4Que&&8c zt2sA>$LA;d^2%GGJ&~XwBgEYV2AhvxGr!H~@c13jGkA{T+sk|5WHrwz^c}1-j())P zm8+iu9H1<$0#*R=V=kzlD1z&)e$THK1<;hO zyB0j+k1^*nSIH%MV_o#{lhwvC}9Pz zSodRBo;#m&^8J<=LNd~ch<--vftd))oGWyh^AD;rC>HTXn2#{u-*|%ako6DPSDH{c z!uMF88!bla!!Vdb6o1m0b#$p03AMhz17^`|&g;I3{o$JUk_?sml(gzh)=Sms6U@zA zXO{-)7(8gzHJmdMuHt-~Xm1t3gXI0JCoEO<=@leM{&47NglqcARSJBJxNveqODZX0 z$9hls&-IE9B!gtao-x>xY<%7R%j4maepgdEqmD>Q{(9ojI3iC%AINi6U3jP35!M&R zuTnvE@GR!KFWH*w+35ecPmlk}c>pDIStqHzLN===@C;&|Pv9*QsO^Gwn(SU5BQ9L! zefN)F_fn(jFlwpbF8G@$fjv@h3QwZ?{Ivc5WFj_{^GaQXgEPt=?1l2~qTgJ}oG;@Y z_R||gCI4^};?MEi)es&>srZruf3u&^5N?Owm-%a+f0hy$9A+l(Gd$wI)@9CJdKayg z_P{Iei+6@H{6P~ARD7HQ1j7*ii2erq{bPjf=(kiX-h>1dbyt^Ww;8&fQFmCEl?IRSkI#UdH-gL~9eC z{e2h|D>UD#`^Hn;m>uEAcaX6G;i;@k3yPmVwC>-sdQV$@loE!Np;C0ezFN!$@S80b zURyhATh;I0byqHr#qpyPn*OyU7n*P(G~vC31I*(L-bRCU7h-*hkGdU(a8lER7n+c~ z;OOBGmUnYn&$o+plHpU#fvEbE_pavpM+g7`V>iz|YPf_6$I=a`7|%0 zMDAAs~l-0%`mKUjcgX5UAE2vvSs&yt}(AW-iMB}UI=CJpXU*7qF44YnZkkCQBr5r z!{45QySwDv?O?8MGDJFnLL_PYI^&F02UB@w)x&)`-%4*salY#if0JZ=zrZ8sbMgb` zHOA_(PbG2Vsb1Z0=!%j8DzvVKwuyZ;9?^*gzGFYPF1oe2yA-3Zcc%$AsbQ}ki}D{t-+zVqLpA-E@e1n^2mIC!oK=`kj~>pASMva;-GU3-L*AoK}m?u?XDLRFaK8!`hA~YIsF9|A%omXuaM?N8a{@8ZQH1|i0ObFk^Qzs}YyQkWm?~$r zHVoke=)zx2cvZj>5;qN>JAZi;ro4~wICBjXOI2fxxNu?;>v(@wy-O`ZVQi+c!i(^} z$#XWn9{Vhf4&0a2>>~_yKUw{B4)YaC3MeSp>Nm2L;RO-entyTF>Ki4uRB~Gl$t^ce zas3cga;W7ng)>q18X5WRNW8~$l8A7dqbiQNJCeOvr(XIU=awe=u}?N!q6E&+vq%Or z5OF1!d<-GUh4X;$xwYVxdOd?E-u-ss=S`Uh=lCYTEj}4d_RXm_oI{u-ch1y}&_&On z59R%m_6Kvl;*)ug;uU>k(#d?q*eDfzh=k}ZO8(?LZ|$fu^#7N;6?l{HQ~fIDG9?Jp z5;L*ChwZ`ldo+d7g5+&I|Kq=-N&>FJe%)OO)(dEvWLz+%qh?vZUjI(^d z866ZD7x9z=JHxy|0s2uUyqA#l)5bf@!PSMk=o8;oT==Y>g{*hfg>z9V@3;2??^S%F zC(>`{dNjV3`7ox`m%7YLw8reK4~uVF@5y-|e(^m!#uHs@FvX;?3;}jlgxP?5*fTliT7lGP~tbT$t*(kX`WY@ zbt(RGJbdI9y3r3!^5G51y@}_upVjCarGX@L*$0;>c}{DXAr%OQh{5wskK`8WFAE>U zNuYJBZdlKAkJ!Y=Bh6cuBHonZB08b$163#@@u3o+Bk~*Pkwm@BcTc{o1i2_3(U>M1 zNc_P0bdg6iQij7&^PN_Riw-wj$vLCmTI`$k4X-4_9kS+fKea2neNm*75$V2n8zbGL&Hizmr9Mfx1FBtu3E`1h(Z^zTZ04d3FF?w_U zohJ9Xr`1REI=#9O6-{}b7gKH9XD}}C{cSAd{cl`yqD_VMx&dXXU3vteN7%0@`~&DY z>}TGn9&N&X3 zajv`Gf%hT)XIM9Y++BBk8eX^;r^?ANR%rFZJipTDYyI?JL{wf(ErePM_a&YA zNXA*#m1d~x()zi7{B&2N1zVxj!aqpXt#4iEXApnSYWL3;Bk?@qGxjhdv4@}>|{3?^ixjVNau8zO1h)F(H zyes>>%JwTE6B1G8G)3ipiBemBeIAn2I6trS9D%*8zUDCL3}?&U;Sh{rlD9aOa75Pk z_m&b~!YjEUUd3lSj%>;2_;q%t-0bAHa4VeG?a;O|=PEUjKsfIpIe~dU`bX?n(G$#L z*422g1L6*@>%Dm&(GQNK!kL|b_N)r}K!UFQuYl5SGH0mEJbG_A=SBrzy4e3j^9#_G zyyRgd#;hd)CXRG$GA%9R6pT5+rPfD=;LQY3z8S?0IET-8gLyC7EcPL|CI6{h>JjZa z=9-&L`1~;BK1noZ-G(W-=4GcPmqh9(<5PYP_1`!b*!KhXvGH%2bKt#}=h}Ko1)!r$ zxKzG{oTKh$;~wspXvg%xy+}CkeX&d7WCJd-{==kpC-OTV<&T$ z67o4Dj+2bB0gQ6i6`C?n($Y@7x~%VFME3D~G$!X~;v(xMEC1wqb$N3o^hNA`sY5GS zKb0_;%N3FHJNgXI6T;FDgjMY3K&yUY?q}swe4hA~{ct-1DmP?-ZRC;lOEd{Nvsqfk?0{3V_Dajlst^MI<@sZ^=zYvj zC9muy_BHF0yKRV$A#oF}RlC4&@gA>ce^|PjbyD$W`$-^&=uECJJdUrdgIKrj57x7o zgA@=G@m{PS)#@|1I6j{5gYrAs-;%tSY(WDN>(uk+!t}ckm0XMDL9!7(htfmLH%^3^ z-w=^|z~H<{#7}Y#ZA6u?pTZ;hL7&_c*|LB6nc^?U9EMwRa5UjYrADy7Et$^GpT1V+ zuJVkyJq`NK9ZIgXv`5UfD0KD+)_Ku5q^KGOJ>P{txe6e9LH&|32cU zs6qM!-uV>2)e(mHcgyZrL_h}kidaYKFCxLvOVAgxt|9Tf0*b;sMnNT2FkVywE@+pP z{tl6QL>DC-!2n&a>%-9AV}7aeH|HQG)SljrgyhiF@N?o#ILBI3*T~g~#93b!Q+uyn zNZ!CYfXXlhf4zn>C7ZD7g$E?BMtp0@mdrbfxE0VEQR=>b?TPS5%r6bE z@(bp^2V@Q&66a(R?N!MbO7u9lSj zWqdO0vy$(!Uai{6dkS+Jb3SYGMf44$s1bvy^xxKdC)_#1S#A|}U9JC~gx9~I^e4i^ zTYdR^JkO6c=ed%%Bl{(FsgulwV`yQC_(ZOswQj#z1=$~nFIB=#>l|PoQQ|kAU&X*2 zq^QinlEPap%^)3HCnRsA$I1G9dW1bYcz zIiV14HE2nLwu5tQQeSgjoRs`WU6l)W!FYtQA#cMF?seh~;U-C5Sn31Td1wc@Urx}P zY<3)_WD_j4`fk~i_(ks&5}lHs%lB#G689q~J1i~e+j|)d;TQ)q)r*7TAy%7t<{XSX z;n0LQ-`M>x>rX2VTd(u=7oo|YYZ4`_?;4mgr%n7oF(*&Jyv+A*`MsR`8>Thd&sSh< zBKi9rFdpXn!2dDtv*P>M|Kk(?w;_7fvXz`G;CeZw%_J||L`iDk#ko6g~q4Dp^I)a8sxmT zP#)JCT3_annB93Vko~SQZd&*A*Nun2whG!FH7K+C2j;Ov`>`IP`Z~_xj1N-)LF>I` zy`7=T)n-V_J}cRnu(QKqmhxUUv6wj=$(6jnji2TBAi3$KS>^7Xs6I@2@0(!$NNb%z z@X6jwKSub_88CI`37Uly!d7U~{*1 zfAU@>QJ3%WsN}?Wg$L}DJf@uIS)XxW@a{9Gavku(IbG&5 z)&-k2b7;wnj^D=q@A6NX3lfpNx!H{dW1V31A(?wG_%{;X)2bgOC&9Nw8JMiPYfh79 zxBZ2(-MsJdD|yyv1mx${&vKqYVmfpB%@XEr8j>Tbi+(*Kyn&j1S70goL$sr;mp0$7 zJ8|mMn)SKRxzZBJ=Le9J73M3fbBJ#wOv%g8r|g=Mwaa=Atke3=Wk;bkXAVSi1MB0f zZf74=xv~*ib!Ii^I>cXbk}=QfHz{7I4Pp;ncE{UWQb7GH|+TEky6=SmyR^LtT~#fd{P+pZ>oS*9Sz(=z!qG?;&>FZ8k{#3!2=gKx zw40GwqXrI0?%{qYo>T$PNY!EeNp*zpVKaly*+1Z4sv08b)e7Vbb0+PF>mczK0rBE6 zJJQ}_zttzQuBNOX&tc+&hsKf3=v-JPxBk$i9cO|EZJ<}bHePY6;Ev2IxZOZ?m0n5SvX z`S9SUeIK;WSJn;qKO12ev1b-E^Z!aO_ zV_lumj(H@>K4&_0TKzFj?RUFtKVyBbV|hOr5?@~Nr#$~P&gW8crF9RozuhC8g^CK+ zt7tzmCoW!_xjyDze$EoY0gKP&y!7&Qd~StBcVi0w*7%4%-)8V1x7xBhok-MLKu#?9 z65~&qmrui3u<@}i^S?k@;+9Zje`f@mvi~OV;~!r*>d7bdYm zfuvxrW8IqZ*dx1sfA~YIUZOS5Qp9)B$8jxU!rAfC@qFYT7`u6H8y`gbs2n6{OZAdf z|H-^EUZfU-D3|^}xj=mL&x-H44gp-YAtgD5WpxOnI|#}3oEH_NF7TnlFy)*`3}GH^ zRQ4m@f19}cujasaiT`)GR7MUg!Tx0*8yz}Y=fHgjpC6o22E8>2G(sqDLuKb2r1~fj zD-7X08)>|!G*oO%7bIjZ60kA9JGD+3N1?yMeEuZi*wQmmCY)7W>eE19W%NN<`25CD z-iIaMW&a#*e7EZjUs&I-^w}ZtBNuOyxzfX|-_kpg-gXJR%Evqgm2dDIMoaO0C0>{F z2~1B9T3lLvFmo^BV@XE07UeQWibxK&IqcH9hxa}M9&*KaGp)_Q_j&cC3iSpbMI~%|NcYfSBT2IUHg>tRFh*^r&cvc1!|+r zNne~*hdx9>3)>MFeRwjHaQIIlCj5%ng~=4~fr!FAzKIC6QJ*DICVft&hvZ|O5Ln0D z^N^eQa!bFy>#rO04k3-Elr}r`B>T>o*SZQZ=_A9EKdohQ?xHE2&b$=QQIiJG6*b9K zsM(`N53nw?TJrG{jj67@`u}~|vad-dnR}32#hkDBSlJiG*zcB1mN`-{z`>R^ZQDfyGDQTClxeos$Fyi|eXpgqlg zbg#-~4O{g(>v!VgcrKUd#(7PepYoNCA|da0h3vnQ%C7i4wE3Osq=7bp`N%2hv&zJ; zn@nfEy!OyE8hFC|fcG?sIm{W1J)#6z@Rl%F#`h}?Ds~}Ha(xeWE_BCp`oSx6V7(vb z$`va=(Hf+tv#!MGrUZa6N|;Au?B;qXS&wy^fo055O9?Mh7hYd-4RgNBR&c(KAzZ1z zEZ)zA3Fp#uDh!grtOz1`QZ4RrR^^y4mi@L3VflTFcQFUV9LD)ny5voGf93gL<#w*C zv>ML)J?ALN6Xs6tqm#lNjIUySUb(3N8Hl##d%%2;`6-6*mjWf7=nqEXSpwa>4!>|f zjnjNSmiH$+&$9>!U$!Q{(U3kdDY~%uhdd83C1+C~?{6O6vD$j?NER|02Bi(&*#W_I ztcTSv}THSF!Vx5)Y%z9o(5Az0+pOHYp zg{nuGt5;s5dl|)k>i9ZZ)9gjk%ejeKUGYb>Alcs|h-Cg$wSNEo|LNVzBsabCSK4!A zBOtnyuifyimXE}f^cPum!2eh$WvZ{+dJb<{ML;L(d}EzN zT=rJU=b0;nX-3IRC9ih zsq)ochp~|JsLP@>7f&K_17WQvL6iN0uQurnZiP|GdX@N>wBY*pKb?>!evJgtz(01P z;(FdkCZ&(mYW!=%IIlC6P2<}3C{uU?tA4t|ISDaRWsQCb<}{LzJch&)-gm|nf9fcF zD#mpL{IWmH4KjcG(C_!|9DCs~JT*DVqMIr1z;l(<_seMV4`T+;%gvkEhh;XPwb%$G zZ^*yC$@u>vsA2)eASL-jy3(mw-@`8Ep_JuOAiy*jvgZki?mHZ2eWo#+dCEys3D0p> z_>ZQ{Z^DvuSzN*OlPMe*{RfKWZU#4g_Tn6_kG2=t)7v z4kT51cOT;4F^|mrsBgW7i>^RlOmmav|KEe?&&#_-2nYo1qgh+}G zI^J1lNdo zgG=hHpVQi_g*!CS#YZJiJ1YK&GP-SEzl_R_oPQgb#D3kd@Z7#1a{I8%(0Qauj+5~* z=X4m7&lii(czZY^^*KjEzm{S@*1(J^;3Nvxb3KU#7DGtcmeT8>;zmyyt!MEPgBBkNvbhf1H|e2oM?T1vWHDcK3+m{Oj4rXt(HAg zd^G!-1M>bE;}rlO@qV0Jn(V~Bum5yR-*ewr7Am#=g8fKz<=&T<&$CHzAc>BybE(B2e))tcO8twtRFNb2i&ZAuX>Yg_-X{F^0{9;nD-I-XKJu$eGgo}me&&>*W5n$ zTQ@F(OE}*sLbi(ZeJ~`~J1IK)v!Z)9v)P{+Q9P78QPPriAm*>^N7Ii|@W?25|74C( zWg)e3uRwo-%E)nuiytxGhxc8{sWeaUA#O59prXSl3YtVz{aC$Vihs@=&U^WwI?rE4 z;xPL$0!k-(1g7jC%X8Rg9r$1Eg?COt0(#f4XvXsv<+VW^m`#}Qjee4#&~ zsW_FsNXq=G>K)!kl#dWSS0(3ZBs$!^W@k?)QZm2Op5pgX8_T&zQH9N{kLd5Lk10Dq z>#18%8KPLfHxc-}j2an4WDoVjKmEqM5xEa(q^_Pc7{;rt=Qmom`r9fwpk2c`ED_ZP zO}6fP6%=6oJ_LkXheEPV?=MB_s^tf^f72Yg?hC?4h`H3+UAKLbYKh=i0F6TCJ zj+U8EHjq|`taxo=j}d23B0gbrtum-UkJ0&Q!YBEPRb9ES)jw?ZK=q!Xi0@*~T6`hv z50WQ%AC;)f{LYF|o$q_>kMW4@d$pGm=rU=iy*5+_*?92m!Qe{;~CG_XU( z9o!!Wg?AVd4ymz>{f9|E&*S6Lrv&(RY4<9b44oiJjA5A5_lVxkWzlXJcDEWf9Ld;-nwv(9Pem#nW{ zC)sCl5b45&G}dsQx-r@M)?eHTO~rz~fyhkuzv#*z|CrUE@IJnPIfqDfU|zB=dMVA% z`fKeqKJTjA5w?B+5~ta>7eAl`UWnhsbJ>*WS5lH=8ZYC#vE={w-byKXWFI7yU11hd zhppRT!HuXE|6%+D``d$c_#8HZ{CmV-=KQgw8h_XkCpq#rt6{3S`^PB1{n>MaKdO(! z=gb|~%BNWm-0ScO&)A&GI_bm!z84b0bJ4dl-zD)o^GYgy?z;QeKU_%3UPzaGJ59Kb zsa)oamQAOa$UaCtNdw92pv}6bb)?hnh}Y~*Z0xVnrd|DaS^Bl`-$6FH$Kd~g=fn9I z)dCzx(fsu-s|UdQ2K%=3pDFid28t#BJ5?fnIq46~a?S@a4>LzAxr=?wq1vo(EMCEU zJEI%VaZ{pOE1%5wpK*-26~VZHxr_<5Kr1V-M0=6WHmm|K|PCrOaV0d7t&I zrf~fY;k5fC=cVdnCG>{AlDVXD`E%oR{NMA3Rc~;9Ut$Hkh0y)}Ref(T< zhQVCJy0Xv%;={g+8n-D32*<^o+vI;a=^<3eTs$PXgCT{vw(3L|0mLpNCA!~4vq#>$ zwwYCj^rt<7b-&15K)Y8Nu3$)Rd`+Ki^gVAiDwh#garb?Zx|4aMDbe}GB?l-W+)`t} z|H_8sI1v+lw*COW*Qw4=(=Udq2RP@gTyfeKLYF+`#7pc)PFdB=@~;nB@0<8cj zP=nS8v8g=AER%fdD!OLol_MyAvxsoWH;-aoS^5R`(HRj{;92z%0kC^P>rZx|=Mj-P zp?(+pBjVc#&wL|_2nV}1ft1n%d=EqRgW4aWQ&lq6mr1MdIhO71lgNhR;K z&UfXHms^WglDt{Sz_<&qBh^ z+^`DSd#3JTeYGxgI{mJpWHd){7oK0132!B(3HKW2uZF}RLR-r!j$?U z^(=F8(yLgn67R2s28gy{4nWBc)`iAf8x*tyV+y|y{>EItS4l3seuDFF<9`!&rXS*G z*uR`qxre=wc#RJD`lt{+U2K?D?l#?o`0LE?G0R4i(h{NY{Gq>pV)dB=IX^MjkaI}Q zZ#Dh=aW+HRy|aW;<~t8&P)Aa zioyO8iP4;^n_9qgJ#7nfuymP!#?%^n17e~JDZ9)%gUSr{zXhkLivbbIuiio**K4zo z9^w6@5iULd!r2utR6Pf1FEcMJ`Z9rfo`OC=a&^znri&MLIpbC@qtF!u$kpJX3eQaJVTbIh4HW$s&k zkn@KV7fHs|8TvTpCHmiBPKSA#^)CtGawS`{Zd!ncsI^?mzvS zWZ?9(J`{^zsq9zoCsIE#zgxeRIV5q(|4mBXx)v;Heg0lM{BxPN7LXjB0-`(KH5w;w z>$g5W>ms}#SNr?hZ-%~$^L$ELG2fv0Iq^|8bLjbc4xtkMd}94s_iy%N-$iOU^Cr?;h<;}S0rYbbRk^L# zpyW8=2dww{9@*0mAuPkK@C(1RN_2I`H58|H0}?XNjOTN1aZ2>837J1u-pPAc?H0Zl z&3m0xa);drDxR#>=gU60LiP?JB{x`&@Hn2cnZl1u31>eshu^EX_<4w;wkLMp5gP`pj<7 z9-uMOE6|^|x~o?YBK0Nn0jg%k$Y_G{ub7Lg|3ZVymPi!x{hHdqIgPsb?e$(1#9oG& z@JeHwILEK-uO2ioLM0o05mdOodk~d<&bGJbyt?Y+XOJQ9i79=rAzUYItTOf^I-7IY zbhru$O-O!Y$i_ZhQ~2(Qj!K|` zrXw!`(OQeo`)At8c&TA%BU)9R*qCU*ID}GWGFPO{+9FPlb_S|HVt}h z=D+&IuNDw}NugT5cg2Zu;$C$N5x;H_QX1Wd#QpI zDanTlf6Km*67ee=lDC@rnspl$ZCHO~e#m>6n%u6~$P?7Kz}!SJG)@4#)95GJJhZ z`jQTg<2JqyCI4fa=h>7w@4re9JpCq_k|S@b)4c3xbFyy`zRGswF-2Esur#ImYoIC_ zvM)9o=^#uxEIH@aTex2eWG-r)1Z)0 z#t!d6nO~txN`0UM^C-I<{eF?o!+Mo6Iu2I#HImn0e**oXQO#?Bq=k!VFMv)lejfX$K)BdxUQ2v%kjxD&Sustv=zY_YJDi>fJ!8pM>-p9-&1-K$3ERasX3UtCX#z$$@gXs!ar|b1f8ez z7527{UVjfKa~yaOc57WQlXC-OVNMfW)`jE@g^w~<0q0~s&#UlZ=38VaI~nJW@gL^n z_F32in6h^Ok-c;)gIv||>bP3x~=8`)D`Mr+#+_E|+pa~hPSm^AM zF&q0^`*G<04og0bdoehpnH1^+dtW_%(Tfn_75?@Cqjhu0_;?J!* z?H!>$NBF6os~B+YklBMd8e_>U!MrgeIrpin*dE?kJvYc{wZDMRARYo;TksM%n(0lL z&zpZiC*t&jUNAj|`TAc|+QEC2stNs3$=}F53#vY>3aNb*Ip~K9PNFX@X$ZdP!im?u zyRO3vwDI?!=I;CaXUfh+J)gZx3+E^$I-24m*ej+FquCX~=uYO_Z&N z{MEGR(o-?^W=Z>DQ~xS#LYB;}%?qAmAOe{!Sl)LpIqX8~I#->Ww>7`%x^Kype#e&l zGDm!%miWq?SNEzH`WwnMK^~GR`h`NqCI_ldl=IH)2LHN!F>(-0&Go*C3{Lz0Y5|3f zF|W3|fp3(SI_ThP_$!TPSuZ(@ET-X&RrT5hsCP5tz%{nE@_)8bBphDbLGE=%<`Zer zkvP(4`v)%K4J|q1e@uT+OFbBsR3F@mHxsIV!5lOFFmfCZ)#GyZ89MX{bXwbGj?FADF)+$<~e-NSPjfYgXm*A$$6^`eoKT?KBha~|rxO^tCb8Yi#^E;-6;!=dDL zzcLrcAgeXz!_g0@ z6H|rAn=!epv|=*8gpcvC#&dp2)=uO*|p=T`I?%jIfQ_Cdzg zsQ$DRdI2+JOxlxV-p&|v^?6>euH9b)N>||rYC0LhQ7Ep5J!j@P_wUnGy^QnTxdgdj zj<$9Dk4)i+m@fArohhr!@XIOHeK7<2D4oImYahUTGJd+srrY~&qd@XHGQzpEw0`Rl zIoD&Jk`~=!n!C`hmr+Xm8>!b(2L_!O2Rxi&$xSSje!k=byoZaIPw9Sjn-lc=aOg&| zPjDHl`sWAW!%f$QFE*b8mfl-MJ@MC&DLTpB=j#WNoCg`4`=08r@Oh^7<9d@i2SooX zb4g2{C$qO60I7Q%Ts~(r+XSkUGZMKq<~r0lHrpB7?IK6^T(CNFr`dYen3~!LCGI6<|8-8 zx`E@_ZXo+c@c1&5z@@O(&F6`~dM@#v*<~HWUwRc&<{{qGEG3PFzIF{c!f*8%D{p^8 zPQLyZ|D7Rw2x~F&iqr3)-aC}%#O{M0X~#(TZE4c{=$uiH(}B4hlT?l};+u9CZe6jr z?k(h4I-rxX8<0b22w&eQg5KRG>_v-)LU-pr-gw?W9loS&PwsnPAm>)(a)%4xd&qvq z?Lzba&%5TwbpMZ(H89U`df?~SEF4Xfw=t`RpPDm!efh;)Oor?kvyzu`FyZxJ14>3P zm-a@==zOdiWENwOZ^|CtJ|ud2nWIKN%P`)gwB*5>G7mJw-&Q1?a?8PUL#Z#I%gzYb#@+``V?6!j_)Mh{6lfoT>POE7 zpUmow{i`#F$CwXN`YUeB-=j=3?@!8ZX0c6n!(g5l;!LFnI|YKy0CNu_|Hmy1jjAYltCmD$$S%^s*#W`<)6Q1qL z1CHvHxe9ytw9JhXwuk=XkR@|mb2aLGa~ro2r;&RR^3I%3e&d^(%#-ln*#+S6I19lG z!#Oa3oD<-><;wTm{CuM7^NQe<9?s7>yimPBPm#G?0}{x7o%M98-w@xr@jTAc@N4Wl zt(lTLcP;w8L%Qr;qt12AgRKXlAGJldn-LwNeG&K{kqzI0!}bR{Od075)2!NU_5(RG z=L|G%yd^o$iQZrGZA>krnM9V2J!AU!D=Sp*`U@QrjzGaZ;CAhheci9a;fFY|{sjhc zQl@2%X-A*?oZLO->y%WmtF!`skd3#mxHS9e)gHqfa$ zu<_FsUcP{wHVh2?nL^oz7*(+6EE4@d>M3xtjq`BcJ9$0=yI9-5OlBXR_p1K17i0Vf zkSBX{BMp6AcDxpT(xJPd>rN!kAw%#xm>%cxyhUaKuZgCRo!9B!b{B&JD88h{@sH*< zqx99h09Spt#$8@TW;xVVMK89v#GSa0?0R^P4@-`V@g^IAKBDMF7C=8kMRQT77wbH+ zEtLHkx$KUfN4FqL^4rYs7#moDvdiIXOt-xNb3ly0s_ku~uOOpSwJ+WACYhyt%+w=G=M!(F?CSqbc=U`Bl!}Dc_b~j^_Fu>q zj2EguePlwxQsnVv9)SMMl3Z+ODej&03FLrfI-(y-P3lzl+w}>hW+J~l=%K+b>T_fM z`Y%-YIdTJ1%`qogGGR#j%b)t2Hc6e7wRz0(K4n+nIY_rwU(>pesALt+zl`XQ%%|aZ z+5I;Qm6ww<4t#;^H1y+{iO`Fsr5{Z00oThuN9v2rR|8cy9`h5fV{_V<``?`$`UX)Sp4EXk~vslM9O7(fj)y}3eeheJ@jNUukO;!xw zaNG?00jE3W$(bX}{XR|^J?^}l+%uu~31si;%;CUe)nCXQ)D(ZA-57ZsY0=LYh|aM< z{53nLBERBSmQl_dLI=eEnD!YAu!CG5dk6OpUQ=}-<1E%6s^9w&`Tg%l4u!*G(8s=@ zVvP~*NbVltLW-}z84K=PB=?Ka5V=pqSAh$W`U-PVqpcR`k~4iWe{r<=M{tMDagzVQ zIO6Lw!L)1W5|}g^TRE{doy-{=M;Sbew|L8viDQ5KuSx)p;5Fh0Nt_w7HBj zH-ST!TElYHhLn099NM5ep0`MRG=;M{ANzIn{qXzzA1!Uu?!P779ojSi9AM*8#xZxL zYzVGO`YxQ)B{H|pH2;&0=wu4FcaOGJHzP;<@7ZxWPn|N)h)-=YbmK`+#*5S@y9VP+ z)%pD|o@Yxq(r!E67pr*=0Q12gTvgGN z-3aruOjFF?3U0yoUm*OfonK*2_nYiB51uabsf*y7_Ud82<#ry~=kIR|$dLVlsmC0u z&X)Xb=Sf}oQE^{>5ghU=<9^8sU(NaL&$}z_yN9Biu)i`EKvz?I8FJs#r-7$pyomXe zBmMOsGJiHdgwH!wa&XZ%AKp)%@SRL8E1X8zU4>iTocARi(l%t(-x21lS-HQhp6EZV z^WblF^s)B@S&}Oq_hG%=O_ZLCeY7ccoB0SELe{G~9r`J|C-M&t&*r!x)emmp-21;u z4^m`cFJF9hy5Om5*HQ7C980@Oop&1Sq<$atnbthak4@oQ8Zy^NKL_5YAvu91m*d{f zE)addLXKfk{p+{jH@V`IH`zT>Pd#sg!BNS^qhGC5djO?!c;7QTRbKFu`hDRujX%ZQ zGWeF;yvmf(zu(55%Rmo|E%KgtR}I-S=i>h;QNl*xbYJHg@ElYf6jKa$Vq%SaA$ zda*VjP;xi(!p|l9{wK#wGS&Ne1(%WP{k;^qB>8< z)dT-&qbg;%Y^l4J3d*y=Z48-1Ip%aKS(2M!i=Q)lHFWZJFTE(B_z^AGAt%pQtc85M zjMU5S)8M1{f5E@*%6=mAuJ{|iN4|=!+Z=U{_R$S36^sKPs9+vAm%Ai?{5O`xzy2~E zWNdr7%c*|N6F!C8TQ}}xbVjb5Dg1Wxl{0qU@Xma49_KmV2r6EUeVTVa@_Vv>L(k(Z z<9_&4il)`?(ei?JWIXfRiC3>_OT{bE7o|$Uy)ah7U+V}*`HzLtN1Y9heCjCQ`*)C6 zf*hHA-IM(n_f^3)@V_J_m|JI?Yp@LX0lxu$T-i`8lOR!*I(8+D;ehb6DXkbJWETpfT!#lkx*K3=cGJnJ?x>Vu!|2q)Dl zLp^C-g8tpe`>@}{p3{&#yb_r^WhJM?+z#%Ddph>7?v3ExS(Cxjx86pMm(ls>qb-j# zQTHvcr7xh&8}Mg1vd@V>Ku%q-0pDYu?`!FOp*qhCv7gDjiq9c)K$Ru^N-1?j>aim5 z@`5GcvBZ+obNFWPR#KAJxO6n~Ha6$^`Qz$m%hmpij4Qz*NlVUc>U!3Ls=rU>=jO3% z?T&9Bq`k6lbpDcj%$mY|(YD?1DZRNaD>f+^!#=y&WWNC}vn6~pt2g$=uH+H9kFw$V zSM@m|H_VwnqhxyvRaako?&ihm0eV?(NLU>14i({0CcdR&?H z0pLp8qNk7F1J}pdz(1erkA#Dn`53vDuKfPNnL41I9NmAtN14sgx0>(j0AI3Y&!2f| z{?~uL8dJerc&`h-M;_kJGR$$;YPs`pI;gSBH&RCWQ14N2vE5&g?`z1s&nm|T+pkqU zbk`$;n_NuJM(CtV^tz!Nd7W97dj}bpbMSjYj>amsqDcHj#+Tp?6#qSOMB^c6P`V3r zY=-D~-P3g-2yHtbybV)wdeawT9^hAFkYYgQL-0!)SE{G+%A2V`uNCg4Tt${IseWNO zeA3nwa7Qei=dy{M8Q8nqH!?9 zq3SN)2Xv;mKlWQCw}N9{@*Law{zryzYu)O|Ww%OrJlue+M>sy^T=l=j2X>FUJ~+KF5;WVdEk5zfV_wN9kdVz3N06>06vx8hEar zEBF$ErTE@6(tp_1zy)w+4v|^?&isxIDxK1Kr-c)k79L+9`_q_H9EV zk;@lg-nxaynvWS|e9UG2d1SNz=Qq6;?_sJfxKJ7KV_N4SmvZlW$S-lPh3>-WAUf8D z;3}s#sN3z9A(RN8))pO;B{~#K^Zr!bB)JIgIDU~;Kd$3vXObg2P4^+>7T9~hDRDKg z;x@|F!JgatY|^|{_q{;H-NAn}q#w23LcQ%sonr}C#B7fHE1G~kl+76NwOY*j_OI|G$E(5Ra(?2*El1fI$YaY)#eTtEs0XhU$UWv> z32sG3e0HWUoPrNfzht(+4^;3h>XO3Yy|23Sri*FUmEhj36;9y6AuM+|lQLT7{T6w% zSzdb~x#D{od>=9Ydh1Fka~g7BEy=GpwI9DJmFPHtN@VNn zt|}D?N6u_Jci-nL2T=Tj7Oqo?aP>-L&S%J;%)N8d_`BLnAiITb$jA~skMRofLo@Px zn>FB9PUUrRmk6it8h-5Rk}G+zuK1ZO0^iCOPOtIFTb&O-r|JQ@uQI~7bY6gNF4nJG zQwrXP?>Bon`eC~+a^Kzj+MMi^<+9dKmuJANiY-@yM^R#fNAKPtcOj)!nBJH{`wnK8m#!|GiTJu7W#g50j|L zIi10ed&#Q>T~zK0HV~Xac2(?+iuEu6!Ro>8uljfd!1mTM`bE}82ZY>!T&wj?%tKOOSmp;Mdy4FFF0jH zKjkgqF;D|?k8>G#CK+#HZe!^+TsyKJs4yC`=!E>G3SbyPACc*WOCzZ>ntG zyn&2a&`%Z|(x5iVwPv4sH_Glno}0Bn2c?pI)+z=Csy+pNMEeQM&68Tl=gQp6YgP3e zy$aooRaXN!RGlvS>`UNFEs~rsQ#c;+N0?)j2v;suPYZg;SPGqydnXGrFC=@gZbZq- z@oQY4j2A=m_Acr^>^Vj?FrSjy1iYV= zZP&$o(y%^l^Hue~Dg79}$LwXu4{_yljTvio+Lsg*alFxD%3g;(fISBJaPEuXhGh&M z3>>EH&BASN#bsx0N{_<4EcgcV^LQF`jE7||mKNXS3TOS~x<}5YKcvqxw5;|fGIpR} zNsDeV#jfK@l}_bLSmI0DH&O>Jk~<2yzs4Jw2WH;{-#&8%%d_92WTtMI$qtbJVQm>( zJakbfvWk&Y>4~q(-Guxlt4MOK%3p(h;m+=Z-5_=@an(C?OrPr;PA zmlbQn06CHeWgQov#uCXL&k{!1^5^VMqzeW9@l`G(e< zS2@{%tbuIL{EXb%;Bus7&*KT7%h(E@nk&4mxE}fv^AhN7QuX(!hN&8*e`n#;&t&Sg z=auBX0v+p))yS*0?uL#lE%RjmO&&8%Cvz9_oQ(04E=z4Lpn~1VHO}>gpFHcpKX2Dj zRc^=U)%&6sLgdy2pT&Mx{Hu-dUT5Z1-~*nl-@zrfu6^$F>*w4-C0f3r>NBbHibsN< zWLl`}V&T-LH11_5rOx2zQT0)>Pjj_gb>Z5+0nJHQf9RH&fDt2 zJ*Do|{~#HYv><`3d+>X?)0=b9E_s)K!e2aD|1#dQAz7ggP9{U==v+)`;eKSBVlU=w zKwrPk`{l#${uI-o89v)`lA@WIP)5Cc8!7x<1fDT3{`ibzD~^=(q+x^rIc-a!Kb~h zJwcY_tnY6CK9V~IdPw6<=qIxC^+1g>w;^vfna#qb#pKlE0EpYj+KV}X-GDz<)z@}{ z9>=x8DYt7Q2h*(y?uEOCbLXv7`YEp~FV#0y7*OKIJJdf%3PrZXKmT}CY~FK3g}Nj-MAzo^au zBdavz@i&wZ5%UsJG#W;;dlxh?4B9YRYP=A?&xbS^m zeLvuR?K~S?cuV$D>7U`}_C+sg%I{|^li#bW276QPXxww_D&Lzn~GHz8No zy@qj@>&QN&4F;67f&Vna-{zpN$x_YYnQz}p)_6VmrPL$HpLJel-R}Y_mfU#r5Ze+i zr{p~7*itfQO+AV}-$*e&{an>osdD_vf5~2^!G-EvLcMDK5A{`M91BE<%pahaNKHq6 znnB3tw1(;+FLLGl^V*7Uqt_sIl#zXv_=U=^dh3(M`_$*eLfDY9!@%8f_QD4quLIX6 zII(c(x#PD{c5Q1GIFqeoaT=+g6MbX$BA#nqL)qo%yVB3g9Q9N9`T|db+$k2mLeaw- zSf=_rop($t3tug6b|giAY!uFaOK?k!ty&;QnX9lzO%+3jovi?WwRH${y#0^p!5O*h z@IIK;9%SVyWw)_xZaih~L_M55mYv0?%)}?+AjA58KNi2^4gt zw(qZm+!FXkcD};Lab>c;#P6G7%*#M^KIy!&$z)Xp55}yAxlN(uU*{H}-!*OlXT%<% zgE`0^i}|Q~FLF2Re{tRQu+D9 zCiD%~+vs=P|KN-89!9@y-+fWH0ZlSw_u&F)J{f;^*!sc3&nUfO@uQWmQ~l&5R=9v*E6s6QwokCk0HAS`gf-a@^Rd4IB&BZz>&=s!e^15kGzHSN9Zd9?R$BIV)3OG ziB2*7EH9|W(9g$j=~@_EL|ZNBV@%x^tGc?;A$A^9rVr|pba^i4TT}LW_?RuxpC70Q z{jd9<_(CdRu4rgk$JLY(?qVYQHb?YLc5Td~Y@Mq~vTZ8y7#gFb%mpA2?J><=1S3{3wedKn}zLp_Jc-PtY;HNK?yrz6U)ov4e;0+qH_A(uMPkiD# z@p<`oa7>S?uOy#2@5i>UM!vj#4t%oimzbxgEFA<&epmP-%qIPK@J=pYubqFS_&4aT z&DC1)L8;Au@c@-F7a<4K+z!8i`!CzS9;BTUF;BKiFptP|Mh;j|3wk2!4vw|zP3EQ0 zdl&Y<{?UgTd`r2{k&9(KfbYS6A3S<{9^M;w+Vm^eZ26X)s>q>EwCv(X%1REmt@pu~ zs{Vj&+E-HQedsHkuQ5L=sSn+Rbv<%!k{kajY`oK=)D!TxrzEe~?1nv)SO3assh8FF zdm4E7wwAv=PUiENOJ=g{PyCfkPF)?^oKh?&Xz>@B7l^-U6SrqI$SaTc%=^BAy2#ai zCAsGIm_}>}CbRvg7d-v;OO&bcJR1lp`!44wEFiZfd}y%`E>kG^t6A~I+QOrEg(Hz& zF_{guWYhu2IW3&l^v^ZtzWK}B6dY$9>*W-G&zO#Lsb~ZACF$iF>_n^HxX66%%`vp? zbm)Q2eD2m&yw0DX>L2V8(^n%eDJwj7`wVbk_LqUb;8n!)ZwfEm=q#U?@F;-|`b?bz z;N98H@j2My$MfcEzyW#PS>O4Gy5F(4bzf!7;C1BP0Ux^a4LC)9E%uKzpqzZ4wmi?N zmJ9-UiOf%tk79p~d7!K9?nB8I9fYMZYn3P-g8R&=C;4W=tv%eF3-YmK9l$=t>GpAr z3KyzBrz843V=C??=X2yaBu}DFb%pC=%!jWf``9c7V35c7%bkByunTpB*AsnFb|>`s zmVx{f=UMn;vLEeb2PGB$$uf;WbXeH5%-)w9r}My z_}%6`S}3gQY~etP{>qiSv9!!L{Ncq+Vk7g(_SGA1DkHBN{L^uoeYdZWSulnHo0Qs) zyswPLKip2He_!0NNcCw~vOlFC?UH;=Tb}>SBiNe;ZDkK2dNT8J1OSo7y-**~-u*SQmg7mp=Uv z4^C9SKd$y?yO)x661mu(9$TD4-gjECLH0uM(d=I}xR^|h-DyPW9C8G*#o!6J1CW0d zXW+LB<@+$C4|ODW+0*>3I+R_*AJ9B9x)`3^+-N5qH#bi!E&XLhm z3l%8y8}bbjId7evnDg6Hbzp(I$B{?m32)5f>BIG^&RcU&9aZ_0tK&%CBTwr{YLR30 z_Nsk+l>Cb{*qw6h{{L9j4+-)aQo{W+Wv*kd=b*$o3YrY$*L&MT*}F^ICRegWt(W9Zh-rNhF_*{x$n#?nT1*|+|T z4tdDe%SyhtuWj<*lXtKK7o=ng56XU><5|~|{m3kC6v(T9dN!@w^M}aS^3zddE&)&1 zYtQXh6V*pEPD1r97cAPRDosk2fhU(4fIW&;O)o6S6Ta}SmEfG(ty#c%MBM`#)K5Wg z_9LqIW9OFTM_LI&7yhv+G z$@?6e*`Bg8ud}D{@zsRv8kmQsV(4Pre4d8p=Pf2Hzi$}4j|(_T<=}TsmjjQ=yaT)` z?<4GA9NE*@7WNM2+o%(=musUfSq+dsm==AD`7m@i))C|#dIM2kd3%uCW3R#d(*6N@ zRP(bgU2h51c`1AQ>_+6-xuTzok23)KJqjCuuVLJVd8i}&OHcBivVVbdZ;U}cL*~3Q z4_4VX^wI+s+I}~3`DItoVc|2{ zT{uSV3UYpwJ+SPTjSbuo+(C};Ws|wk54yX+xiBKp6>^%<1;@$z5dPFa?j3KcoZsz` zgKKk}a+W&hXXt=eGFsyAKdfUl-lxMnZLa$q?GX;%Ms{t~_?imJgA0`vPJu7^8ou~N z%(;wtzK-lqb*`V4emQR;_!iCz9VkvtP57hDEch6CPJz`8x{b8t&6zJCC)mCa zd63=$@G<@Rm~T2d_P#OMyOD2cN`IG;yg;KV=49@pnES;s2ZTIMVSDIbjTbl{=tFWu zU+PVUt}A;4`cFgqdInOa8TJa92Qgm?uS2d_yc%5HVvTE2eg8f7RUbG0hkljkZ~GU> zC4=6#ADO=wG3k#o?_R}|K1vVeabQkII0b$y@U^_~V+JLwdXRG`J@U$N40v1ew!$~#c0vA${}J1f zXH!nMmsQpCg86Am_LbIY&|x}Pf>-CR26w?}iQH9dGy3PG9RF)$$&tJ*;}g|AJa-Qr zUd8vzMPyHduHE?$`gd3MLS{|W1#WXyc3k;2CCgSZV1e8t;BA`!gMK3!5iWX=~3*-q58HpicRyF}ITxATCK(o3O_^ABUs zVeXRW>mJM#lMa~YS{E>Gxgw?I{>@f}&cPDjmG>=jVRtXZyw-k+?V;~b=1=g`1KH`v;p#`^YbM~{7p_Dwr{EL{RFrY4o{iuE~4ZQEeN3OQuJH) z*7sRBP4)wlFLoYse%+hDVju*iq>i)J!rzg+4_`%Ebcg8&bg(v=U!%VAgsXuR38s;hF*wgtKZ$$@XpY3f$&Y5`(^E&f%9YjXi`k3b=yhi`rAh#LzPxcnn;m$xd7TraD zZ_E+>Cb+kpOBstfoxF$OhxW^T!a`nhJFqOS0r@lZ#XvdXEIW6~KA5l3PXn?#f#?IeDZZ+&p-Cd8z>P;Y1&RO?q z>=hHeo|;2mCC=CQmCXDcOSq5T5#*i){~{mS%W|;T-(uvR)cgUIze|UNp_}N*>-L)p6 zUi9{Wi?lnfFBGy@u)x2RvQ5EB4%TumOkJ`ovdybInfrAxH61>tg*8;#2Iqx&OIy{c zs{7(T;rNV)Z`|vKylF@DC5iCsjdI|VIA`2><&`Iwlf4xF>+}Qg`?&8RZzXk|dQE@Z zL)Hf51|~nM)A-qglg4C(EQ|2-7%QC_>4mH1d z3&oqDb1MD=I`53^DSi`u-Hs>VW40uh-jbZ!%u##~Y3naeMmfd3wHM%gI5e5zBr1~1%`y48y{ zu!h_*$b0p_Uf1~YhRal60FI6`4}V|Eh40Ji3mvBO9Q^)Xt&iK3z0#AMA8?P_+Mf6r zB^payo*Y%>RzEzG%yX)#i{>RNdItV{dkOwN_ZIBwT=6BEqAPTT6PgG|#cL0LmN_2J zLq4b8Zwqc@Ah`fu0k>V3lCczecKbzbWFyByzKJ3Gup+51ix|^Z_y_Hk{nw_!m}?XW zk2))RH2)-WyZwCbU^*EdxtlEU<$L1a+w&^+g!WGpm@q|I;Y9{1oNIYbvUN4bT#ch5nX{F4!`#wr zt-(~}JkR)w+sXL``zCK7>Q?t`mdV{s3Ac}T2V`_y$${?VNUoQ?1oOc3%a~)k^YFQ( z9_ZKT*53z_RSMlqBJL>lkUhyd z2>)bS_M&DadN4V^{Hi#&{BhIQ%=&E@Ia4wBa^zmIB*!H40)tHtk}(##Vpnw2@iEMg z!tN(GuP>NO#(c2xX*x4+n9;(;7<70KdQFO5|l^ z90nm?L9hi*pdF$gu%ynit^%(kdogq(8S&p4vOlyXujvqPAt$JxM|dHY%$LmbaW7>j zLBEo$6rY{sCOH=)Z`OH@1?}s||3n9*lm9pa-b={o&RoOS$QuHljNb`96!#10c!LVM z(Wcy;$V+tAz{i|E13Y(2@~oV%k^kpi{OZ^XzfsTCA>_2!ccYI_^ceaVaz$5VUZ)R2 zDiYqNQyz0pSM-LS)7Ll6gEKai!WRd z;}~+A?BC$OaB_}SwMuI;QrO!T%?1Ch=pKAddz&NwcN1@0?mbS08rQslvU1M^=Suw~ z{%`YN{yi#@^9E!6W|G5r^&3Q9uFLrQ(DLS)gV_m zEUBk)AK8*;pKMyjhCE6?iM>KvauCcD$c^%)K5-kvkMC^w{`oEoSCcgpJeI8RVyq%? z^fQuMVx5mX3HwXT7k$Z-^NZE5HR&~Se#hS2x%HpjPwe}JtWjq+*_-P}neY1YAEf%y z2k*LL)F^VDRsVah$xoD=uY=7gybb4*SsytquFQWt@f#ZZaqpWNkMfZE^T0{UtcBkx zlpL{GazsnoLzk3Efrqj-i#mL#aFVTqe9hHRbv53zY`@_qU5b3EaVduF6hqlbK{^A8%#f?TzBlToD73yU#4_hUhJu#f6EcRsL9#OGD-E^-;`^rT0wIE z_f2t!Uk;Kz5BXEcP0%;FgZ1D|-Sf!TEi$nWblQUJPhN39nd~aQMD>&UAFD`iQ_es8p3F1A z7cA0vy}nd5Spyqs?>E@fZFvy;n!;N!kIg>JaYH@TIe`2O|6{hdeW}iKp3^KL=W`84 zCuauxK#08K;OS)AF>bOW1v4-wv_1k4#|tr^OXhs7k$Fs zi=hK>stXsI_LwdKKhWs z0Oa1y$L=eXJBwv4>b!iF1>pCSGnpT+e&mS0D;>YM^2z5PCs+11sm({&z)ki&+GtHl z7IVJzF8q1v^s^6DS$Ypy;w$onFW^qWz2;U&ev|bJ+q3$Tajxi7uS+pmh%!}qo%Wvk zy#Jei<(fZKf5Je`wdA*Ex!Ysp=XK7zuU<4_x#|yQL2qXXha|(Y{@-6!eJS+XUSsqT zNloyf!aQ$9=TTiu?hP75MZUa$hVW(02T`Bob(R_4R-Lnl!e{t(8bh(fd_}pR@TQ^jz7uzD7vLDUegE_KW1Gy1tz31;pmgFG2)kRk`4WF~y8v8o?i{YQWzUf0s z9)usk)i(5c>ORsJG8IWbh&TX1ATp*iX?|`?{;uy zwzTTBclag0QlaRPv%*ISq#yEGSG46nvhD@{$=SZ9oJ=r7~wX#kcL`{aJ1Pt@_lirUmiVNy<8-hHWp0!_GJTAy z`jRnCMF*(xHRx3Q(Hz^=j;ud;anX;=PmrgP{e$Hp7gM7B$Aif|*@6o-a^@fx#}!?4 zaQT5&%?f{1pVwn|k6fbq*}aTi>`uPu(EJbJFL%vhOcJI*d{w!w*gLw_gx5M=T_+n= z{dNp}u6rhQ&E62)yKWnBc$3AG%W~aHUA5{658!|Lr^q|Dh{$G;cJ=v<9I5Bro1r5zXQK}+ zZV8`D(Ldni?z@t8R6FR8bKtWp9FM(qb{6BpE~Y?yCIMGlLw+Y~I@=)Yk$VY`#Rrq4 zbsE#j7oTQE<^aKV@gWJX+}C!17bw{e{*FBaKDf*s7jwf&S@G}LUEp`{=Rl{huM6}Z zj_87oD&Pr*gJjPn{0>X>iA7JtzgjB$7PAaG6<2ebr;*zgTmvtQeUrNYzN6gjdO=2p zIpfGit3dVd9JqXv9PuS&YO(Qe4tWpYpHJ810^?OxckxB|9p&mEKP^*9_S@Y~uTWfW zH(7&Nrh7a2n=m(Y*YLG-J-IKk&SoH4|3OD?$b8YBfcGVHC+4WuE7)r}7a-T!XZr7T z3n-8rO1Ca_G7h)@#SU5S(%BDx(UP(i&mOg4b`LU6!l&g4hcr2d@dv+AD7g>jf_py= zDwL7?0CGb7-q3fL1K|5HcOb_lTZQM{D=B*sav($bxsnRnm`15e3{qEp+c-YfuA%k3 zuD$d%+9`f@ zLs`l9PS#?-;Qou8L}w>*!riXJSE^Tp0`YMN)o_kD7JPfY=-vG<)bUXC9C;V$#TNym zIRN{7%1QpUEB#^m3ohWhkuCY0uKqDDAy4v?-4EfzvxP^Uh@Zy&81r~@H}pWo!Y_0* z#EL@a*UC`J5aWUSj!mp64nHBwFFdtlFUv&7^1UR^5}RldMCG{~tib=ic1Eb80!2{*F8t>tgsg-P_=|bf1G> z$`k*(D}1w@j$vs)Ceujfv?gaW=IqWFm}h5h;IUdI@&+OAF5Lk+qPC9HZB04J3C`RG zeoaPr6V?RG<$Tdgxy2gnLhiTdFYG$d?HiJ#Vb8)nm*-4aZz31LxrlMWcaop~d>=y| zfh&4DN5`H&OLoH>U;66h?UZe%7hhyv%0YGSlXo+?a7hE`M#FnBA2r3-;JyU?V!nSd zg*#@R*i?MQy2g~f1^U5k9k#2eI&`sc!z-YEE7_wBmz4dA@t*@|gYdm}YT4~`WHWa2 zo6Te~MsdSh%1YjR<_(sm{z}H%&|Nsg!ILSJJR*NNa=~o2aqjq)O!4I#<@7;JiG0uA zRa}@oM9v!c`drE73vTCn+NVI~qVDM$giOA+>5n0QANb*(aJz!(dLXOr1r25(_i^5f zuBWujf$clN3vhW{a{W)_8ADaUq3-o%I(~zkhT!HUvo`XCg4`7J{TAaeHx*OyKB?dK zvJU7^@_Imz;|Yh+l3XrtD0IHLj>rx6_F=wYJ@?_shuyo#kiO5??YgRuFNMF$7rvCa zNcwjzbKt!(=NVKa^J5KEpyHv>-xdp(a-ZY}Z>@&?dEx7Lud`nx-zQiKeME2}IBC}B z$b)x9XW{mM9^03^?rcryw!^x}`LM6Ve!w5hWn>phOwKVrrtVSBJARNdW5GK%xGQKl zp6qwn{@Iaywo!gQm-cCU*`wr0&buKwnc+LqPs_a9^7P=Dif@3Or}Q~_w1kV2T?pN0M*3MpIC>5ri-#7{VVN)bJHaiq+ku;8HNhOfD383Y zgw+>~RG;1rx&gNe`$3wL`x$=UU{sjNjU5^|%r&&!_j#I+v8}mJKWzJ_FN3LnH zi+b6u2yTwYw$$c($UC}?C&Oe(zK-`g^sl+TEF{=UUWSj;yUBV%2Vs&S^{l@dxm=;f zYqTQ&B=$6>%yS*#e7mw|H@9JLTf7m^bMau@6Z39bM|Zt=)c0N7#I8+*<+T@d+pKl)c=ltCixqElf7vVPoOFD zE)+J6Uh(a!$InZ!(n=ySrKz(ukDNhS2*JKkOwE-aOfE_c$~jt zzN#xRugGkW99(Xre*T>t`T2qhZ@hE=11Bi>c{U#`_;n5_C*xNRV9S#8kv^d5 z@F(;B>F`Af`P*2gG=Xf5X;t-=@C1zJnExi?WA-Mz%0X}BUW{|y74CPi0{)gjRekEF zBe(m*qN{3oCb@lQgp!M=fw8ZTQBLzv zFCbs?@~oA}zc6BOT78FQ(3evvdFFxeCi1!Ij^viRI=A3wGDQbaOgL|fryw6_AIo;8 z9HecsFFdSe0jj>!u@7HSDD#kj$MK84C2MJ04xCZvi}3PhB8SH>g1#@?6`x~x&$-K1 zG`)xHQ7j8n&(|7le5TyF>`w~GsS15{CjWkqgb&RwX4_H)3aUcqxj&!NBK&w`Hu6@( zxE3GaWS<0Qz?OMM@fyr!%H;2{hO^AFFS(0wF1eCt?Msf4ce&)*y##%qDZW`(%bPDJ z_kZ8B;D<7ER(?F8Xc2jT_zZNT^hd~tawNATH}=&Hm7X1~>RiSIbf=8LZO;qpxz|Bf zsy=18<;CQ+!k*jvAL@PkUF07cqJy$o&3WSk>fZ-1(yjr%w(|sZAwgr*4Z#WIO1e8S z?{Y8X{lvXw_dI{j3pZV;&g1cOE`0M|GACnS>U|3Rc~Vy|z9}4rde5qZ+;?{!bb`L@ zaZMY%U#lNup(;>zHs-R~A;>uki&2*)XQCcYN!^kCk7NGk(#C($*X)|C2l8aEM$Vkw z1f2h@+;5q69B4G04Bp;$e@fL~BbHxV?sY1Xy_+AO#=-`&M}V7aJq{m*Ash?n?Pinr zCb$`HQ?{qhC$BQ@&7c7LuHaR0>fOQ66Z${$c>XL3nq!~nE$ndl8NYO<;9uONulTvhU`=>aQwjXCdi9XT>rNmjz|?cJ{nN3z5RSfceu z*O1#8zACQ>`MUm%;L%#bx%GtipBwduYHY@le>r|WE6q0EF=T2?>oep_JrYVzSI~uJ zueXv_7kq7J3G~UX%yTW#pOjPwAEI^YL;S{azFM*ImLtv7?y` z9#nOk=v(WwXHXtxtSwBkBSUlNzanQBe!il&;p+~n>xB#1pCG5w`cMON$Pn&L@*5jF z)c5!a-aoe&_*PyARtev{lO+8{>$FJG}UnS!1?4sSu8HK9>7`z#7u zBQGPzQ?onwkSqBlnd><~egWAeybqsa7t}p2`5j(22BV%q&SG%uljX=+_VWGEIQTV6 z27=$|PW-0&i=Ry+|8%_|Bfl5+S=KgiB0TG6-V{@A26R3C{i070o`ESjB|&rS8$$8J z1d?ZD3IE9{;kA4PawF^+tYV_ui#wRCg<_t7Sg}HiJbSa6*ypl z#x9&qw(!TiYms;FiZ3=0?r3%e>hy3f%b-+W_a^#Rzwo2aFPZ-)LG?Y%qRO1W7zIlxo>bI=iG>uKN@+2WrJc)ZiyIMw%gx_l@{He)ki z|A5Sz;P^Ql%Y1e~*_IzOn3?P@(0e)>@2Sp{`|$pR7h}%iRc6~*S8_Xn6J;;m+HK>u z#e~OK^@*en@#Jl0*}-M%{zmRaI1t=Bs|S4X-no2@R3ray{RNUKJUZ(qUOU}NS@C&f z-^TMA7IMz!4oYgU+^-^~?%;F6C1U{YiA{39?s6q}p%QY6r%7RvSf9$m!gqBk0I{ZThk9Sigl<0BXRpiP1&7FdLOz%Z`ed&U_%zlS_#jHQK!@OpkJqns#ES6 z##}WZzc1!Wb_e7-nGG?|3NC@aF%&L;pyhex$a;*=*AL0ja>O>|)&7u!aLE!5U5VUF zB^rBKf%eOsZu?E}UmYF-o?mu{1}#(A1N!NJag6W%LH0$ccfID|rhDT15AMXgF8c${ zp>PrEMf)Jf!2U$R1=#oGgcsmEhW$#QYYN0LJk^>lg%yd(Hxb8SjJ?(HjKz%nIgYalFz;^(nmVSDu?@~+lKMG9(5 z-c~IgEJoHw~%KBm-L&>I=TW7{nA*4zq*jY?Q9_0KfgFFDyeWPf@1EAST$+4qGbwV;XusgLa2u~+b( z15e581wM1YsS6*zK}I!gV54vcasuqXd4YTh1(N5Q)7U8WzH2;wN6L=I^JlgIfk1x0 zfZpEe$$5^26uie6vWawX2=dO{vCnfL0+|;>ml+L&e%N_QbbV{V#VQe=VcBDt1K3sd zLPOQze|_I#&|cLiGxz5=^7Yr>jJyMwJLYzRS8NH#$6XJ9m-{t1eA#Bm@$_%!!sboN zGy*@uIgA{#+%oV5vu&E*z2K8BlpQAA>+ayt1-oj$dg!D&kFwwqd%GCpGm9MIl;n9O zj_4e-LooldSHU0bRz<#Iun^~ND1Ev&RD-a|6`qz;=lWfPAG?{d;=3~g?!&$(?{CHn z^`qoMa67`+`CnJ{|Pq@=2yIi96csbzmM$8j2Xi3ymeHkuP3b{bBOfa@?4i(0Nr%3{3~@4 z7m&><1cUBZb+P#LiQ`4*Qj*|4@|z-W!)5t#1E0M2H7Je3j^KBPcOY-abN%{LX>od0L-=^X+y3cgxey;XJbT^ML##N>$d48|fc=&K5e*AGzc^E1~~A{3|$~ zhWK^Dm*95_{|DWiE!Rw=!KJmLK2_A_t$AXyi`!2=@l&gZ_# zQTGStI@w!TSo{L{5AZ(peaZ-b(%G%9t9wpRZe<|@pefrM{^aa?9C)&g>?feF3(tXG z!xwIrFZp@SosAZMlJq8XD*AM1CCe2$pW?{b2RRn@Ombze8SDd3FBBc4w*d1ZSNtiC zaCWmLlDEZO(aZ0VFZl<_r7Vx>LZQrctR3L?dV|mB!is`{$EMx6`Y*DiZ?J{0VVom* z6vD-iWbU0@fc%$~aGQ<&&~aIX?GMNq_$NRevwsRObrjLhUBIC(b*=#=I{P{h6QF=f!w$J>dq06Tx#0CyJiG zl=H6srr=)2$NZ0i{k%9kO1{*W;hOw?1s{ti`;Ux)Tsr4A{9c~q`1;#;ep;FQ3wSN3 z>atFUSg1)k;X-(Oz@4^5-;f%FI*QZsH2+g`pXQQZDx4zWfB7%N51ZSHy2M`t9+I7} z^S*zps&^mwa@J9{ZJ$Faxwli2>wMsyWhb3T_ro@{msaDJ%D;QxQB%S9CCe)+-cISR(TV$(wiAL)Yx|S%1m3=f{){kb`J7 zWw}=$b^budo-~DyFO(c`>j-iQyzlpf>L;b(4diQEzs%u8cd|t^KKBPA_R*QCW)YozCK;X_;W`sfPUBXcb0J@8^|xgQM4<;s2uU5WV<-dFc^4Kk&a z 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

    AlqPd6bga%j;#Ui}y_-nM!(0}s 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
    &#$j%!EvVer8b$VjQ*Z^WtGO@+lvbo)X~S}m z_oFXNwzA`+2)L7wbMKO`F=sV6?ha=SGB{SS_@~A2c+YM*z0@2?dRc)9+(B869ASHJ z^gF4{j@@Mg_|4piMx>Ox$J-Wd2bSWGSfDC6SfG(M#P0uBRdDp?L+fzP)7K2>0CojkEIMaL)k(we;+ADm9 zTKyv|z=P5FfdwpsN95ckhdC-XipT(!^8$K<%gsQTSs-uG(|lgXSSiJ`?vdN9&D zq@&( zdeME1*~ZF&hvAAh{|(No4n`ydXMW^SJuUofDl~2eN&kI+=-(uRa)+(uYJ$B9_Lu4g zULO$Y=WJ$JCsHOG&j&!}QYMFP0d~}76W!LxnpI4+p5kkt-b8=@Ltv5|0?rNC-}pFg zVhGV6<6k#1G-R0Z1(0?ohAA~cO+t>q!)xVsG@Z8+{QuzR=972K`&ksz0hB{ zcsx`ikfSWmY3B!yTd3Rr%_U9zJtujJd0U=_n0F-$eV}G$n3m??1m1rW{R-r^cq%fE zL_6>nMqQdFI3j9X0KLF}fKTu{-9iVa#G!7?UxNoq6KSvTqs+jijI%LCQG z!{b8+g5wwNm$j56+92-%yPpPax42;jcQfb1WLj>m`8CWiXV zH~2UBQywv*3%HPzK%`0h-X~H~+%ss81s`-G?zKJD+3_<2QeHQ3hURCRJMaXt!9qvyhh1YE zb+a_VnC%zW$x$6vUAf6=o;-9;OdA!$gt z?sxw_3-Yy;@$@?acEQ`xM($wB67W~x{u3hILykt~>Iuh>-7Nr)b7!(mAH9<3!jTK< z#(tRS_HzCZIJe+l!2g90wut^;KHngQLC9_R)##>c(Dbh0=UDm%@E|t-sxIHENg9| zzlSc!;MA{Y8J=5zY5G1;;SoK1QC z4$eN9yXnr4IuO?*+z;8uqwY{GvTViXudyKeSj=X5BE3dmg^yJgbz{L9ih2Xr68w7o zANb&f=qt`^{rGxS@J-<#0R463BWtIy|MrzZ-<}uw@kBa?etU0UzPEv-rpW=v8&m-$ z6myj`@AmE(RpSTk^RX}X@8o_6qCMI4^Zf;oKpjTaNvhw;giKy&|W`b!QYikiiS+ zEAn$2XGIc_139Ux;KI5S@tp7mp$=OWI<{oiwm#nk8JD}hI#@Xl%wO)-KCs;b=7r7m z{&hDYz5~Mzg@Ucqv||t320>O7?jf^W-zI#Qj)PU?2AF*-cNgth7#yQ9*D&>6m%m~< z(>ibmavp7=3@F(fGQJJ(U4OzHkVoOUtdth{GpmtXU`uB0PZZb+GW}O|dJmL5=b2yu z>mQex@D-GW-ouN>(!O5su$5~}kT@IMqTh81-Lq&L zGP6P1$l8g&XuXBcy_feFw7zW5xkf~Kg?kCh1oRi$F>jIR3^;%AY+&+~UPN~e^D>+a z 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 localStorage.getItem('theme') +const setStoredTheme = theme => localStorage.setItem('theme', theme) + +const getPreferredTheme = () => { + const storedTheme = getStoredTheme() + if (storedTheme) { + return storedTheme + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' +} + +const setTheme = theme => { + if (theme === 'auto') { + document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')) + } else { + document.documentElement.setAttribute('data-bs-theme', theme) + } +} + +function bsSetupThemeToggle () { + 'use strict' + + const showActiveTheme = (theme, focus = false) => { + var activeLabel, activeIcon; + + document.querySelectorAll('[data-bs-theme-value]').forEach(element => { + const buttonTheme = element.getAttribute('data-bs-theme-value') + const isActive = buttonTheme == theme + + element.classList.toggle('active', isActive) + element.setAttribute('aria-pressed', isActive) + + if (isActive) { + activeLabel = element.textContent; + activeIcon = element.querySelector('span').classList.value; + } + }) + + const themeSwitcher = document.querySelector('#dropdown-lightswitch') + if (!themeSwitcher) { + return + } + + themeSwitcher.setAttribute('aria-label', activeLabel) + themeSwitcher.querySelector('span').classList.value = activeIcon; + + if (focus) { + themeSwitcher.focus() + } + } + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + const storedTheme = getStoredTheme() + if (storedTheme !== 'light' && storedTheme !== 'dark') { + setTheme(getPreferredTheme()) + } + }) + + window.addEventListener('DOMContentLoaded', () => { + showActiveTheme(getPreferredTheme()) + + document + .querySelectorAll('[data-bs-theme-value]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const theme = toggle.getAttribute('data-bs-theme-value') + setTheme(theme) + setStoredTheme(theme) + showActiveTheme(theme, true) + }) + }) + }) +} + +setTheme(getPreferredTheme()); +bsSetupThemeToggle(); diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/docs/link.svg b/FDboost.Rcheck/00_pkg_src/FDboost/docs/link.svg new file mode 100644 index 0000000..88ad827 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/docs/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/docs/pkgdown.js b/FDboost.Rcheck/00_pkg_src/FDboost/docs/pkgdown.js new file mode 100644 index 0000000..1a99c65 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/docs/pkgdown.js @@ -0,0 +1,162 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $('nav.navbar').headroom(); + + Toc.init({ + $nav: $("#toc"), + $scope: $("main h2, main h3, main h4, main h5, main h6") + }); + + if ($('#toc').length) { + $('body').scrollspy({ + target: '#toc', + offset: $("nav.navbar").outerHeight() + 1 + }); + } + + // Activate popovers + $('[data-bs-toggle="popover"]').popover({ + container: 'body', + html: true, + trigger: 'focus', + placement: "top", + sanitize: false, + }); + + $('[data-bs-toggle="tooltip"]').tooltip(); + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-bs-original-title'); + element.setAttribute('data-bs-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-bs-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $("div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboard = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); + } + }); + + clipboard.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboard.on('error', function(e) { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + + }); + } + + /* Search marking --------------------------*/ + var url = new URL(window.location.href); + var toMark = url.searchParams.get("q"); + var mark = new Mark("main#main"); + if (toMark) { + mark.mark(toMark, { + accuracy: { + value: "complementary", + limiters: [",", ".", ":", "/"], + } + }); + } + + /* Search --------------------------*/ + /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ + // Initialise search index on focus + var fuse; + $("#search-input").focus(async function(e) { + if (fuse) { + return; + } + + $(e.target).addClass("loading"); + var response = await fetch($("#search-input").data("search-index")); + var data = await response.json(); + + var options = { + keys: ["what", "text", "code"], + ignoreLocation: true, + threshold: 0.1, + includeMatches: true, + includeScore: true, + }; + fuse = new Fuse(data, options); + + $(e.target).removeClass("loading"); + }); + + // Use algolia autocomplete + var options = { + autoselect: true, + debug: true, + hint: false, + minLength: 2, + }; + var q; +async function searchFuse(query, callback) { + await fuse; + + var items; + if (!fuse) { + items = []; + } else { + q = query; + var results = fuse.search(query, { limit: 20 }); + items = results + .filter((x) => x.score <= 0.75) + .map((x) => x.item); + if (items.length === 0) { + items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; + } + } + callback(items); +} + $("#search-input").autocomplete(options, [ + { + name: "content", + source: searchFuse, + templates: { + suggestion: (s) => { + if (s.title == s.what) { + return `${s.dir} >
    ${s.title}
    `; + } else if (s.previous_headings == "") { + return `${s.dir} >
    ${s.title}
    > ${s.what}`; + } else { + return `${s.dir} >
    ${s.title}
    > ${s.previous_headings} > ${s.what}`; + } + }, + }, + }, + ]).on('autocomplete:selected', function(event, s) { + window.location.href = s.path + "?q=" + q + "#" + s.id; + }); + }); +})(window.jQuery || window.$) + +document.addEventListener('keydown', function(event) { + // Check if the pressed key is '/' + if (event.key === '/') { + event.preventDefault(); // Prevent any default action associated with the '/' key + document.getElementById('search-input').focus(); // Set focus to the search input + } +}); diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/CITATION b/FDboost.Rcheck/00_pkg_src/FDboost/inst/CITATION new file mode 100644 index 0000000..f2622f6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/CITATION @@ -0,0 +1,78 @@ + + +year <- 2018 +vers <- "0.3-1" + +citHeader("To cite package 'FDboost' itself use the manual (Brockhaus and Ruegamer 2018) and the tutorial (Brockhaus et al. 2017a); +to cite functional linear array models use Brockhaus et al. (2015); +to cite models with historical effects use Brockhaus et al. (2017b); +to cite models with factor-specific historical effects use Ruegamer (2018).") + +bibentry( + bibtype = "Manual", + title = "FDboost: Boosting Functional Regression Models", + author = "Sarah Brockhaus and David Ruegamer", + year = year, + textVersion = paste0("Brockhaus, S. and Ruegamer, D. ", "(",year,"), ", "FDboost: Boosting Functional Regression Models, ", + "R package version ", vers) +) + + +bibentry( + bibtype = "Article", + title = "The Functional Linear Array Model", + author = "Sarah Brockhaus, Fabian Scheipl, Torsten Hothorn, and Sonja Greven", + journal = "Statistical Modelling", + year = "2015", + volume = "15", + number = "3", + pages = "279--300", + textVersion="Brockhaus, S., Scheipl, F., Hothorn, T., and Greven, S. (2015), The Functional Linear Array Model. Statistical Modelling, 15(3), 279-300." +) + + +bibentry( + bibtype = "Article", + author = "Sarah Brockhaus and Michael Melcher and Friedrich Leisch, and Sonja Greven", + title = "Boosting flexible functional regression models with a high number of functional historical effects", + journal = "Statistics and Computing", + year = "2017", + volume = "27", + number = "4", + pages = "913--926", + textVersion = "Brockhaus, S., Melcher, M., Leisch, F., and Greven, S. (2017b), Boosting flexible functional regression models with a high number of functional historical effects. Statistics and Computing, 27(4), 913-926." +) + +bibentry( + bibtype = "Article", + author = "David Ruegamer, Sarah Brockhaus, Kornelia Gentsch, Klaus Scherer, and Sonja Greven", + title = "Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals", + journal = "Journal of the Royal Statistical Society: Series C (Applied Statistics)", + eprint = "1609.06070", + year = "2018", + volume = "67", + pages = "621--642", + textVersion = "Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642." +) + +bibentry(bibtype = "Article", + title = "Boosting Functional Regression Models with {FDboost}", + author = c(person(given = "Sarah", + family = "Brockhaus", + email = "sarah.brockhaus@stat.uni-muenchen.de"), + person(given = "David", + family = "R\\\"ugamer", + email = "david.ruegamer@stat.uni-muenchen.de"), + person(given = "Sonja", + family = "Greven", + email = "sonja.greven@stat.uni-muenchen.de")), + journal = "Journal of Statistical Software", + year = "2020", + volume = "94", + number = "10", + pages = "1--50", + doi = "10.18637/jss.v094.i10", + + header = "To cite FDboost in publications use:" +) + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/CONTRIBUTIONS b/FDboost.Rcheck/00_pkg_src/FDboost/inst/CONTRIBUTIONS new file mode 100644 index 0000000..ffcbd6c --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/CONTRIBUTIONS @@ -0,0 +1,19 @@ +-------------------------------------------------------------------------------- + Contributions +-------------------------------------------------------------------------------- + +The code of this package is licenced under GPL-2. + +The package "FDboost" contains modified code from other R packages. + +- mboost: hyper_signal, X_bsignal, bsignal, + X_conc, bconcurrent, hyper_hist, X_hist, bhist + hyper_fpc, X_fpc, bfpc, + X_bbsc, bbsc, X_olsc, bolsc, brandomc (see R/baselearners.R), + hyper_histx, X_histx, X_histx (see R/baselearnersX.R), + %A%, %A0%, %Xc% (see R/constrainedX.R), + stabsel (see R/stabsel.R) +- gamboostLSS: FDboostLSS (see R/FDboostLSS.R) +- refund: check_ident, trace_lv, penalty_pss, expand.call, safeDeparse (see R/utilityFunctions.R) + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/analyze_results.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/analyze_results.R new file mode 100644 index 0000000..274abe1 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/analyze_results.R @@ -0,0 +1,185 @@ +############################################################################### +# changed code of Fabian Scheipl lfpr3_analysis.R +# Author: Sarah Brockhaus +############################################################################### + +# # M=50 +# load("M50N1G30pffr.Rdata") +# M50N1G30 <- M50N1G30[,-1] +# +# load("M50N1G100pffr.Rdata") +# M50N1G100 <- M50N1G100[,-1] + +# M=100 +load("M100N1G30pffr.Rdata") +M100N1G30 <- M100N1G30[,-1] + +load("M100N1G100pffr.Rdata") +M100N1G100 <- M100N1G100[,-1] + +# # M=200 +# load("M200N1G30pffr.Rdata") +# M200N1G30 <- M200N1G30[,-1] +# +# load("M200N1G100pffr.Rdata") +# M200N1G100 <- M200N1G100[,-1] + +# M=500 +load("M500N1G30pffr.Rdata") +M500N1G30 <- M500N1G30[,-1] + +load("M500N1G100pffr.Rdata") +M500N1G100 <- M500N1G100[,-1] + + +# # M=50 +# load("M50N1G30FDboost.Rdata") +# M50N1G30FDboost <- M50N1G30FDboost[,1:ncol(M100N1G30)] +# +# load("M50N1G100FDboost.Rdata") +# M50N1G100FDboost <- M50N1G100FDboost[,1:ncol(M100N1G30)] + +# M=100 +load("M100N1G30FDboost.Rdata") +M100N1G30FDboost <- M100N1G30FDboost[,1:ncol(M100N1G30)] + +load("M100N1G100FDboost.Rdata") +M100N1G100FDboost <- M100N1G100FDboost[,1:ncol(M100N1G30)] + +# # M=200 +# load("M200N1G30FDboost.Rdata") +# M200N1G30FDboost <- M200N1G30FDboost[,1:ncol(M100N1G30)] +# +# load("M200N1G100FDboost.Rdata") +# M200N1G100FDboost <- M200N1G100FDboost[,1:ncol(M100N1G30)] + +# M=500 +load("M500N1G30FDboost.Rdata") +M500N1G30FDboost <- M500N1G30FDboost[,1:ncol(M100N1G30)] + +load("M500N1G100FDboost.Rdata") +M500N1G100FDboost <- M500N1G100FDboost[,1:ncol(M100N1G30)] + + +## merge the resulta of pffr and FDboost +resNames <- ls()[grep("^M", ls())] + +res <- get(resNames[1]) +rStart <- 2 +if(any(class(res)=="try-error")){ + res <- get(resNames[2]) + rStart <- 3 +} + +for(r in rStart:length(resNames)){ + if(any(class(get(resNames[r]))=="try-error")){ + get(resNames[r]) <- NULL + print(paste(resNames[r], "has class try-error.")) + }else{ + res <- rbind(res, get(resNames[r])) + } +} + +#summary(res) +dim(res) + +# total number of trajectories +res$N <- res$M*res$ni +# estimation methos +res$mod <- factor(res$model, labels = c("FAMM", "FLAM") ) +res$M <- factor(res$M) # , labels = paste("M:", names(table(res$M))) +res$G <- factor(res$Gy) #, labels = paste("G:", names(table(res$Gy))) +res$snrEps <- factor(res$snrEps) + + +save(res, file="boosting.Rdata") +# load("boosting.Rdata") + + +#### have a look at maximal, minimal and median errors +# library(plyr) +# maxErrors <- ddply(res, ~ N + G + snrEps, function(res) { +# return(res[which.max(res$relmsey),]) +# }) +# minErrors <- ddply(res, ~ N + G + snrEps, function(res) { +# return(res[which.min(res$relmsey),]) +# }) +# medianErrors <- ddply(res, ~ N + G + snrEps, function(res) { +# return(res[which(rank(res$relmsey)==floor(nrow(res)/2)),]) +# }) + + + +#### generate boxplots of errors +library(ggplot2) + +pdf("ComputationTime.pdf", width=9, height=7) +ggplot(subset(res, !is.na(time.elapsed)), aes(y=time.elapsed, x=snrEps, fill=mod)) + + geom_boxplot(aes(colour = mod), outlier.size=.6) + + facet_grid(N~G , labeller="label_both") + + #theme_clear(base_size=14) + + theme(legend.position="top", legend.direction="horizontal", text=element_text(size = 25)) + + scale_fill_manual(name = "", values=c("white", "grey80")) + + scale_colour_manual(name = "", values=c("FAMM"= "grey40", "FLAM"="black")) + + labs(x="snrEps", y="time") + + scale_y_continuous(breaks=c(1, 2, 5, 10, 20, 60, 120, 300, 600, 1200, 2700, + 5400, 10800, 21600, 43200), + trans="log10", + labels=c("1s", "2s", "5s", "10s", "20s", "1 min", "2 min", "5 min", + "10 min", "20 min", "45 min", "90 min", "3h", "6h", "12h")) + + #labs(title="Computation time") + + xlab(bquote(SNR[epsilon])) +dev.off() + + + +pdf("reliMSEy.pdf", width=9, height=7) +ggplot(subset(res, !is.na(relmsey)), aes(y=relmsey, fill=mod, colour=mod, x=snrEps)) + + geom_boxplot(aes(colour = mod), outlier.size=.6) + + facet_grid( N ~ G, labeller="label_both") + #G + scale_y_log10() + + theme(legend.position="top", legend.direction="horizontal", text=element_text(size = 30)) + + scale_fill_manual(name = "", values=c("white", "grey80")) + + scale_colour_manual(name = "", values=c("grey40", "black")) + + #labs(title="riMSEy") + #labs(title="reliMSE(Y(t))") + + ylab("reliMSE(Y(t))") + xlab(bquote(SNR[epsilon])) +dev.off() + + +pdf("reliMSEg0.pdf", width=9, height=7) +ggplot(subset(res, !is.na(relmseg0)), aes(y=relmseg0, fill=mod, colour=mod, x=snrEps)) + + geom_boxplot(aes(colour = mod), outlier.size=.6) + + facet_grid( N ~ G, labeller="label_both") + #G + scale_y_log10() + + theme(legend.position="top", legend.direction="horizontal", text=element_text(size = 30)) + + scale_fill_manual(name = "", values=c("white", "grey80")) + + scale_colour_manual(name = "", values=c("grey40", "black")) + + ylab(bquote(reliMSE(beta[0](t)))) + xlab(bquote(SNR[epsilon])) +dev.off() + +pdf("reliMSEfx1.pdf", width=9, height=7) +ggplot(subset(res, !is.na(relmsefx1)), aes(y=relmsefx1, fill=mod, colour=mod, x=snrEps)) + + geom_boxplot(aes(colour = mod), outlier.size=.6) + + facet_grid( N ~ G, labeller="label_both") + #G + scale_y_log10() + + theme(legend.position="top", legend.direction="horizontal", text=element_text(size = 30)) + + scale_fill_manual(name = "", values=c("white", "grey80")) + + scale_colour_manual(name = "", values=c("grey40", "black")) + + #labs(title=bquote(reliMSE(beta[1](s,t)))) + + ylab(bquote(reliMSE(beta[1](s,t)))) + xlab(bquote(SNR[epsilon])) +dev.off() + +pdf("reliMSEfx2.pdf", width=9, height=7) +ggplot(subset(res, !is.na(relmsefx2)), aes(y=relmsefx2, fill=mod, colour=mod, x=snrEps)) + + geom_boxplot(aes(colour = mod), outlier.size=.6) + + facet_grid( N ~ G, labeller="label_both") + #G + scale_y_log10() + + theme(legend.position="top", legend.direction="horizontal", text=element_text(size = 30)) + + scale_fill_manual(name = "", values=c("white", "grey80")) + + scale_colour_manual(name = "", values=c("grey40", "black")) + + #labs(title=bquote(reliMSE(beta[2](s,t)))) + + ylab(bquote(reliMSE(beta[2](s,t)))) + xlab(bquote(SNR[epsilon])) +dev.off() + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/readme.txt b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/readme.txt new file mode 100644 index 0000000..dab4279 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/readme.txt @@ -0,0 +1,11 @@ + +Code for simulation study presented in +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015). The functional linear array model. Statistical Modelling, 15(3), 279-300. + +To run the simulation use run_FDboost.R and run_pffr.R (call helper functions in simfuns.R) +Plots of the simulated data are generated by run_PlotModels.R +Plots and tables of the results are computed by analyze_results.R + +In run-time.R a small simulation study is conducted to compare the run-time of the array model against the non-array model. + +The parallelization only works on Linux, not on Windows. \ No newline at end of file diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_FDboost.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_FDboost.R new file mode 100644 index 0000000..c7f8e5a --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_FDboost.R @@ -0,0 +1,225 @@ +############################################################################### +# run the simulations for boosting of functional data +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +print(R.Version()$version.string) + +#library(refund) +library(FDboost) +library(splines) +pathResults <- NULL + +# install.packages("pryr") +library(pryr) + +source("simfuns.R") + +# ##################################### M=50 +# +# set.seed(18102012) +# +# settingsM50N1G30 <- makeSettings( +# M=c(50), +# ni=c(1), +# Gy=c(30), +# Gx=c(30), +# snrEps=c(1,2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM50N1G30) +# +# usecores <- 10 +# options(cores=usecores) +# M50N1G30FDboost <- try(doSimFDboost(settings=settingsM50N1G30, oneRepFDboost)) +# +# save(M50N1G30FDboost, file=paste(pathResults, "M50N1G30FDboost.Rdata", sep="")) +# +# +# set.seed(18102012) +# +# settingsM50N1G100 <- makeSettings( +# M=c(50), +# ni=c(1), +# Gy=c(100), +# Gx=c(100), +# snrEps=c(1, 2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM50N1G100) +# +# usecores <- 10 +# options(cores=usecores) +# M50N1G100FDboost <- try(doSimFDboost(settings=settingsM50N1G100, oneRepFDboost)) +# +# save(M50N1G100FDboost, file=paste(pathResults, "M50N1G100FDboost.Rdata", sep="")) +# + + + +###################################### M=100 + +set.seed(18102012) + +settingsM100N1G30 <- makeSettings( + M=c(100), + ni=c(1), + Gy=c(30), + Gx=c(30), + snrEps=c(1, 2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM100N1G30) + +usecores <- 10 +options(cores=usecores) +M100N1G30FDboost <- try(doSimFDboost(settings=settingsM100N1G30, oneRepFDboost)) + +save(M100N1G30FDboost, file=paste(pathResults, "M100N1G30FDboost.Rdata", sep="")) + + +set.seed(18102012) + +settingsM100N1G100 <- makeSettings( + M=c(100), + ni=c(1), + Gy=c(100), + Gx=c(100), + snrEps=c(1, 2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM100N1G100) + +usecores <- 10 +options(cores=usecores) +M100N1G100FDboost <- try(doSimFDboost(settings=settingsM100N1G100, oneRepFDboost)) + +save(M100N1G100FDboost, file=paste(pathResults, "M100N1G100FDboost.Rdata", sep="")) + + + +# ###################################### M=200 +# +# set.seed(18102012) +# +# settingsM200N1G30 <- makeSettings( +# M=c(200), +# ni=c(1), +# Gy=c(30), +# Gx=c(30), +# snrEps=c(1, 2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM200N1G30) +# +# usecores <- 10 +# options(cores=usecores) +# M200N1G30FDboost <- try(doSimFDboost(settings=settingsM200N1G30, oneRepFDboost)) +# +# save(M200N1G30FDboost, file=paste(pathResults, "M200N1G30FDboost.Rdata", sep="")) +# +# +# set.seed(18102012) +# +# settingsM200N1G100 <- makeSettings( +# M=c(200), +# ni=c(1), +# Gy=c(100), +# Gx=c(100), +# snrEps=c(1, 2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM200N1G100) +# +# usecores <- 10 +# options(cores=usecores) +# M200N1G100FDboost <- try(doSimFDboost(settings=settingsM200N1G100, oneRepFDboost)) +# +# save(M200N1G100FDboost, file=paste(pathResults, "M200N1G100FDboost.Rdata", sep="")) + + + +##################################### M=500 + +set.seed(18102012) + +settingsM500N1G30 <- makeSettings( + M=c(500), + ni=c(1), + Gy=c(30), + Gx=c(30), + snrEps=c(1,2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM500N1G30) + +usecores <- 10 +options(cores=usecores) +M500N1G30FDboost <- try(doSimFDboost(settings=settingsM500N1G30, oneRepFDboost)) + +save(M500N1G30FDboost, file=paste(pathResults, "M500N1G30FDboost.Rdata", sep="")) + + +set.seed(18102012) + +settingsM500N1G100 <- makeSettings( + M=c(500), + ni=c(1), + Gy=c(100), + Gx=c(100), + snrEps=c(1, 2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM500N1G100) + +usecores <- 10 +options(cores=usecores) +M500N1G100FDboost <- try(doSimFDboost(settings=settingsM500N1G100, oneRepFDboost)) + +save(M500N1G100FDboost, file=paste(pathResults, "M500N1G100FDboost.Rdata", sep="")) + + +###################################### + +print(sessionInfo()) diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_PlotModels.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_PlotModels.R new file mode 100644 index 0000000..1c48ba6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_PlotModels.R @@ -0,0 +1,54 @@ +############################################################################### +# run the simulations for boosting of functional data +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +print(R.Version()$version.string) + +library(refund) +library(FDboost) +library(splines) +pathResults <- NULL +pathModels <- NULL + +library(pryr) # to test for memory consumption + +library(plyr) + +# only works on Linux -> with try() no error on windows +try(library(doMC)) +try(registerDoMC(cores=cores)) + +source("simfuns.R") + + +# ###################################### M=100 + +set.seed(18102012) + +settings <- makeSettings( + M=c(100), + ni=c(1), + Gy=c(30), + Gx=c(30), + snrEps=c(1,2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1) + +length(settings) + +usecores <- 1 +options(cores=usecores) +M100N1G30 <- try(doSim(settings=settings, cores=usecores)) + +save(M100N1G30, file=paste(pathResults, "plotModelsM100N1G30.Rdata", sep="")) + + +###################################### + +print(sessionInfo()) diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_pffr.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_pffr.R new file mode 100644 index 0000000..35c21d3 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_pffr.R @@ -0,0 +1,224 @@ +############################################################################### +# run the simulations for boosting of functional data +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +print(R.Version()$version.string) + +library(refund) +library(FDboost) +library(splines) +pathResults <- NULL + +# install.packages("pryr") +library(pryr) + +source("simfuns.R") + +# ##################################### M=50 +# +# set.seed(18102012) +# +# settingsM50N1G30 <- makeSettings( +# M=c(50), +# ni=c(1), +# Gy=c(30), +# Gx=c(30), +# snrEps=c(1,2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM50N1G30) +# +# usecores <- 2 +# options(cores=usecores) +# M50N1G30 <- try(doSimPffr(settings=settingsM50N1G30, cores=usecores)) +# +# save(M50N1G30, file=paste(pathResults, "M50N1G30pffr.Rdata", sep="")) +# +# +# set.seed(18102012) +# +# settingsM50N1G100 <- makeSettings( +# M=c(50), +# ni=c(1), +# Gy=c(100), +# Gx=c(100), +# snrEps=c(1, 2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM50N1G100) +# +# usecores <- 2 +# options(cores=usecores) +# M50N1G100 <- try(doSimPffr(settings=settingsM50N1G100, cores=usecores)) +# +# save(M50N1G100, file=paste(pathResults, "M50N1G100pffr.Rdata", sep="")) + + +##################################### M=100 + +set.seed(18102012) + +settingsM100N1G30 <- makeSettings( + M=c(100), + ni=c(1), + Gy=c(30), + Gx=c(30), + snrEps=c(1,2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM100N1G30) + +usecores <- 2 +options(cores=usecores) +M100N1G30 <- try(doSimPffr(settings=settingsM100N1G30, cores=usecores)) + +save(M100N1G30, file=paste(pathResults, "M100N1G30pffr.Rdata", sep="")) +#save(M50N1G30, file=paste(pathResults, "test.Rdata", sep="")) + + +set.seed(18102012) + +settingsM100N1G100 <- makeSettings( + M=c(100), + ni=c(1), + Gy=c(100), + Gx=c(100), + snrEps=c(1,2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM100N1G100) + +usecores <- 2 +options(cores=usecores) +M100N1G100 <- try(doSimPffr(settings=settingsM100N1G100, cores=usecores)) + +save(M100N1G100, file=paste(pathResults, "M100N1G100pffr.Rdata", sep="")) + + +# ##################################### M=200 +# +# set.seed(18102012) +# +# settingsM200N1G30 <- makeSettings( +# M=c(200), +# ni=c(1), +# Gy=c(30), +# Gx=c(30), +# snrEps=c(1,2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM200N1G30) +# +# usecores <- 2 +# options(cores=usecores) +# M200N1G30 <- try(doSimPffr(settings=settingsM200N1G30, cores=usecores)) +# +# save(M200N1G30, file=paste(pathResults, "M200N1G30pffr.Rdata", sep="")) +# #save(M50N1G30, file=paste(pathResults, "test.Rdata", sep="")) +# +# +# set.seed(18102012) +# +# settingsM200N1G100 <- makeSettings( +# M=c(200), +# ni=c(1), +# Gy=c(100), +# Gx=c(100), +# snrEps=c(1,2), +# snrE=c(0), +# snrB=c(2), +# scenario=3, +# balanced=c(TRUE), +# nuisance=c(0), +# rep=1:10) +# +# length(settingsM200N1G100) +# +# usecores <- 2 +# options(cores=usecores) +# M200N1G100 <- try(doSimPffr(settings=settingsM200N1G100, cores=usecores)) +# +# save(M200N1G100, file=paste(pathResults, "M200N1G100pffr.Rdata", sep="")) +# + + +##################################### M=500 + +set.seed(18102012) + +settingsM500N1G30 <- makeSettings( + M=c(500), + ni=c(1), + Gy=c(30), + Gx=c(30), + snrEps=c(1,2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM500N1G30) + +usecores <- 2 +options(cores=usecores) +M500N1G30 <- try(doSimPffr(settings=settingsM500N1G30, cores=usecores)) + +save(M500N1G30, file=paste(pathResults, "M500N1G30pffr.Rdata", sep="")) + + +set.seed(18102012) + +settingsM500N1G100 <- makeSettings( + M=c(500), + ni=c(1), + Gy=c(100), + Gx=c(100), + snrEps=c(1, 2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) + +length(settingsM500N1G100) + +usecores <- 2 +options(cores=usecores) +M500N1G100 <- try(doSimPffr(settings=settingsM500N1G100, cores=usecores)) + +save(M500N1G100, file=paste(pathResults, "M500N1G100pffr.Rdata", sep="")) + + +###################################### + +print(sessionInfo()) \ No newline at end of file diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_time.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_time.R new file mode 100644 index 0000000..798c64b --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/run_time.R @@ -0,0 +1,88 @@ +############################################################################### +# run the simulations for boosting of functional data +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +##### test gain in time for computation as array model compared to normal computation + +print(R.Version()$version.string) + +#library(refund) +library(FDboost) +library(splines) +pathResults <- NULL + +library(pryr) + +source("simfuns.R") + +##################################### M=50 + +set.seed(18102012) + +settingsTime <- makeSettings( + M=c(50, 100, 500), + ni=c(1), + Gy=c(30, 100), + Gx=c(30), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=3, + balanced=c(TRUE), + nuisance=c(0), + rep=1:10) # 1:10 + +length(settingsTime) + +usecores <- 10 +options(cores=usecores) +res <- try(doSimFDboost(settings=settingsTime, oneRepTime)) + +save(res, file=paste(pathResults, "resTime.Rdata", sep="")) + +res$M <- factor(res$M) +res$G <- factor(res$Gy) + +res$mod <- factor(res$model-2, levels=c(0,1), labels = c("FLAM", "long")) + + +#### generate boxplots of errors +library(ggplot2) + +pdf("arrayLongTime.pdf", width=9, height=7) +p <- ggplot(res, aes(y=time.elapsed, x=M, fill=mod)) +p + geom_boxplot(aes(colour = mod), outlier.size=.6) + + facet_grid( ~ G, labeller="label_both") + + scale_colour_manual('mod', values = c('FLAM' = 'black', 'long' = 'grey30')) + + scale_fill_manual(values=c("grey80", "grey95")) + + scale_y_continuous(breaks=c(1, 2, 5, 10, 20, 60, 120, 300, 600, 1200, 2700, + 5400, 10800, 21600, 43200), + trans="log10", + labels=c("1s", "2s", "5s", "10s", "20s", "1 min", "2 min", "5 min", + "10 min", "20 min", "45 min", "90 min", "3h", "6h", "12h")) + + labs(title="", x="N", y="time") + + theme(legend.position="top", legend.direction="horizontal", + text=element_text(size = 25), legend.title=element_blank()) + + theme(text=element_text(size = 20)) #+ theme_bw() +dev.off() + + +pdf("arrayLongMemory.pdf", width=9, height=7) +p <- ggplot(res, aes(y=memory, x=M, fill=mod)) +p + geom_boxplot(aes(colour = mod), outlier.size=.6) + + facet_grid( ~ G, labeller="label_both") + + scale_colour_manual('mod', values = c('FLAM' = 'black', 'long' = 'grey30')) + + scale_fill_manual(values=c("grey80", "grey95")) + + scale_y_continuous(trans="log10") + + labs(title="", x="N", y="memory") + + theme(legend.position="top", legend.direction="horizontal", + text=element_text(size = 25), legend.title=element_blank()) + + theme(text=element_text(size = 20)) #+ theme_bw() +dev.off() + + +###################################### + +print(sessionInfo()) diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/simfuns.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/simfuns.R new file mode 100644 index 0000000..3bb4a6e --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/sim/simfuns.R @@ -0,0 +1,1264 @@ +############################################################################### +# changed code of Fabian Scheipl lfpr3.R for data generation and fit of pffr +# Author: Sarah Brockhaus +############################################################################### + + +# M=50; ni=1; Gy=30; Gx=20; snrEps=5; snrE=0; snrB=1; balanced=TRUE; nuisance=0 +# scenario="1" +makeData <- function(M=50, # number of subjects + ni=1, # mean number of observations per subject + Gy=30, # number of grid points for t + Gx=30, # number of grid points for s + snrEps=5, # signal-to-noise ratio + snrE=0, # smooth errors per curve E_ij? - currently not used + snrB=1, # relative importance of random effects + scenario="1", + balanced=TRUE, # in the case of reapeated measures - currently always TRUE + nuisance=0, # number of nuisance variables + ...){ + + # set df in base learners + df <- 2.25 + + # function for generating a functional variable as (spline-basis)%*%(random coefficient) + rf <- function(x=seq(0,1,length=100), k=15) { + drop(ns(x, k, int=TRUE) %*% runif(k, -3, 3)) + } + + # standardize matrix, so that colSums are zero + zeroConstraint <- function(x){ + stopifnot(is.matrix(x)) + t(t(x) - colMeans(x)) + } + + # generate zero centered scalar covariates + cenScalarCof <- function(n){ + z <- runif(n) - 0.5 + z <- z - mean(z) + z + } + + # generate a smooth global intercept + intf <- function(t){ + cos(3*pi*t^2) + 2 + } + + ## smooth function of scalar covariate and time + g2zt <- function(z, t){ 2*(-t^2-0.1)*sin(pi*z+0.5) } + + # build a regular grid over the range of a scalar covariable + zgrid <- function (z, l=40) seq(min(z), max(z), l=l) + + # functions for scalar effects + beta2 <- function(z,t) 3*sin(-2*t) + 1 + beta3 <- function(z,t) -4*10^(z^2) + 5 + + # generate bivariate coefficient surface + test1 <- function(s, t, ss=0.3, st=0.4) + { + dnorm(s, mean = 0.2, sd = 0.3)*dnorm(t, mean = 0.2, sd = 0.3) + + dnorm(s, mean = 0.6, sd = 0.3)*dnorm(t, mean = 0.8, sd = 0.25) - 0.5 + } + #persp(outer(seq(0,1, l=20), seq(0,1, l=20), test1 ), ticktype="detailed", theta=30, phi=30 ) + + # generate bivariate coefficient surface + test2 <- function(s, t){ + 1.5*sin(pi*t+0.3) * sin(pi*s) + } + #persp(outer(seq(0,1, l=20), seq(0,1, l=20), test2 ), ticktype="detailed", theta=30, phi=30 ) + + + #### function that generates nuisance variables, uses the variables within the functions + # dgp1, ..., dgp5 + generateNuisance <- function(M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, + nuisance, scenario){ + + if(nuisance==0) return(NULL) + + dataN <- data.frame(dummy=rep(NA, M*ni)) + + # Define number of scalar and functional nuisance variables + if(scenario %in% c("1")){ + nrX <- ceiling(nuisance/2) + nrz <- nuisance - nrX + } + if(scenario %in% c("2")){ + nrX <- 0 + nrz <- nuisance + } + if(scenario %in% c("3")){ + nrX <- nuisance + nrz <- 0 + } + + pffrN <- c() + boostN <- c() + namesVariables <- c() + + # Generate scalar and functional nuisance variables + if(nrz>0){ + for(i in 1:nrz){ + dataN <- data.frame(dataN, cenScalarCof(M*ni)) + } + pffrN <- paste("s(", paste("zn", 1:nrz, sep=""), ", k=5)", sep="") + boostN <- paste("bbsc(", paste("zn", 1:nrz, sep=""), ", df=",df, ")", sep="") + namesVariables <- c(namesVariables, paste("zn", 1:nrz, sep="")) + + # use factor nuisance variables in scenario 2 + if(scenario=="2"){ + for(i in 1:ceiling(nrz/4)){ + dataN[,i+1] <- sample(c(-1,1), M*ni, replace=TRUE) # +1 because of dummy variable in first column + } + pffrN[1:ceiling(nrz/4)] <- paste( paste("zn", 1:ceiling(nrz/4), sep=""), sep="") + boostN[1:ceiling(nrz/4)] <- paste("bols(", paste("zn", 1:ceiling(nrz/4), sep=""), + ", df=", df ,", intercept=FALSE)", sep="") + namesVariables[1:ceiling(nrz/4)] <- paste("zn", 1:ceiling(nrz/4), "_bin", sep="") + } + } + if(nrX>0){ + s <- seq(0, 1, l=Gx) + # Mix nuisance variables of different complexity in X + for(i in 1:nrX){ + dataN <- data.frame(dataN, I(zeroConstraint( t(replicate(M*ni, rf(s, k=5))) )) ) + #if(i%%2==0) dataN <- data.frame(dataN, I(zeroConstraint( t(replicate(M*ni, rf(s, k=5))) )) ) + } + pffrN <- c(pffrN, paste("ff(", paste("Xn", 1:nrX, sep=""), ", yind=t)", sep="")) + boostN <- c(boostN, paste("bsignal(", paste("Xn", 1:nrX, sep=""), ", s, df=", df ,")", sep="") ) + namesVariables <- c(namesVariables, paste("Xn", 1:nrX, sep="")) + } + dataN <- dataN[,-1] + attr(dataN, "pffrN") <- pffrN + attr(dataN, "boostN") <- boostN + attr(dataN, "namesVariables") <- namesVariables + names(dataN) <- c( if(nrz>0) paste("zn", 1:nrz, sep=""), + if(nrX>0) paste("Xn", 1:nrX, sep="")) + return(dataN) + } + + # call the function generateNuisance() and add the nuisance variables to the dataset + addNuisance <- function(data, M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, + nuisance, scenario){ + dataN <- generateNuisance(M, ni, Gy, Gx, snrEps, snrE, snrB, + balanced, nuisance, scenario) + data <- c(data, dataN) + attr(data, "pffrN") <- attr(dataN, "pffrN") + attr(data, "boostN") <- attr(dataN, "boostN") + attr(data, "namesVariables") <- attr(dataN, "namesVariables") + return(data) + } + + # Scenario with one scalar and one functional covariable + dgp1 <- function(M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, nuisance){ + id <- if(balanced){ + gl(M, ni) # generate factor levels + } else { + factor(c(1:M, sample(1:M, M*ni-M, repl=TRUE, prob=sqrt(1:M)))) + } + t <- seq(0, 1, l=Gy) + s <- seq(0, 1, l=Gx) + tgrid <- sgrid <- seq(0,1, l=40) + tgrid100 <- seq(0,1, l=100) + + # Intercept + int <- matrix(intf(t), nrow=ni*M, ncol=Gy, byrow=TRUE) + + # Scalar covariate + z1 <- cenScalarCof(M*ni) + fz1 <- zeroConstraint(outer(z1, t, g2zt)) # g(z1,t) + + # Functional covariate + X1 <- zeroConstraint( t(replicate(M*ni, rf(s, k=10))) ) + L <- integrationWeights(X1=X1, xind=s) # Riemann integration weights + beta1.st <- outer(s, t, test1) + X1f <- (L*X1)%*%beta1.st + + # Compute response + Ytrue <- int + fz1 + X1f + Y <- Ytrue + sd(as.vector(Ytrue))/snrEps * matrix(scale(rnorm(M*ni*Gy)), + nrow=M*ni, ncol=Gy) + true_g0 <- intf(tgrid100) + true_fz1 <- zeroConstraint(outer(zgrid(z1), tgrid, g2zt)) + true_bst1 <- outer(sgrid, tgrid, test1) + + data <- list(id=id, Y=Y, z1=z1, X1=X1, s=s, t=t, + Ytrue=I(Ytrue), int=int, fz1=fz1, X1f=X1f, + true_g0=true_g0, true_fz1=true_fz1, true_bst1=true_bst1) + data <- addNuisance(data, M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, nuisance, scenario) + return(data) + } + + # Scenario with three different effects of scalar covariables + dgp2 <- function(M, ni, Gy, snrEps, snrE, snrB, balanced, nuisance){ + id <- if(balanced){ + gl(M, ni) # generate factor levels + }else{ + factor(c(1:M, sample(1:M, M*ni-M, repl=TRUE, prob=sqrt(1:M)))) + } + t <- seq(0, 1, l=Gy) + tgrid <- sgrid <- seq(0,1, l=40) + tgrid100 <- seq(0,1, l=100) + + # Intercept + int <- matrix(intf(t), nrow=ni*M, ncol=Gy, byrow=TRUE) + + z1 <- cenScalarCof(M*ni) + z2 <- cenScalarCof(M*ni) + z3 <- cenScalarCof(M*ni) + z4 <- sample(c(-1,1), M*ni, replace=TRUE) + + # first two effects are centered around 0 by construction + fz1 <- zeroConstraint(outer(z1, t, g2zt)) # g(z1,t) + fz2 <- zeroConstraint(outer(z2, t, beta3)) # g(z2) + fz3 <- outer(z3, t, function(z,t) beta2(z,t)*z) # beta(t)*z3 + fz4 <- outer(z4, t, function(z,t) beta2(z,t)*z) # beta(t)*z4 + + true_g0 <- intf(t=tgrid100) + true_fz1 <- zeroConstraint(outer(zgrid(z1), tgrid, g2zt)) + true_fz2 <- beta3(z=zgrid(z3, l=100), t=NA) + true_fz2 <- true_fz2 - mean(true_fz2) + true_fz3 <-beta2(z=NA, t=tgrid100) + true_fz4 <- beta2(z=NA, t=tgrid100) + + Ytrue <- int + fz1 + fz2 + fz3 + fz4 + + Y <- Ytrue + sd(as.vector(Ytrue))/snrEps * matrix(scale(rnorm(M*ni*Gy)), nrow=M*ni, ncol=Gy) + data <- list(id=id, Y=Y, t=t, z1=z1, z2=z2, z3=z3, z4=z4, + Ytrue=Ytrue, int=int, + fz1=fz1, fz2=fz2, fz3=fz3, fz4=fz4, + true_g0=true_g0, true_fz1=true_fz1, true_fz2=true_fz2, + true_fz3=true_fz3, true_fz4=true_fz4) + data <- addNuisance(data, M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, nuisance, scenario) + return(data) + } + + # Scenario with TWO functional covariates + dgp3 <- function(M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, nuisance){ + id <- if(balanced){ + gl(M, ni) # generate factor levels + } else { + factor(c(1:M, sample(1:M, M*ni-M, repl=TRUE, prob=sqrt(1:M)))) + } + t <- seq(0, 1, l=Gy) + s <- seq(0, 1, l=Gx) + tgrid <- sgrid <- seq(0,1, l=40) + tgrid100 <- seq(0,1, l=100) + + # Intercept + int <- matrix(intf(t), nrow=ni*M, ncol=Gy, byrow=TRUE) + + # Functional covariates + X1 <- zeroConstraint( t(replicate(M*ni, rf(s, k=5))) ) + L <- integrationWeights(X1=X1, xind=s) # Riemann integration weights + betast_1 <- outer(s, t, test1) + X1f <- (L*X1)%*%betast_1 + + X2 <- zeroConstraint( t(replicate(M*ni, rf(s, k=5))) ) + L <- integrationWeights(X1=X2, xind=s) # Riemann integration weights + #betast_2 <- outer(s, t, betast2) + betast_2 <- outer(s, t, test2) + X2f <- (L*X2)%*%betast_2 + + # Compute response + Ytrue <- int + X1f + X2f + Y <- Ytrue + sd(as.vector(Ytrue))/snrEps * matrix(scale(rnorm(M*ni*Gy)), + nrow=M*ni, ncol=Gy) + true_g0 <- intf(tgrid100) + true_bst1 <- outer(sgrid, tgrid, test1) + true_bst2 <- outer(sgrid, tgrid, test2) + + data <- list(id=id, Y=Y, X1=X1, X2=X2, + s=s, t=t, + Ytrue=I(Ytrue), int=int, X1f=X1f, X2f=X2f, + true_g0=true_g0, true_bst1=true_bst1, true_bst2=true_bst2) + data <- addNuisance(data, M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, nuisance, scenario) + return(data) + } + + + #### generate data + data <- switch(scenario, + "1" = dgp1(M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, nuisance), + "2" = dgp2(M, ni, Gy, snrEps, snrE, snrB, balanced, nuisance), + "3" = dgp3(M, ni, Gy, Gx, snrEps, snrE, snrB, balanced, nuisance)) + + # Formula of function pffr() + formulaPffr <- switch(scenario, + "1" = "s(z1, k=5) + ff(X1, yind=t)", + "2" = "s(z1, k=5) + c(s(z2)) + z3 + z4", + "3" = "ff(X1, yind=t) + ff(X2, yind=t)") + + # effects of nuisance variables + formulaPffr <- as.formula(paste("Y ~ ", formulaPffr, + if(!is.null(attr(data, "pffrN"))){ + paste(c(" ", attr(data, "pffrN")), collapse= " + ") + } )) + + # Formula of function FDboost() + formulaFDboost <- switch(scenario, + "1" = paste("1 + bbsc(z1, df=", df,") + bsignal(X1, s, df=", df,")", sep=""), + "2" = paste("1 + bbsc(z1, df=", df,") + c(bbs(z2, knots=10, df=", df,")) + bols(z3, df=", df,", intercept=FALSE) + bols(z4, df=", df,", intercept=FALSE)", sep=""), + "3" = paste("1 + bsignal(X1, s, df=", df,") + bsignal(X2, s, df=", df,")" , sep="")) + # effects of nuisance variables + formulaFDboost <- as.formula(paste("Y ~ ", formulaFDboost, + if(!is.null(attr(data, "boostN"))){ + paste(c(" ", attr(data, "boostN")), collapse= " + ") + } )) + timeformula <- formula(paste("~ bbs(t, knots=10, df=", df, ")", sep="")) + + var1 <- c("Int", "z1", "X1") + namesVariables <- switch(scenario, + "1" = var1, + "2" = c("Int", paste("z", 1:3, sep=""), "z4_bin"), + "3" = c("Int", paste("X", 1:2, sep="")), + "4" = c(var1, "id"), + "5" = c(var1, "id", "id_u")) + namesVariables <- c(namesVariables, attr(data, "namesVariables")) + + return(structure(data, + sigmaEps = sd(as.vector(data$Ytrue))/snrEps, + formulaPffr=formulaPffr, + formulaFDboost=formulaFDboost, + timeformula=timeformula, + namesVariables=namesVariables, + call=match.call())) +} + +if(FALSE){ + data1 <- makeData(scenario="1", seed=45) + data2 <- makeData(scenario="2", seed=14) # , M=100, Gx=30, Gy=30 + data3 <- makeData(scenario="3", seed=33) + + data1 <- makeData(scenario="1", nuisance=2, seed=12) + data2 <- makeData(scenario="2", nuisance=2, seed=34) + data3 <- makeData(scenario="3", nuisance=2, seed=37) +} + + +### Fit model using pffr() of package refund using the data and information of data from makeData() +fitModelPffr <- function(data, + bs.yindex = list(bs = "ps", k = 5, m = c(2, 1)), # default for expasion along t + bs.int = list(bs = "ps", k = 20, m = c(2, 1)), ...){ # default for expansion of intercept + + formula <- as.formula(attr(data, "formulaPffr")) + t <- data$t + + time <- system.time( + mem <- mem_change(m <- try(pffr(eval(formula), yind=t, data=data, + bs.yindex=bs.yindex, bs.int=bs.int))) + )[3] + + if(any(class(m) != "try-error")){ + m$runTime <- time + m$memory <- mem + return(m) + }else return(NULL) +} + +if(FALSE){ + m1 <- fitModelPffr(data1) + m2 <- fitModelPffr(data2) + m3 <- fitModelPffr(data3) +} + + +### Fit model using FDboost() that is based on package mboost +fitModelMboost <- function(data, + control=boost_control(mstop=100, nu=0.1), # settings of mboost + grid=seq(10, 200, by=10), + m_max=1000, + optimizeMstop=TRUE, + useArray=TRUE, + ...){ + + #scenario <- attr(data, "call")$scenario + formula <- attr(data, "formulaFDboost") + timeformula <- attr(data, "timeformula") + + ## do not use the array structure -> fit the model in long format + if(!useArray){ + data$Y <- as.vector(t(data$Y)) + data$myid <- rep(1:nrow(data$X1), each=length(data$t)) + data$t <- rep(data$t, times=nrow(data$X1)) + }else{ + data$myid <- NULL + } + + time <- system.time({ + + if(useArray){ + mem <- mem_change(m <- try(FDboost(eval(formula), data=data, control=control, + timeformula = timeformula))) + }else{ ## data in long format + mem <- mem_change(m <- try(FDboost(eval(formula), data=data, control=control, + timeformula = timeformula, id=~myid))) + } + + # plot(m$risk()) + if(any(class(m)=="FDboost") & optimizeMstop){ + + # set up two different splittings of the data + if(attr(data, "call")$scenario!=5){ id <- data$id + }else id <- NULL + + set.seed(attr(data, "call")$seed) + folds1 <- cvMa(ydim=m$ydim, type="bootstrap", B=10) + + set.seed(attr(data, "call")$seed + 100) + folds2 <- cvMa(ydim=m$ydim, type="bootstrap", B=10) + + # Increase maximal number of boosting iterations + increaseGrid <- TRUE + while(increaseGrid){ + + # cvm <- try(suppressMessages(cvrisk(m, papply = lapply, grid=grid))) + if(Sys.info()["sysname"]=="Linux"){ # use 10 cores on Linux + cvm <- try(cvrisk(m, folds = folds1, grid=grid, mc.cores=10), silent=TRUE) + }else cvm <- try(cvrisk(m, folds = folds1, grid=grid)) + + # Try for a second time if cvrisk() stops with error + if(class(cvm)!="cvrisk"){ + if(Sys.info()["sysname"]=="Linux"){ + cvm <- try(cvrisk(m, folds = folds2, grid=grid, mc.cores=10), silent=TRUE) + }else cvm <- try(cvrisk(m, folds = folds2, grid=grid)) + cat(paste("2nd calculation of cvrisk, class(cvm) =", class(cvm), "\n", sep=" ")) + } + + print(max(grid)) + + if(class(cvm) =="cvrisk"){ + # stop while-loop if optimal mstop is not the largest possible value + # and if mstop is grater or equal to m_max + increaseGrid <- mstop(cvm)==max(grid) & !mstop(cvm) >= m_max + }else increaseGrid <- FALSE # stop while-loop if cross validation was not possible + + # Continue to search th optimal mstop in the next 200 iterations + grid <- seq(max(grid)+10, max(grid)+200, by=10) + } + # plot(cvm) + }else cvm <- NULL + })[3] + + if(!optimizeMstop){ + m$runTime <- time + m$memory <- mem + return(m) + } + + if(any(class(m)=="FDboost") & class(cvm)=="cvrisk"){ + #if(mstop(cvm)==max(grid)) warning("mstop is maximal number in grid.") + #if(mstop(cvm)==min(grid)) warning("mstop is minimal number in grid.") + m <- m[mstop(cvm)] + m$runTime <- time + m$memory <- mem + return(m) + }else return(NULL) +} + +if(FALSE){ + m1m <- fitModelMboost(data1, m_max=500) # 300 + m2m <- fitModelMboost(data2, m_max=500) + m3m <- fitModelMboost(data3, m_max=500) +} + + + +### calculate some errors/ measures for goodness of fit of the model +# from fitModelMboost() and fitModelPffr() +getErrors <- function(data, m=NULL, plotModel=FALSE){ + + scenario <- attr(data, "call")$scenario + + # In case that model was not fitted: m=NULL + errorE <- c(msey=NA, mseg0=NA, + msefx1=NA, msefx2=NA, + msefz1=NA, msefz2=NA, msefz3=NA, msefz4=NA) + + relerrorE <- errorE + names(relerrorE) <- paste("rel", names(errorE), sep="") + + if(is.null(m)) return(as.list(c(errorE, relerrorE, relmseyT=NA, + funRsqrt=NA, mstop=NA, time.elapsed=NA)) ) + + classM <- class(m)[1] + + # Save number of iterations + mstop <- switch(classM, + "pffr" = NA, + "FDboost" = mstop(m), + "NULL" = NA) + + + # function to predict each component of linear predictor separately for FDboost() and pffr() + # intercept =TRUE indicates that the first variable is an intercept + # to which the offset should be added + + predictComponents <- function(object, intercept=TRUE){ + fit <- NULL + if(any(class(object)=="FDboost")){ + fit <- predict(object=object, which=1:length(object$baselearner)) + if(intercept) fit[[1]] <- fit[[1]] + object$offset # add offset + }else{ + fit <- predict(object=object, type="terms") + if(intercept) fit[[1]] <- fit[[1]] + coef(object, se=FALSE, seWithMean=FALSE)$pterms[1] # add global constan intercept + } + return(fit) + } + + # Perdiciton for pffr and boostFD + fit <- switch(classM, + "pffr" = predictComponents(m), + "FDboost" = predictComponents(m), + "NULL" = NULL) + + yhat <- switch(classM, + "pffr" = fitted(m), + "FDboost" = predict(m), + "NULL" = NULL) + + ############### Calculate errors of estimated coefficients directly on coefficients + if(any(class(m)=="pffr")){ + cm <- coef(m, se=FALSE, seWithMean=FALSE) + + # functional intercept g0 + est_g0 <- drop(cm$smterms[[1]]$value) + cm$pterms[1] + true_g0 <- data$true_g0 + #plot(true_g0, col=2, ylim=range(true_g0, est_g0)); points(est_g0) + #mean((est_g0-true_g0)^2) + + if(scenario %in% c("1", "2")){ + true_fz1 <- data$true_fz1 + est_fz1 <- matrix(drop(cm$smterms[[2]]$value), ncol=40) + }else est_fz1 <- true_fz1 <- NA + + if(scenario %in% c("2")){ + true_fz2 <- data$true_fz2 + true_fz3 <- data$true_fz3 + true_fz4 <- data$true_fz4 + est_fz2 <- drop(cm$smterms[[3]]$value) + est_fz3 <- drop(cm$smterms[[4]]$value) + est_fz4 <- drop(cm$smterms[[5]]$value) + }else{ + est_fz2 <- true_fz2 <- NA + est_fz3 <- true_fz3 <- NA + est_fz4 <- true_fz4 <- NA + } + + true_bst1 <- est_bst1 <- true_bst2 <- est_bst2 <- NA + if(scenario %in% c("1", "3")){ + whereX1 <- if(scenario %in% c("1")) 3 else 2 + true_bst1 <- data$true_bst1 + est_bst1 <- matrix(drop(cm$smterms[[whereX1]]$value), ncol=40) + if(scenario %in% c("3")){ + true_bst2 <- data$true_bst2 + est_bst2 <- matrix(drop(cm$smterms[[3]]$value), ncol=40) + } + } + } + + ################ Calculate errors of estimated coefficients directly on coefficients + if(any(class(m)=="FDboost")){ + cm <- coef(m, n1=100) + + # functional intercept g0 + est_g0 <- cm$offset$value + cm$smterms[[1]]$value + true_g0 <- data$true_g0 + + if(scenario %in% c("1", "2")){ + true_fz1 <- data$true_fz1 + est_fz1 <- matrix(drop(cm$smterms[[2]]$value), ncol=40) + }else est_fz1 <- true_fz1 <- NA + + if(scenario %in% c("2")){ + true_fz2 <- data$true_fz2 + true_fz3 <- data$true_fz3 + true_fz4 <- data$true_fz4 + est_fz2 <- cm$smterms[[3]]$value + est_fz3 <- cm$smterms[[4]]$value + est_fz3 <- drop(predict(m, which=4, newdata=list(z3=1, t=seq(0, 1, l=100 )))) + est_fz4 <- drop(predict(m, which=5, newdata=list(z4=1, t=seq(0, 1, l=100 )))) + }else{ + est_fz2 <- true_fz2 <- NA + est_fz3 <- true_fz3 <- NA + est_fz4 <- true_fz4 <- NA + } + + true_bst1 <- est_bst1 <- true_bst2 <- est_bst2 <- NA + if(scenario %in% c("1", "3", "4", "5")){ + whereX1 <- if(scenario %in% c("1")) 3 else 2 + true_bst1 <- data$true_bst1 + est_bst1 <- cm$smterms[[whereX1]]$value + if(scenario %in% c("3")){ + true_bst2 <- data$true_bst2 + est_bst2 <- cm$smterms[[3]]$value + true_bst3 <- data$true_bst3 + } + } + } + + # Calculate MSE + calcError <- function(x, xhat){ + if((length(x)==1 & is.na(x[1]))|(length(xhat)==1 & is.na(xhat[1]))){ + return(NA) + }else{ + mean((x - xhat)^2) + } + } + + errorE <- c(msey = calcError(data$Ytrue, yhat), + mseg0 = calcError(true_g0, est_g0), + msefx1 = calcError(true_bst1, est_bst1), + msefx2 = calcError(true_bst2, est_bst2), + msefz1 = calcError(true_fz1, est_fz1), + msefz2 = calcError(true_fz2, est_fz2), + msefz3 = calcError(true_fz3, est_fz3), + msefz4 = calcError(true_fz4, est_fz4)) + + # Calculate relative error for y, scaled with var_y(t) + # irMSE with standardized with local variance at each point t + relcalcErrorT <- function(x, xhat){ + if( (length(x)==1 & is.na(x[1])) | (length(xhat)==1 & is.na(xhat[1]))) return(NA) + + # Calculation like functional R^2 - standardize with mu(t) (Ramsay, Silverman Chap 16) + mut <- matrix(colMeans(x), nrow=nrow(x), ncol=ncol(x), byrow=TRUE) + + if (sum((x - mut)^2)==0){ + warning("Error is scaled by sigmaEps") + stand <- attr(data, "sigmaEps") + } else{ + stand <- colMeans((x-mut)^2) + # If you would have to divide with 0 replace 0 with the minimum + stand[stand==0] <- min(stand[stand!=0]) + } + # Standardize with "variability" at each time-point + err <- mean( colMeans((x-xhat)^2)/ stand) + return(err) + } + + # calculate irMSE that is the MSE standardized by the global variance + relcalcError <- function(x, xhat){ + if((length(x)==1 & is.na(x[1]))|(length(xhat)==1 & is.na(xhat[1]))) return(NA) + stopifnot(dim(x)==dim(xhat)) + + # Calculation like functional R^2 - standardize with global mu + mu <- mean(x) + stand <- mean((x-mu)^2) + if (stand==0){ + warning("Error is scaled by sigmaEps") + stand <- attr(data, "sigmaEps") + } + # Standardize with global "variability" + err <- mean( (x-xhat)^2) / stand + return(err) + } + + relerrorE <- c(msey = relcalcError(data$Ytrue, yhat), + mseg0 = relcalcError(true_g0, est_g0), + msefx1 = relcalcError(true_bst1, est_bst1), + msefx2 = relcalcError(true_bst2, est_bst2), + msefz1 = relcalcError(true_fz1, est_fz1), + msefz2 = relcalcError(true_fz2, est_fz2), + msefz3 = relcalcError(true_fz3, est_fz3), + msefz4 = relcalcError(true_fz4, est_fz4)) + + names(relerrorE) <- paste("rel", names(errorE), sep="") + + + ### calculate errors on scale of response? + + # functional R^2 + funRsqrt <- function(x, xhat){ + stopifnot(dim(x)==dim(xhat)) + mut <- matrix(colMeans(x), nrow=nrow(x), ncol=ncol(x), byrow=TRUE) + if (sum((x - mut)^2)==0) return(NaN) +# 1 - ( sum((x - xhat)^2) / sum((x - mut)^2) ) # over all + 1 - mean( colSums((x - xhat)^2) / colSums((x - mut)^2) ) # over t +# 1 - mean( rowSums((x - xhat)^2) / rowSums((x - mut)^2) ) # over subjects + } + + ret <- as.list(c(errorE, relerrorE, relmseyT = relcalcErrorT(data$Ytrue, yhat), + funRsqrt=funRsqrt(x=data$Ytrue, xhat=yhat), + mstop=mstop, time=m$runTime)) + + # Save information for plotting + if(plotModel==TRUE){ + est <- list(Ytrue=data$Ytrue, yhat=yhat, true_g0=true_g0, est_g0=est_g0, + true_bst1=true_bst1, est_bst1=est_bst1, + true_bst2=true_bst2, est_bst2=est_bst2, + true_fz1=true_fz1, est_fz1=est_fz1, + true_fz2=true_fz2, est_fz2=est_fz2, + true_fz3=true_fz3, est_fz3=est_fz3, + true_fz4=true_fz4, est_fz4=est_fz4 + ) + attr(ret, "est") <- est + } + + return(ret) +} + +if(FALSE){ + eNULL <- getErrors(NULL, NULL) + length(eNULL) + e1 <- getErrors(data1, m1) + e2 <- getErrors(data2, m2) #, plotModel=TRUE + e3 <- getErrors(data3, m3) + length(e3) + #cbind(eNULL, e1) +} + +#true_fz2, est_fz2 + +if(FALSE){ + e1m <- getErrors(data1, m1m) + e2m <- getErrors(data2, m2m) #, plotModel=TRUE + e3m <- getErrors(data3, m3m) + cbind(e3, e3m) +} + +# matplot that defaults to plotting lines +matlplot <- function(x,y, lty=1, col=1, lwd=.1, ...){ + if (missing(x)) { + if (missing(y)) + stop("must specify at least one of 'x' and 'y'") + else x <- 1L:NROW(y) + } + else if (missing(y)) { + y <- x + x <- 1L:NROW(y) + } + matplot(x,y, type="l", lty=lty, col=col, lwd=lwd, ...) +} + + +# function to plot true values, estimates of FDboost and estimates of pffr +# depends on results of function getErrors() +# use only a subset of 10 observations for plotting them as example +plotModel <- function(err, errB=NULL, data, theseSettings, subset=sample(1:theseSettings$M, size=10)){ + + # build a regular grid over the range of a scalar covariable + zgrid <- function (z, l=40) seq(min(z), max(z), l=l) + + + est <- attr(err, "est") + estB <- attr(errB, "est") + + model <- "pffr" + modelB <- "mboost" + + # set errors to NULL if no model was fitted + if(sum(is.na(err))==length(err)) err <- NULL + if(sum(is.na(errB))==length(errB)) errB <- NULL + + # Plot nothing if none of the models could be fitted + if(is.null(err) & is.null(errB)){ + return(NULL) + } + + settingString <- paste(names(theseSettings), unlist(theseSettings), sep=":") + settingString <- paste(settingString[!grepl("seed:", settingString) & + !grepl("set:", settingString)], collapse=" ") + #opar <- par() + #on.exit(try(par(opar), silent=TRUE)) + + par(xpd=TRUE, mar=par()$mar/2) + #clrs <- alpha( rainbow(length(subset)), 200 ) + clrs <- rainbow(length(subset)) + + # plotIntercept <- function(m=m, mb=mb, fit=fit, fitB=fitB, errors=errors, errorsB=errorsB, data=data){ + plotIntercept <- function(){ + range <- range(est$est_g0, estB$est_g0, data$true_g0) + plot(data$true_g0, main=bquote(g[0](t)), xlab="", ylab="", xaxt="n", ylim=range, type="l") + if(!is.null(err)){ + plot(est$est_g0, xlab="", ylab="", xaxt="n", ylim=range, type="l", + main=bquote(paste("FAMM: ", hat(g[0])(t), ": reliMSE", phantom(x)%~~% .(round(err$relmseg0, 4))))) + } + if(!is.null(errB)){ + plot(estB$est_g0, xlab="", ylab="", xaxt="n", ylim=range, type="l", + main=bquote(paste("FLAM: ", hat(g[0])(t), ": reliMSE", phantom(x)%~~% .(round(errB$relmseg0, 4))))) + } + } + + twoModels <- !( is.null(errB)|is.null(err) ) + + if(theseSettings$scenario %in% c("1", "3")) + layout(matrix(1:(10+5*twoModels), ncol=2+1*twoModels, byrow=TRUE)) + + if(theseSettings$scenario %in% c("2")) + layout(matrix(1:(14+7*twoModels), ncol=2+1*twoModels, byrow=TRUE)) + + plotIntercept() + + # If pffr was not fitted but FDboost was, then change err and errB + if(is.null(err) & !is.null(errB)){ + err <- errB + est <- estB + errB <- NULL + estB <- NULL + model <- modelB + } + + # Plot g_1(z_1,t) + if(theseSettings$scenario %in% c("1","2")){ + tgrid <- seq(0,1, l=40) + # Only plot part of the points -> grid is visible + k=(2*1:20) + #k=1:40 + range <- range(est$est_fz1, estB$est_fz1, data$true_fz1) + persp(zgrid(data$z1)[k], tgrid[k], data$true_fz1[k,k], main=expression(g[1](z[1],t)), + xlab="z", ylab="t", zlab="", zlim=range, + theta=30, phi=30, ticktype="detailed") + persp(zgrid(data$z1)[k], tgrid[k], est$est_fz1[k,k], + xlab="z", ylab="t", zlab="", zlim=range, theta=30, phi=30, ticktype="detailed", + main=bquote(paste(hat(g[1])(z[1],t), ": reliMSE", phantom(x)%~~% .(round(err$relmsefz1, 4))))) + if(!is.null(errB)){ + persp(zgrid(data$z1)[k], tgrid[k], estB$est_fz1[k,k], + xlab="z", ylab="t", zlab="", zlim=range, theta=30, phi=30, ticktype="detailed", + main=bquote(paste(hat(g[1])(z[1],t), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefz1, 4))))) + } + } + + # Plot \beta_1(s,t) + if(theseSettings$scenario %in% c("1","3")){ + tgrid <- seq(0,1, l=40) + sgrid <- seq(0,1, l=40) + # Only plot part of the points -> grid is visible + k=(2*1:20) + #k=1:40 + range <- range(est$est_bst1, estB$est_bst1, est$true_bst1) + persp(tgrid[k], sgrid[k], z=est$true_bst1[k,k], theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(beta[1](s,t)))) + persp(tgrid[k], sgrid[k], est$est_bst1[k,k], theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta[1])(s,t), ": reliMSE", phantom(x)%~~% .(round(err$relmsefx1, 4))))) + if(!is.null(errB)){ + persp(tgrid[k], sgrid[k], estB$est_bst1[k,k], theta=30, phi=30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta[1])(s,t), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefx1, 4))))) + } + } + + # Plot g(z) + if(theseSettings$scenario %in% c("2")){ + range <- range(est$est_fz2, estB$est_fz2, est$true_fz2) + plot(est$true_fz2~zgrid(data$z2, l=100), main=expression(g[2](z[2])), xlab="z", ylab="", ylim=range, type="l", xaxt="n") + plot(est$est_fz2~zgrid(data$z2, l=100), xlab="z", ylab="", ylim=range, type="l", xaxt="n", + main=bquote(paste(hat(g[2])(z[2]), ": reliMSE", phantom(x)%~~% .(round(err$relmsefz2, 4))))) + if(!is.null(errB)){ + plot(estB$est_fz2~zgrid(data$z2, l=100), xlab="z", ylab="", ylim=range, type="l", xaxt="n", + main=bquote(paste(hat(g[2])(z[2]), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefz2, 4))))) + } + } + + # Plot \beta(t) + if(theseSettings$scenario %in% c("2")){ + tgrid100 <- seq(0,1, l=100) + range <- range(est$est_fz3, estB$est_fz3, est$true_fz3) + plot(est$true_fz3~tgrid100, main=expression(beta[3](t)), xlab="t", ylab="", ylim=range, type="l", xaxt="n") + plot(est$est_fz3~tgrid100, xlab="t", ylab="", ylim=range, type="l", xaxt="n", + main=bquote(paste(hat(beta[3])(t), ": reliMSE", phantom(x)%~~% .(round(err$relmsefz3, 4))))) + if(!is.null(errB)){ + plot(estB$est_fz3~tgrid100, xlab="t", ylab="", ylim=range, type="l", xaxt="n", + main=bquote(paste(hat(beta[3])(t), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefz3, 4))))) + } + + range <- range(est$est_fz4, estB$est_fz4, est$true_fz4) + plot(est$true_fz4~tgrid100, main=expression(beta[4](t)), xlab="t", ylab="", ylim=range, type="l", xaxt="n") + plot(est$est_fz4~tgrid100, xlab="t", ylab="", ylim=range, type="l", xaxt="n", + main=bquote(paste(hat(beta[4])(t), ": reliMSE", phantom(x)%~~% .(round(err$relmsefz4, 4))))) + if(!is.null(errB)){ + plot(estB$est_fz4~tgrid100, xlab="t", ylab="", ylim=range, type="l", xaxt="n", + main=bquote(paste(hat(beta[4])(t), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefz4, 4))))) + } + } + + # Plot \beta_2(s,t) + if(theseSettings$scenario %in% c("3")){ + tgrid <- seq(0,1, l=40) + sgrid <- seq(0,1, l=40) + # Only plot part of the points -> grid is visible + k=(2*1:20) + #k=1:40 + + range <- range(est$est_bst2, estB$est_bst2, est$true_bst2) + persp(tgrid[k], sgrid[k], z=est$true_bst2[k,k], theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(beta[2](s,t)))) + persp(tgrid[k], sgrid[k], est$est_bst2[k,k], theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta[2])(s,t), ": reliMSE", phantom(x)%~~% .(round(err$relmsefx2, 4))))) + if(!is.null(errB)){ + persp(tgrid[k], sgrid[k], estB$est_bst2[k,k], theta=30, phi=30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta[2])(s,t), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefx2, 4))))) + } + } + + # Plot Ytrue, reliMSE(Yfitted), Y and Ytrue-Yfitted + ylim <- range(est$Ytrue, est$Yhat, data$Y) + matlplot(t(data$Ytrue[subset,]), col=clrs, xlab="", ylab="", xaxt="n", + main=expression(E(Y[i](t))), ylim=ylim, lty=1:length(subset)) + matlplot(t(est$yhat[subset,]), col=clrs, xlab="", ylab="", xaxt="n", ylim=ylim, lty=1:length(subset), + main=bquote(paste(hat(Y[i])(t), ": reliMSE", phantom(x)%~~%.(round(err$relmsey, 4))))) + if(!is.null(errB)) matlplot(t(estB$yhat[subset,]), col=clrs, xlab="", ylab="", + xaxt="n", ylim=ylim, lty=1:length(subset), + main=bquote(paste(hat(Y[i])(t), ": reliMSE", phantom(x)%~~%.(round(errB$relmsey, 4))))) + + matlplot(t(data$Y[subset,]), lwd=.5, lty=1:length(subset), col=clrs, xlab="", ylab="", xaxt="n", + main=expression(Y[i](t))) + + if(!is.null(errB)){ + range <- range(data$Ytrue - est$yhat, data$Ytrue - estB$yhat) + }else{ + range <- range(data$Ytrue - est$yhat) + } + matlplot(t((data$Ytrue - est$yhat)[subset,]), lwd=.5, lty=1:length(subset), col=clrs, xlab="", + ylab="", xaxt="n", main=expression(E(Y[i](t)) - hat(Y[i])(t)), ylim=range) + segments(x0=1, y0=0, x1 = ncol(data$Y)+1, col="grey") + if(!is.null(errB)) matlplot(t((data$Ytrue - estB$yhat)[subset,]), lwd=.5, lty=1:length(subset), col=clrs, xlab="", + ylab="", xaxt="n", main=expression(E(Y[i](t)) - hat(Y[i])(t)), ylim=range) + segments(x0=1, y0=0, x1 = ncol(data$Y)+1, col="grey") + + par(xpd=FALSE, mar=par()$mar*2) + +} + + +#M=10; ni=1; Gy=30; Gx=20; snrEps=1; snrE=0; snrB=1; balanced=TRUE +if(FALSE){ + str(data1 <- makeData(scenario=1, seed=123)) + summary(m1 <- fitModelPffr(data1), freq=FALSE) + #plot(m1, pers=TRUE, pages=1) + summary(m1m <- fitModelMboost(data1, m_max=300), freq=FALSE) + e1 <- getErrors(data1, m1, plotModel=TRUE) + e1m <- getErrors(data1, m1m, plotModel=TRUE) + plotModel(err=e1, errB=e1m, data=data1, theseSettings=list(M=50, Gy=30, Gx=30, snrEps=1, scenario="1")) + + str(data2 <- makeData(scenario=2, seed=123)) + summary(m2 <- fitModelPffr(data2), freq=FALSE) + #plot(m2, pers=TRUE, pages=1) + summary(m2m <- fitModelMboost(data2, m_max=300), freq=FALSE) + e2 <- getErrors(data2, m2, plotModel=TRUE) + e2m <- getErrors(data2, m2m, plotModel=TRUE) + plotModel(err=e2, errB=e2m, data=data2, theseSettings=list(M=50, Gy=30, Gx=30, snrEps=1, scenario="2")) + + str(data3 <- makeData(scenario=3, seed=123)) + summary(m3 <- fitModelPffr(data3), freq=FALSE) + #plot(m3, pers=TRUE, pages=1) + summary(m3m <- fitModelMboost(data3, m_max = 250), freq=FALSE) + e3 <- getErrors(data3, m3, plotModel=TRUE) + e3m <- getErrors(data3, m3m, plotModel=TRUE) + plotModel(err=e3, errB=e3m, data=data3, theseSettings=list(M=50, Gy=30, Gx=30, snrEps=1, scenario="3")) + +} + + +############################################################################################## + + +### one replication of simulation to plot the models of boosting and pffr +# theseSettings=settings[[2]] +# theseSettings=settingsSplit[[9]][[1]] +oneRep <- function(theseSettings){ + #browser() + #print(data.frame(theseSettings)) + + # Generate data + set.seed(theseSettings$seed) + data <- do.call(makeData, theseSettings) + args <- theseSettings + args$data <- data + + #data5 <- makeData(scenario="5") + + print(unlist(theseSettings)[c(1,3,5,8,10,13)]) + + # Fit models + #modPffr <- NULL + modPffr <- suppressMessages(do.call(fitModelPffr, args)) + modMboost <- suppressMessages(do.call(fitModelMboost, args)) + + if(is.null(modPffr)) print(paste("modPffr, set " , theseSettings$set, ", is NULL", sep="")) + if(is.null(modMboost)) print(paste("modMboost, set " , theseSettings$set, ", is NULL", sep="")) + + err <- getErrors(data, modPffr, plotModel=TRUE) + errB <- getErrors(data, modMboost, plotModel=TRUE) + + # Save models of first rep + if(theseSettings$rep==1){ + nm <- paste(names(theseSettings)[c(1,3,4,5,7,8,10)], + theseSettings[c(1,3,4,5,7,8,10)], sep="",collapse="_") + pdf(paste(pathModels, nm, ".pdf", sep=""), width=8, height=12) + try(plotModel(err=err, errB=errB, data=data, theseSettings=theseSettings)) + dev.off() + } + + # Calculate errors for both models + resMboost <- try(c(model=2, getErrors(data, modMboost))) + resPffr <- try(c(model=1, getErrors(data, modPffr))) + #cbind(resMboost, resPffr) + + rm(modMboost); rm(modPffr); rm(data); rm(args) + + res <- rbind(do.call(data.frame, c(theseSettings, resPffr)), + do.call(data.frame, c(theseSettings,resMboost))) + + return(res) +} + +# test <- oneRep(theseSettings) + + +### one replication of simulation: only fit the models with FDboost +# theseSettings=settings[[4]] +# theseSettings=settingsSplit[[9]][[1]] +oneRepFDboost <- function(theseSettings){ + #browser() + #print(data.frame(theseSettings)) + + # Generate data + set.seed(theseSettings$seed) + data <- do.call(makeData, theseSettings) + args <- theseSettings + args$data <- data + + print(unlist(theseSettings)[c(1,3,5,8,10,13)]) + + # Fit models + modPffr <- NULL + ### modPffr <- suppressMessages(do.call(fitModelPffr, args)) + + args$control <- boost_control(mstop=2000, nu=0.1) + args$grid <- seq(10, 2000, by = 10) + args$m_max <- 2000 + + modMboost <- suppressMessages(do.call(fitModelMboost, args)) # args$m_max=100 + + if(is.null(modMboost)) print(paste("modMboost, set " , theseSettings$set, ", is NULL", sep="")) + + # Calculate errors for both models + resMboost <- try(c(model=2, getErrors(data, modMboost))) + resPffr <- try(c(model=1, getErrors(data, modPffr))) + #cbind(resMboost, resPffr) + + rm(modMboost); rm(modPffr); rm(data); rm(args) + + res <- rbind(do.call(data.frame, c(theseSettings, resMboost))) + + return(res) +} + +# test <- oneRep(theseSettings) + + +#s# one replication of simulation for pffr +# theseSettings=settings[[1]] +# theseSettings=settingsSplit[[9]][[1]] +oneRepPffr <- function(theseSettings){ + + # Generate data + set.seed(theseSettings$seed) + data <- do.call(makeData, theseSettings) + args <- theseSettings + args$data <- data + + print(unlist(theseSettings)[c(1,3,5,8,10,13)]) + + # Fit models + modPffr <- suppressMessages(try(do.call(fitModelPffr, args))) + + # Should not be necessary! + if(any(class(modPffr)=="try-error")){ + warning(paste("fitModelPffr, set " , theseSettings$set, ", gives error!", sep="")) + modPffr <- NULL + } + modMboost <- NULL + + if(is.null(modPffr)) print(paste("modPffr, set " , theseSettings$set, ", is NULL", sep="")) + + # Calculate errors for both models + resMboost <- try(c(model=2, getErrors(data, modMboost))) + resPffr <- try(c(model=1, getErrors(data, modPffr))) + #cbind(resMboost, resPffr) + + #print(paste("after getErrors")) + + rm(modMboost); rm(modPffr); rm(data); rm(args) + + res <- rbind(do.call(data.frame, c(theseSettings, resPffr))) + + return(res) +} + + + +### one replication of simulation: fit model with FDboost without optimizing mstop! +### to compare time with and without array model +# theseSettings=settings[[4]] +# theseSettings=settingsSplit[[9]][[1]] +oneRepTime <- function(theseSettings){ + #browser() + #print(data.frame(theseSettings)) + + # Generate data + set.seed(theseSettings$seed) + data <- do.call(makeData, theseSettings) + args <- theseSettings + args$data <- data + + print(unlist(theseSettings)[c(1,3,5,8,10,13)]) + + # Fit models + modPffr <- NULL + ### modPffr <- suppressMessages(do.call(fitModelPffr, args)) + + # do 1000 boosting iterations for model with array structure + args$control <- boost_control(mstop = 1000, nu = 0.1) + # no further search for the optimal mstop + args$optimizeMstop <- FALSE + modMboost <- suppressMessages(do.call(fitModelMboost, args)) + + # do 1000 boosting iterations for model with array structure + args$useArray <- FALSE + modMboost2 <- suppressMessages(do.call(fitModelMboost, args)) + + if(is.null(modMboost)) print(paste("modMboost, set " , theseSettings$set, ", is NULL", sep="")) + + # Calculate errors for both models + resMboost <- try(c(model=2, time=modMboost$runTime, memory=modMboost$memory)) + resMboost2 <- try(c(model=3, time=modMboost2$runTime, memory=modMboost2$memory)) + # cbind(resMboost, resMboost2) + + rm(modMboost); rm(modMboost2); rm(data); rm(args) + + res <- rbind(do.call(data.frame, c(theseSettings, resMboost)), + do.call(data.frame, c(theseSettings, resMboost2))) + + return(res) +} + +########################################################################################### + +################################# +# Function of Fabian "superUtils.R" +expandList <- function(...) { + ## expand.grid for lists + dots <- list(...) + #how many settings per entry + dims <- lapply(dots, length) + #make all combinations of settings + sets <- do.call(expand.grid, lapply(dims, function(x) seq(1:x))) + ret <- apply(sets, 1, function(x) { + l <- list() + for (i in 1:length(x)) l[[i]] <- dots[[i]][[as.numeric(x[i])]] + names(l) <- colnames(sets) + return(l) + }) + for (c in 1:ncol(sets)) sets[, c] <- factor(sets[, c], labels = paste(dots[[colnames(sets)[c]]])) + attr(ret, "settings") <- sets + return(ret) +} + +# make a list containing the settings +makeSettings <- function(...){ + settings <- expandList(...) + seeds <- sample(1e5:3e6, length(settings)) + for(i in 1:length(settings)){ + settings[[i]]$seed <- seeds[i] + settings[[i]]$set <- i + } + return(settings) +} + +# generate colors +alpha <- function(x, alpha=25){ + tmp <- sapply(x, col2rgb) + tmp <- rbind(tmp, rep(alpha, length(x)))/255 + return(apply(tmp, 2, function(x) do.call(rgb, as.list(x)))) +} + +################################# +# Do the iterations over oneRep() +doSim <- function(settings, cores=40){ +# library(plyr) +# +# # only works on Linux -> with try() no error on windows +# try(library(doMC)) +# try(registerDoMC(cores=cores)) + + split <- sample(rep(1:cores, length=length(settings))) + + settingsSplit <- alply(1:cores, 1, function(i) { + settings[split==i] + }) + + ret <- ldply(settingsSplit, function(settings) { + return(ldply(settings, oneRep, .parallel=FALSE)) + }, .parallel=TRUE) + + return(ret) +} + + +# Do the iterations over oneRepPffr() +doSimPffr <- function(settings, cores=40){ + library(plyr) + + # only works on Linux -> with try() no error on windows + try(library(doMC)) + try(registerDoMC(cores=cores)) + + split <- sample(rep(1:cores, length=length(settings))) + + settingsSplit <- alply(1:cores, 1, function(i) { + settings[split==i] + }) + + ret <- ldply(settingsSplit, function(settings) { + return(ldply(settings, oneRepPffr, .parallel=FALSE)) + }, .parallel=TRUE) + + return(ret) +} + +# Do the iterations over fun(), use e.g. oneRepFDboost() or oneRepTime() +# slightly modified doSafeSim() +doSimFDboost <- function(settings, fun){ #, savefile + library(plyr) + + ret <- data.frame() + failed <- list() + + for(s in 1:length(settings)){ + res <- try(do.call(fun, settings[s]), silent = TRUE) + if(any(class(res)=="try-error")){ + cat("\n some of ", s, "failed:\n") + print(do.call(rbind, settings[s])) + failed <- c(failed, settings[s]) + }else{ + ret <- rbind(ret, res) + save(ret, file="savefile.Rdata") + save(ret, file=glue("cpy", "savefile.Rdata")) + cat(format(Sys.time(), "%b %d %X"), ": ", s, " of ", length(settings), "\n") + } + } + #ret <- list(ret=ret, failed=failed) + attr(ret, "failed") <- failed + #save(ret, file=savefile) + #save(ret, file=glue("cpy", savefile)) + return(ret) +} + +## Try function ldply() +#test.list <- list(set1=1:4, set2=5:8, set3=9:12) +#test.fun <- function(l) data.frame(l, x=rep(99,4)) +#test.fun(test.list[[1]]) +#ldply(test.list, test.fun + + +glue <- function(..., collapse = NULL) { + paste(..., sep = "", collapse) +} + + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/analyze_results.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/analyze_results.R new file mode 100644 index 0000000..ba8beb4 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/analyze_results.R @@ -0,0 +1,631 @@ +############################################################################### +# Author: Sarah Brockhaus +# Code inspired by Fabian Scheipl: lfpr3_analysis.R, +# online appendix of paper: +# Scheipl, F., Staicu, A.-M. and Greven, S. (2015). +# Functional Additive Mixed Models. +# Journal of Computational and Graphical Statistics +############################################################################### + +library(ggplot2) +library(plyr) +library(RColorBrewer) + +print("boosting_analysis.R") + +# setwd("../results") +print(getwd()) + +# results FDboost +load("res1.Rdata", verbose=TRUE) +load("res2.Rdata", verbose=TRUE) +load("res3.Rdata", verbose=TRUE) + +res123 <- rbind(res1, res2, res3) +res123[ , c("ONEx..t", "ONEx..tlong", paste0("X", c(1, 10, 2:9)))] <- NA +res123$stabsel <- "no" + +# results FDboost with nuisance and stability selection +load("res1nuisance.Rdata", verbose=TRUE) +load("res2nuisance.Rdata", verbose=TRUE) +load("res3nuisance.Rdata", verbose=TRUE) + +res123n <- rbind(res1n, res2n, res3n) +res123n$stabsel <- "yes" + + +# results FDboost with nuisance but without stability selection +load("res1nu.Rdata", verbose=TRUE) +load("res2nu.Rdata", verbose=TRUE) +load("res3nu.Rdata", verbose=TRUE) + +res123nu <- rbind(res1nu, res2nu, res3nu) +res123nu$stabsel <- "no" + + +# results PFFR +load("pffr1.Rdata", verbose=TRUE) +pffr1 <- pffr1[,-1] +load("pffr2.Rdata", verbose=TRUE) +pffr2 <- pffr2[,-1] +load("pffr3.Rdata", verbose=TRUE) +pffr3 <- pffr3[,-1] + +pffr123 <- rbind(pffr1, pffr2, pffr3) +pffr123[ , c("ONEx..t", "ONEx..tlong", paste0("X", c(1, 10, 2:9)))] <- NA +pffr123$stabsel <- NA + + +######################################################### +## check that columns are the same +all(names(res123)==names(pffr123)) +### merge results without nuisance variables into one data matrix +res <- rbind(res123, pffr123) + +res$mod <- res$model +res$mod[res$inS=="linear"] <- 3 +res$mod <- factor(res$mod, levels=1:2, labels = c("FAMM", "FDboost") ) + +res$typek <- paste(res$type, res$k, sep="-") + +levels_typek <- c("local-5","local-10", + "bsplines-5","bsplines-10", + "end-5","end-10", + #"start-5","start-10", + #"fourier-5", "fourier-10", + #"fourierLin-5", "fourierLin-10", + "lines-0","lines-1","lines-2") + +res$typek <- factor(res$typek, levels=levels_typek) +res$dbeta <- 1 +res$dbeta[res$a=="pen2coef4"] <- 2 +res$dbeta <- factor(res$dbeta) + +res$nuis <- paste( res$nuisance, "nuisance") + +res$penAll <- paste(res$penaltyS, res$diffPen, sep="-") +res$aPen <- 1 +res$aPen[res$a == "pen1coef4s"] <- 2 +res$aPen <- factor(res$aPen) + +#### do a grouping of the relative errors +res$relmsefx1b_grouped <- cut(res$relmsefx1b, breaks = c(0, 0.1, 1, 10, Inf)) +table(res$relmsefx1b_grouped, useNA="ifany") + +res$relmsefx2b_grouped <- cut(res$relmsefx2b, breaks = c(0, 0.1, 1, 10, Inf)) +table(res$relmsefx2b_grouped, useNA="ifany") + + + +######################################################### +### merge results with and without nuisance variables +## check that columns are the same +all(names(res123)==names(res123n)) +all(names(res123)==names(res123nu)) + +### do not use stability selection +resNu <- rbind(res123, res123nu, pffr123) ## , res123n + +resNu$mod <- resNu$model +resNu$mod[resNu$inS=="linear"] <- 3 +resNu$mod <- factor(resNu$mod, levels=1:2, labels = c("FAMM", "FDboost") ) + +resNu$typek <- paste(resNu$type, resNu$k, sep="-") + +levels_typek <- c("local-5","local-10", + "bsplines-5","bsplines-10", + "end-5","end-10", + #"start-5","start-10", + #"fourier-5", "fourier-10", + #"fourierLin-5", "fourierLin-10", + "lines-0","lines-1","lines-2") + +resNu$typek <- factor(resNu$typek, levels=levels_typek) + +resNu$dbeta <- 1 +resNu$dbeta[resNu$a=="pen2coef4"] <- 2 +resNu$dbeta <- factor(resNu$dbeta) + +resNu$nuis <- paste( resNu$nuisance, "nuisance") + + +############################################################################ +### look at estimation errors in the different areas of the coefficient surface +### diffSurface <- true_bst1 - est_bst1 +diffbeta <- res[ ,grepl("diffSurface", names(res))] +res <- res[ ,!grepl("diffSurface", names(res))] + +save(res, file="boosting.Rdata") + + +############################################################################ + +myplot <- function(perc, ...){ + perc <- matrix(perc, ncol=40) + persp(perc, theta=30, phi=30, ticktype="detailed", xlab="\n s", ylab="\n t", zlab="", + nticks=4, ...) +} + + +### estimation is especially bad at the edges +plotSubset <- function(subset, sub=""){ + + mse25 <- apply(diffbeta[subset,]^2, 2, quantile, probs=0.25) + mse50 <- apply(diffbeta[subset,]^2, 2, quantile, probs=0.5) + mse75 <- apply(diffbeta[subset,]^2, 2, quantile, probs=0.75) + mse95 <- apply(diffbeta[subset,]^2, 2, quantile, probs=0.95) + + par(mfrow=c(2,2), mar=c(1, 0, 1, 0), cex=1.5, cex.main=1) + #myplot(mse, main="mean MSE") + #myplot(mse5, main="p5 MSE") + myplot(mse25, main="p25 MSE") + myplot(mse50, main="p50 MSE") + myplot(mse75, main="p75 MSE") + myplot(mse95, main="p95 MSE") + + title(sub=sub, cex.sub=1, line=-2, outer=TRUE) + +} + + +#plotSubset(subset=res$diffPen==1) + +pdf("diffSurfaceM30.pdf", width=10, height=10) +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="lines" & res$k==0, sub="penalty=1, lines-0") +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="lines" & res$k==1, sub="penalty=1, lines-1") +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="lines" & res$k==2, sub="penalty=1, lines-2") + +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="bsplines" & res$k==5, sub="penalty=1, bsplines-5") +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="bsplines" & res$k==10, sub="penalty=1, bsplines-10") + +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="local" & res$k==5, sub="penalty=1, local-5") +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="local" & res$k==10, sub="penalty=1, local-10") + +#plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="start" & res$k==5, sub="penalty=1, start-5") +#plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="start" & res$k==10, sub="penalty=1, start-10") + +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="end" & res$k==5, sub="penalty=1, end-5") +plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="end" & res$k==10, sub="penalty=1, end-10") + +#plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="fourier" & res$k==5, sub="penalty=1, fourier-5") +#plotSubset(subset=res$diffPen==1 & res$M==30 & res$type=="fourier" & res$k==10, sub="penalty=1, fourier-10") +dev.off() + + +############################################################################ +#### look at condition number of D_s +res$logCondDs <- as.numeric(levels(res$logCondDs))[res$logCondDs] +summary(res$logCondDs) +summary(res$logCondDs[is.finite(res$logCondDs)]) + +## for which settings is the condition number finite? +res$logCondDsFinite <- res$logCondDs +res$logCondDsFinite[is.finite(res$logCondDs)] <- 0 +res$logCondDsFinite[!is.finite(res$logCondDs)] <- 1 +## table for % of finite condition numbers per setting +round(with(res, prop.table(table(typek, logCondDsFinite), margin=1))*100, 2) + +res$logCondDs[!is.finite(res$logCondDs)] <- 25 +res$logCondDs_grouped <- cut(res$logCondDs, breaks = c(0, log10(10^6), Inf), right=FALSE) +summary(res$logCondDs_grouped) +plot(res$logCondDs, col=res$type) +abline(h=log10(10^6)) + +res$condNr <- res$logCondDs_grouped + + +#### look at condition number of submatrices +tused <- round((1:27-1)^2/(27-1)^2*15 + 1, 2)[1:26] +namescondNrt <- paste0("logCondDs_hist.", tused ) + +for(i in 1:length(namescondNrt)){ + res[,namescondNrt[i]] <- as.numeric(levels(res[,namescondNrt[i]]))[res[,namescondNrt[i]]] +} + +## look at course of the condition number over t +## only makes sense for setting that have not Inf as condition number anyway +# logCondDsFinite +# typek 0 1 +# local-5 100.00 0.00 +# local-10 100.00 0.00 +# bsplines-5 8.75 91.25 +# bsplines-10 100.00 0.00 +# end-5 0.00 100.00 +# end-10 0.00 100.00 +# lines-0 0.00 100.00 +# lines-1 0.00 100.00 +# lines-2 3.75 96.25 + + +pdf("logCondTime.pdf") +par(mfrow=c(1,1), mar=c(2, 3, 1, 1), cex=2) +for(i in c(1:4,09 )){ + temp <- res[res$typek==levels_typek[i], namescondNrt] + matplot(tused, t(temp), type="l", xlab="t", main=levels_typek[i], + ylab=expression(kappa[j](t)), col=1) + abline(h=6, col=2) + rug(tused, 0.01) +} +dev.off() + +## local-5, local-10 and bsplines-10 show similar behaviour +## local-5, local-10: k_j(t) < 6, for t > 2 +## bsplines-10: k_j(t) < 6, for t > 5 + +## bsplines-5 and lines-2 have a lot of infinite values +## all condition number are > 6 + + +############################################################################ +### look at overlap measures +### use the maximum of the cumulative overlap with 10 parts, successive overlap +namesOverlap <- paste0("cumOverlapKe", 1:27) +for(i in 1:length(namesOverlap)){ + res[,namesOverlap[i]] <- as.numeric(levels(res[,namesOverlap[i]]))[res[,namesOverlap[i]]] +} + +## overlap does not make sense for shrinkage penalty +# summary(res[res$penaltyS=="ps", namesOverlap]) + +tused27 <- round((1:27-1)^2/(27-1)^2*15 + 1, 2) + + +pdf("overlapTime.pdf") +par(mfrow=c(1,1), mar=c(2, 3, 1, 1), cex=2) +# par(mfrow=c(3,3)) +for(i in 1:length(levels_typek)){ + temp <- res[res$typek==levels_typek[i], namesOverlap] + penTemp <- res$diffPen[res$typek==levels_typek[i]] + ## set infinite values to 25 + temp[(as.matrix(temp))==5] <- 3 + matplot(tused27, t(temp)+runif(320*27, min=-0.05, max=0.05), type="l", xlab="t", main=levels_typek[i], + ylab="overlap", col=penTemp, ylim=c(-0.1, 1.5)) + abline(h=1, col=4) + rug(tused, 0.01) + legend("topleft", fill=1:2, title="penalty order", legend=1:2) +} +dev.off() + +res$overlapMaxSuc10 <- suppressWarnings(apply(res[, namesOverlap], 1, max, na.rm=TRUE)) +res$overlapMaxSuc10[(!is.finite(res$overlapMaxSuc10))] <- NA +summary(res$overlapMaxSuc10) +res$overMaxSuc10 <- cut(res$overlapMaxSuc10, breaks = c(0, 1, Inf), right=FALSE) +summary(res$overMaxSuc10) +## maximal kernel overlap is computed in check_ident() as well +all(res$overlapKe == res$overMaxSuc10) + +## NA for local-5, local-10, bslines-10, lines-0, lines-1, lines-2 in combination with pss +## do not look at kernel overlap for pss-penalty, just for ps-penalty! +#table(res$overMaxSuc10, res$penAll, res$typek, useNA="ifany") +table(res$overMaxSuc10, res$penaltyS, useNA="ifany") + +### use the kernel overlap with the design matrix in s-direction, D_s +res[,"overlapKeComplete"] <- as.numeric(levels(res[,"overlapKeComplete"]))[res[,"overlapKeComplete"]] +summary(res$overlapKeComplete) +res$overlapKeComplete <- cut(res$overlapKeComplete, breaks = c(0, 1, Inf), right=FALSE) +summary(res$overlapKeComplete) +table(res$typek, res$overlapKeComplete, res$penaltyS) + +### delete extra overlap-measures +#res <- res[ , !grepl("overlapKe", names(res)) | names(res) == "overlapKeXPbot2"] + +############################################################################ + +## look at range of errors for response +summary(res$relmsey[res$mod=="FAMM"]) +summary(res$relmsey[res$mod=="FDboost"]) + +########## use relmsefx1b +# the correlation between goodness of fit for y and beta is very small +ddply(res, .(mod), summarize, cor.y.beta = cor(relmsey, relmsefx1b, method="spearman")) +ddply(res, .(mod), summarize, cor.y.beta = cor(relmsey, relmsefx2b, method="spearman")) + +ddply(res, .(mod), summarize, cor.y.beta = cor(relmsey, relmsefx1b, method="spearman")) +ddply(res, .(mod), summarize, cor.y.beta = cor(relmsey, relmsefx2b, method="spearman")) + +# compute rank correlation between reliMSE beta and reliMSE Y for each combination +tab <- ddply(res, .(type, k, M, penaltyS, diffPen, model), summarize, + cor.y.beta = cor(relmsey, relmsefx1b, method="spearman")) +tab +#sort(tab$cor.y.beta) + + +############################################################################ +#### mosaicplot for flagged and grouped rel. error + +#### define the variable flagged using overMaxSuc10 +res$flagged <- NA +res$flagged[res$condNr=="[0,6)"] <- 0 +res$flagged[res$condNr=="[6,Inf)"] <- 1 +res$flagged[res$overMaxSuc10=="[1,Inf)" & res$condNr=="[6,Inf)"] <- 2 +res$flagged <- factor(res$flagged, levels=0:2, labels=c("no", "cond" ,"yes")) +## only look at ps penalty!!!! +res$flagged[res$penaltyS=="pss"] <- NA + +table(res$flagged, useNA="always") +with(res[res$penaltyS=="ps", ], table(res$condNr, res$overMaxSuc10, res$flagged, useNA="always")) + + +## & M==30 & mod=="FDboost" & a=="pen1coef4" & penaltyS=="ps" +### Figure 2 +pdf("flagged.pdf", width=11, height=7) +par(mfrow=c(1,1), mar=c(2, 3, 1, 1), cex=2) +tabFlag1 <- with(res[!is.na(res$flagged) & res$M==30 & res$mod=="FDboost" & res$a=="pen1coef4" & res$penaltyS=="ps",], + table(relmsefx1b_grouped, flagged, useNA="ifany")) +mosaicplot(tabFlag1, main="", col=c("white","grey80", "grey60"), xlab=bquote(reliMSE(beta[1]))) +dev.off() + +prop.table(tabFlag1, 2) + + +############################################################################ +## boxplots for goodness of identifiability measures + +### add fake data to res, so that all boxes have the same width and location +### for overMaxSuc10 +temp <- with(res, expand.grid(M=30, mod=unique(mod), a=unique(a), + overMaxSuc10=na.omit(unique(overMaxSuc10)), + #overKeXPbot2=na.omit(unique(overKeXPbot2)), + diffPen=unique(diffPen), condNr=unique(condNr), + typek=unique(typek), penaltyS="ps")) + +## only keep combinations in temp that do not exist in res +tempPaste <- apply(temp, 1, paste, collapse="_", sep="") +resPaste <- apply(res[,c("M","mod","a","overMaxSuc10","diffPen","condNr","typek", "penaltyS")], + 1, paste, collapse="_", sep="") +sum(!tempPaste %in% resPaste) +length(tempPaste) +temp <- temp[!tempPaste %in% resPaste, ] + +temp$penAll <- paste(temp$penaltyS, temp$diffPen, sep="-") + +help <- rbind.fill(res, temp) +help$relmsefx1b[is.na(help$relmsefx1b)] <- 10^8 + +rangefx1 <- range(res$relmsefx1b, na.rm=TRUE) + +with(res[res$penaltyS=="ps", ], table(overMaxSuc10, useNA="ifany")) + +## check for missings in relmsefx1b +summary(res$relmsefx1b) +## as there are no missing values, it is ok to set all missing values to 0.1 + +penalty_names <- list( + '1'="pen 1", + '2'="pen 2" +) + + +help$overMaxSuc10Nice <- "1" +help$overMaxSuc10Nice[help$overMaxSuc10=="[1,Inf)"] <- "2" + +help$overMaxSuc10Nice <- factor(help$overMaxSuc10Nice, levels=1:2, labels=c("<1", ">1")) + +help$d <- factor(help$diffPen, levels=1:2, labels=1:2) # diffPen is penalty order of estimation! + +### delte the impossible combination: true for global kernel overlap!! +help <- help[!(help$condNr == "[0,6)" & help$overMaxSuc10=="[1,Inf)"), ] + +## local-5 and local-10 have maximal kernel overlap>1, but no problem in condition number!! + +## look at condition number and kernel overlap +## do separate plots for condition number< 10^6 and condition number > 10^6 +pdf("condNrOverlap0.pdf", width=5, height=6) +par(mfrow=c(1,1), cex=1.5) +####### use overMaxSuc10 +## do plot for condition number < 10^6 +## typek %in% c("bsplines-10","local-5","local-10" +print(p1 <- ggplot(subset(help, condNr == "[0,6)" & !is.na(overMaxSuc10Nice) & M==30 & + mod=="FDboost" & a=="pen1coef4" & penaltyS=="ps"), + aes(y=relmsefx1b, fill=typek, colour=typek, x=overMaxSuc10Nice)) + # & k>3 + geom_hline(aes(yintercept=0.1)) + + geom_boxplot(outlier.size=.6) + + facet_grid(~penAll) + + scale_y_log10() + + coord_cartesian(ylim = rangefx1) + + scale_fill_manual(name = "", + values=c(brewer.pal(8, "Paired")[c(1:4, 7:8)], brewer.pal(8, "PRGn")[1:3] )) + + scale_colour_manual(name = "", values=c(rep(c("black", "grey60"), 3), rep("grey30", 3)) ) + + labs(title=bquote(kappa[1]<10^6) ) + + ylab(bquote(reliMSE(beta[1]))) + + xlab("kernel overlap") + + scale_x_discrete(labels=c("<1")) + + theme(text=element_text(size = 25, colour=1), plot.title=element_text(size = 25), + axis.text=element_text(size = 20, colour=1)) + + theme(legend.position = "none") # no legend +) +dev.off() + +pdf("condNrOverlap1.pdf", width=11, height=6) # +print(p2 <- ggplot(subset(help, condNr == "[6,Inf)" & !is.na(overMaxSuc10Nice) & M==30 & + mod == "FDboost" & a =="pen1coef4" & penaltyS=="ps"), + aes(y=relmsefx1b, fill=typek, colour=typek, x=overMaxSuc10Nice)) + # & k>3 + geom_hline(aes(yintercept=0.1)) + + geom_boxplot(outlier.size=.6) + + facet_grid(~penAll) + + scale_y_log10() + + coord_cartesian(ylim = rangefx1) + + scale_fill_manual(name = "", + values=c(brewer.pal(8, "Paired")[c(1:4, 7:8)], brewer.pal(8, "PRGn")[1:3] )) + + scale_colour_manual(name = "", values=c(rep(c("black", "grey60"), 3), rep("grey30", 3)) ) + + labs(title=expression(kappa[1]~"">=10^6)) + + ylab("") + + xlab("kernel overlap") + + scale_x_discrete(labels=c("<1", expression("">=1))) + + theme(text=element_text(size = 25, colour=1), plot.title=element_text(size = 25), + axis.text=element_text(size = 20, colour=1), axis.text.y = element_blank()) + + theme(legend.title=element_blank() ) # no legend title +) +dev.off() + +### Create Figure 1 of paper as pdf and as eps +if(FALSE){ + require(gridExtra) + + setEPS() + postscript("Fig1.eps", width=16, height=6) + grid.arrange(p1, p2, ncol=2, widths=c(5, 11)) + dev.off() + + pdf("Fig1.pdf", width=16, height=6) + grid.arrange(p1, p2, ncol=2, widths=c(5, 11)) + dev.off() +} + + + +############################################################################ +### do at plot for the different penalties +with(res, table(typek, condNr, overMaxSuc10)) + +### Figure 3 +# look at different penalties +pdf("penalties.pdf", width=10, height=5) +par(mfrow=c(1,1)) +## order of penalty +print(ggplot(subset(res, !is.na(relmsefx1b) & M==30 & mod=="FDboost"), + aes(y=relmsefx1b, fill=typek, color=typek, x=dbeta)) + + geom_boxplot(outlier.size=.6) + + facet_wrap( ~ penAll, ncol=2) + + scale_y_log10() + + scale_fill_manual(name = "", + values=c(brewer.pal(8, "Paired")[c(1:4, 7:8)], brewer.pal(8, "PRGn")[1:3] )) + + scale_colour_manual(name = "", values=c(rep(c("black", "grey60"), 3), rep("grey30", 3)) ) + + ylab(bquote(reliMSE(beta[1]))) + + xlab(bquote(d[beta])) + + theme(text=element_text(size = 25, colour=1), plot.title=element_text(size = 25), + axis.text=element_text(size = 20, colour=1)) + + geom_hline(aes(yintercept=0.1))) + +## order of penalty +print(ggplot(subset(res, !is.na(relmsefx1b) & M==30 & mod=="FDboost"), + aes(y=relmsefx1b, fill=penAll, color=penAll, x=dbeta)) + + geom_boxplot(outlier.size=.6) + + facet_wrap( ~ typek, ncol=3) + + scale_y_log10() + + scale_fill_manual(name="penalty", values=c("blue", "lightblue", "darkgreen", "lightgreen")) + + scale_colour_manual(name="penalty", values=c("black", "grey40", "black", "grey40")) + + ylab(bquote(reliMSE(beta[1]))) + + xlab(bquote(d[beta])) + + theme(text=element_text(size = 25, colour=1), plot.title=element_text(size = 25), + axis.text=element_text(size = 20, colour=1)) + + geom_hline(aes(yintercept=0.1))) +dev.off() + + +############################################################################ +### do a plot comparing FDboost and pffr without nuisance variables + +### focusing on "best" settings +pdf("reliMSEfx1fbest.pdf", width=10, height=5) +print(ggplot(subset(res, !is.na(relmsefx1b) & !is.na(relmsefx1b & M==30) & penaltyS=="ps" & diffPen==1), + aes(y=relmsefx1b, fill=typek, color=typek, x=dbeta)) + # & k>3 + geom_boxplot(outlier.size=.6) + + facet_wrap( ~ mod, ncol=2) + ## nuisance + scale_y_log10() + + scale_fill_manual(name = "", + values=c(brewer.pal(8, "Paired")[c(1:4, 7:8)], brewer.pal(8, "PRGn")[1:3] )) + + scale_colour_manual(name = "", values=c(rep(c("black", "grey60"), 3), rep("grey30", 3)) ) + + ylab(bquote(reliMSE(beta[1]))) + + xlab(bquote(d[beta])) + + theme(text=element_text(size = 25, colour=1), plot.title=element_text(size = 25), + axis.text=element_text(size = 20, colour=1)) + + geom_hline(aes(yintercept=0.1))) + +dev.off() + + +############################################################################ +### do a plot comparing FDboost and pffr WITH nuisance variables + +### focusing on "best" settings +pdf("reliMSEfx1fbestNuisance.pdf", width=10, height=6) + +print(ggplot(subset(resNu, !is.na(relmsefx1b) & !is.na(relmsefx1b & M==30) & penaltyS=="ps" & diffPen==1), + aes(y=relmsefx1b, fill=typek, color=typek, x=dbeta)) + # & k>3 + geom_boxplot(outlier.size=.6) + + facet_wrap( nuis ~ mod, ncol=2, nrow=2, drop=FALSE) + ## nuisance + scale_y_log10() + + scale_fill_manual(name = "", + values=c(brewer.pal(8, "Paired")[c(1:4, 7:8)], brewer.pal(8, "PRGn")[1:3] )) + + scale_colour_manual(name = "", values=c(rep(c("black", "grey60"), 3), rep("grey30", 3)) ) + + ylab(bquote(reliMSE(beta[1]))) + + xlab(bquote(d[beta])) + + theme(text=element_text(size = 25, colour=1), plot.title=element_text(size = 25), + axis.text=element_text(size = 20, colour=1)) + + geom_hline(aes(yintercept=0.1))) + +dev.off() + + +################ look at results with stability seleciton +table(res123n$X1>0, useNA="ifany")/nrow(res123n) # always selected +table(res123n$X2>0, useNA="ifany")/nrow(res123n) # always selected + +table(res123n$X3>0, useNA="ifany")/nrow(res123n) +table(res123n$X4>0, useNA="ifany")/nrow(res123n) +table(res123n$X5>0, useNA="ifany")/nrow(res123n) +table(res123n$X6>0, useNA="ifany")/nrow(res123n) +table(res123n$X7>0, useNA="ifany")/nrow(res123n) +table(res123n$X8>0, useNA="ifany")/nrow(res123n) +table(res123n$X9>0, useNA="ifany")/nrow(res123n) +table(res123n$X10>0, useNA="ifany")/nrow(res123n) + + + + +################ look at computation time + +# ## use the data containing boosting with and without stability selection +temp123 <- res123[ , c("time.elapsed", "M", "type", "k", "a", "nuisance", "model", "stabsel")] +temp_pffr123 <- pffr123[ , c("time.elapsed", "M", "type", "k", "a", "nuisance", "model", "stabsel")] +temp_pffr123$stabsel <- "no" +temp123n <- res123n[ , c("time.elapsed", "M", "type", "k", "a", "nuisance", "model", "stabsel")] +temp123nu <- res123nu[ , c("time.elapsed", "M", "type", "k", "a", "nuisance", "model", "stabsel")] + +resTime <- rbind(temp123, temp_pffr123, temp123n, temp123nu) + +resTime$mod <- resTime$model +resTime$mod <- factor(resTime$mod, levels=1:2, labels = c("FAMM", "FDboost") ) + +resTime$typek <- paste(resTime$type, resTime$k, sep="-") + +levels_typek <- c("local-5","local-10", + "bsplines-5","bsplines-10", + "end-5","end-10", + #"start-5","start-10", + #"fourier-5", "fourier-10", + #"fourierLin-5", "fourierLin-10", + "lines-0","lines-1","lines-2") + +resTime$typek <- factor(resTime$typek, levels=levels_typek) + +resTime$dbeta <- 1 +resTime$dbeta[resTime$a=="pen2coef4"] <- 2 +resTime$dbeta <- factor(resTime$dbeta) + +resTime$N <- factor(resTime$M) +resTime$nuis <- paste( resTime$nuisance, "nuisance") +resTime$stabsel_plot <- paste0("stability selection: ", resTime$stabsel) + +pdf("computation_time.pdf", width=12, height=5) +print(pt <- ggplot(resTime, + aes(y=time.elapsed, fill=mod, colour=mod, x=mod)) + # & k>3 + geom_boxplot(outlier.size=.6) + + facet_grid(~ nuis + stabsel_plot) + + scale_y_continuous(breaks=c(1, 2, 5, 10, 20, 60, 120, 300, 600, 1200, 2700, + 5400, 10800, 21600, 43200), + trans="log10", + labels=c("1s", "2s", "5s", "10s", "20s", "1 min", "2 min", "5 min", + "10 min", "20 min", "45 min", "90 min", "3h", "6h", "12h")) + + scale_fill_manual(name = "", values=c("white", "grey80")) + + scale_colour_manual(name = "", values=c("grey40", "black")) + + ylab("computation time") + + xlab("estimation algorithm") + + theme(text=element_text(size = 25, colour=1), plot.title=element_text(size = 25), + axis.text=element_text(size = 20, colour=1)) + + theme(legend.title=element_blank() ) # no legend title +) +dev.off() + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/boosting4.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/boosting4.R new file mode 100644 index 0000000..1378547 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/boosting4.R @@ -0,0 +1,1331 @@ +############################################################################### +# changed code of Fabian Scheipl lfpr3.R for data generation and fit of pffr +# Author: Sarah Brockhaus +############################################################################### + + +# source(paste0(getwd(),"/Code/simUtils.R")) +source("simUtils.R") + +### Generate data of different scenarios +### save dataset, formula and some extra information + +# M=12; ni=1; p=0.5; Gy=21; Gx=31; snrEps=5; snrE=0; snrB=1; balanced=TRUE; +# scenario="2"; centerX=TRUE; k=5; type="bsplines"; addNoise=FALSE; nuisance=0 +# a="pen1coef4"; regularS=TRUE; regularT=TRUE; seed=123 + +makeData <- function(M=25, # number of subjects + ni=1, # mean number of observations per subject + p=0.5, # percentage of observations per curve + Gy=30, # maximal number of grid points for t + Gx=55, # number of grid points for s + snrEps=2, # signal-to-noise ratio + snrE=0, # smooth errors per curve E_ij? - currently not used + snrB=1, # relative importance of random effects + balanced=TRUE, # not used + scenario="2", + centerX=TRUE, # center the functional predictor in each s? + k=5, # number of spline bases to simulate the functional variables, c.f. lookatX1.R + type="bsplines", # type of splines, e.g. "local", "start", "end", ... + addNoise=FALSE, # add a small amount of noise to the covariates? + nuisance=0, # number of nuisance variables + a="pen1coef4", # function for coefficient surface + regularS=TRUE, regularT=TRUE, # are s and t regular? + seed=123, + ...){ + + # set df in base learners + df <- 2.24 ## round(sqrt(5), 2) + + dgp1 <- function(){ + stop("No scenario 1 implemented!") + } + + # Scenario with TWO functional covariates + dgp2 <- function(){ + + idvar <- if(balanced){ + gl(M, ni) # generate factor levels + } else { + factor(c(1:M, sample(1:M, M*ni-M, repl=TRUE, prob=sqrt(1:M)))) + } + + # generate time variables with domain 1, ..., 16 + if(regularS){ + s <- seq(0, 1, l=Gx)*15 + 1 + }else{ + s <- (1:Gx-1)^2/(Gx-1)^2*15 + 1 + } + + if(regularT){ + t <- seq(0, 1, l=Gy)*15 + 1 + }else{ + t <- (1:Gy-1)^2/(Gy-1)^2*15 + 1 + } + + tgrid <- sgrid <- seq(1, 16, l=40) + + # Intercept + int <- matrix(intf1(t), nrow=ni*M, ncol=Gy, byrow=TRUE) + + # Functional covariates + #X1 <- t(replicate(M*ni, (3*s-2))) + rnorm(M*ni) + rnorm(M*ni*Gx, mean=0, sd=0.01) + #set.seed(seed + 23) + X1 <- t(replicate(M*ni, rf2(s, k=k, type=type))) + if(centerX) X1 <- sweep(X1, 2, apply(X1, 2, mean)) + L <- integrationWeightsLeft(X1=X1, xind=s) # Riemann integration weights + #betast_1 <- outer(s, t, test3, a1=a1, a2=a2, a3=a3, a4=a4) + betast_1 <- get(a)(s, t, coef=NULL) + X1f <- (L*X1)%*%betast_1 + if(addNoise){ + X1 <- X1 + sd(as.vector(X1))/20*matrix(scale(rnorm(M*ni*Gx)), nrow=M*ni, ncol=Gx) + } + + #X2 <- t(replicate(M*ni, (rnorm(1, sd=2)*s-2))) + rnorm(M*ni, sd=0.1) + rnorm(M*ni*Gx, mean=0, sd=0.01) + #set.seed(seed + 2233) + X2 <- t(replicate(M*ni, rf2(s, k=k, type=type))) + if(centerX) X2 <- sweep(X2, 2, apply(X2, 2, mean)) + L <- integrationWeightsLeft(X1=X2, xind=s) # Riemann integration weights + #betast_2 <- outer(s, t, test3, a1=a1, a2=a2, a3=a3, a4=a4) + betast_2 <- get(a)(s, t, coef=NULL) + X2f <- (L*X2)%*%betast_2 + if(addNoise){ + X2 <- X2 + sd(as.vector(X2))/20*matrix(scale(rnorm(M*ni*Gx)), nrow=M*ni, ncol=Gx) + } + + # Compute response + Ytrue <- int + X1f + X2f + Y <- Ytrue + sd(as.vector(Ytrue))/snrEps * matrix(scale(rnorm(M*ni*Gy)), + nrow=M*ni, ncol=Gy) + true_g0 <- intf1(tgrid) + true_bst1 <- get(a)(sgrid, tgrid, coef=attr(betast_1, "coef")) + true_bst2 <- get(a)(sgrid, tgrid, coef=attr(betast_2, "coef")) + #true_bst1 <- outer(sgrid, tgrid, test3, a1=a1, a2=a2, a3=a3, a4=a4) + #true_bst2 <- outer(sgrid, tgrid, test3, a1=a1, a2=a2, a3=a3, a4=a4) + + ## response in long format + temp <- data.frame(Ylong=as.vector(t(Y)), Ytruelong=as.vector(t(Ytrue)), + X1flong=as.vector(t(X1f)), X2flong=as.vector(t(X2f)), + tlong=rep(t, times=M*ni), id=rep(1:(M*ni), each=Gy)) + + # delete part of observations to obtain irregular observations in long format + if(p<1){ + ########## delete proportion p of the observations + #with(temp, funplot(tvec, Yvec, id)) + temp <- temp[ sort( sample(1:(M*ni*Gy), round(p*M*ni*Gy)) ), ] + #with(temp, funplot(tvec, Yvec, id)) + #table(temp$id) + } + + + data <- list(Ylong=temp$Ylong, Ytruelong=temp$Ytruelong, tlong=temp$tlong, id=temp$id, + idvar=idvar, + Y=Y, X1=X1, X2=X2, + s=s, t=t, + Ytrue=I(Ytrue), int=int, X1f=X1f, X2f=X2f, + true_g0=true_g0, true_bst1=true_bst1, true_bst2=true_bst2, + X1flong=temp$X1flong, X2flong=temp$X2flong) + + ## add nuisance variables + if(nuisance>0){ + nuVars <- vector("list", nuisance) + for(i in 1:nuisance){ + nuVars[[i]] <- t(replicate(M*ni, rf2(s, k=k, type=type))) + if(centerX) nuVars[[i]] <- sweep(nuVars[[i]], 2, apply(nuVars[[i]], 2, mean)) + if(addNoise){ + nuVars[[i]] <- nuVars[[i]] + sd(as.vector(nuVars[[i]]))/ + 20*matrix(scale(rnorm(M*ni*Gx)), nrow=M*ni, ncol=Gx) + } + } + names(nuVars) <- paste0("X", 1:nuisance+2) + + data <- c(data, nuVars) + } + + return(data) + } + + #### generate data + data <- switch(scenario, + "1" = dgp1(), + "2" = dgp2()) + + formulaPffr <- switch(scenario, + "1" = "dummy", + "2" = paste0("ff(X", 1:(nuisance+2),", xind=s, limits=\"s<=t\", integration=\"riemann\", check.ident=FALSE, splinepars=list(bs = penaltyS, k=9, m = list(c(2, diffPen), c(2, diffPen))))", + collapse=" + ")) + + # add response and do formula + formulaPffr <- as.formula(paste("Y ~ ", formulaPffr)) + + + ### Formula for call to FDboost() + # arginS <- paste("\"smooth\"") + formulaFDboost <- switch(scenario, + "1" = "dummy", + "2" = paste0("bhist(X", 1:(nuisance+2),", s, t, df=", df*df, ", knots=5, inS=arginS, penalty=penaltyS, differences = diffPen, check.ident=FALSE)", + collapse=" + ")) + formulaFDboost <- as.formula(paste("Y ~ 1 + ", formulaFDboost)) + + + timeformula <- formula(paste("~ bbs(t, knots=5, df=", df, ")", sep="")) + + ### Formula for call to FDboost() in long format + formulaFDboostLong <- switch(scenario, + "1" = "dummy", + "2" = paste0("bhist(X", 1:(nuisance+2),", s, tlong, df=", df*df, ", knots=5, inS=arginS, penalty=penaltyS, differences = diffPen, check.ident=FALSE)", + collapse=" + ")) + + formulaFDboostLong <- as.formula(paste("Ylong ~ 1 + ", formulaFDboostLong)) + + + timeformulaLong <- formula(paste("~ bbs(tlong, knots=5, df=", df, ", differences = 1)", sep="")) + + namesVariables <- switch(scenario, + "1" = NULL, + "2" = c("Int", paste("X", 1:(nuisance+2), sep=""))) + + namesVariables <- c(namesVariables, attr(data, "namesVariables")) + + return(structure(data, + sigmaEps = sd(as.vector(data$Ytrue))/snrEps, + formulaPffr=formulaPffr, + formulaFDboost=formulaFDboost, + timeformula=timeformula, + formulaFDboostLong=formulaFDboostLong, + timeformulaLong=timeformulaLong, + namesVariables=namesVariables, + call=match.call())) +} + +if(FALSE){ + data2 <- makeData(scenario="2", seed=14) # , M=100, Gx=30, Gy=30 +} + + +### Fit model using pffr() of package refund using the data and information of data from makeData() +fitModelPffr <- function(data, + ...){ + + formula <- as.formula(attr(data, "formulaPffr")) + t <- data$t + + time <- system.time( + m <- try(pffr(eval(formula), yind=t, data=data)) + )[3] + + rm(data) + + if(any(class(m) != "try-error")){ + m$runTime <- time + m$long <- FALSE + return(m) + }else return(NULL) +} + +if(FALSE){ + m2 <- fitModelPffr(data2) +} + + +### Fit irregular model using pffr() +fitModelPffrLong <- function(data, + ...){ + + formula <- as.formula(attr(data, "formulaPffr")) + + # save necessary data + ydata <- data.frame(.obs=data$id, .index=data$tlong, .value=data$Ylong) + + data1 <- data.frame(lapply(data[c(attr(data, "namesVariables")[-1])], I)) + tlong <<- data$tlong + s <<- data$s + + time <- system.time( + m <- try(pffr(eval(formula), yind=tlong, data=data1, ydata=ydata)) + )[3] + + rm(data1) + + if(any(class(m) != "try-error")){ + m$runTime <- time + m$long <- TRUE + return(m) + }else return(NULL) +} + +if(FALSE){ + m2 <- fitModelPffrLong(data2) +} + + +### Fit model using FDboost() that is based on package mboost +fitModelMboost <- function(data, + control=boost_control(mstop=100, nu=0.1), # settings of mboost + grid=seq(10, 100, by=10), + m_max=2000, + nuisance=0, + ...){ + + formula <- attr(data, "formulaFDboost") + timeformula <- attr(data, "timeformula") + + time <- system.time({ + m <- try(FDboost(eval(formula), timeformula = timeformula, data=data, + control=control, numInt="Riemann", + offset=NULL, offset_control=o_control(k_min=10))) + + + ################################################################## + # do stability selection + if(doStabsel && nuisance>0 & length(m$baselearner) > 5){ + + mAll <- m[1] # save model with all baselearners + + # fix the cutoff at 0.9 and the PFER at 1 + print(stabsel_parameters(p=length(m$baselearner), PFER=0.1*length(m$baselearner), cutoff=0.9, + sampling.type="SS")) + + folds0 <- cvLong(id=m$id, weights=model.weights(m), B=50, type="subsampling") + + m[200] + #table(selected(m)) + + if(Sys.info()["sysname"]=="Linux"){ + stab1 <- try(stabsel(m, cutoff=0.9, PFER=0.1*length(m$baselearner), + folds=folds0, sampling.type="SS", mc.cores=10)) + }else{ # Windows + stab1 <- try(stabsel(m, cutoff=0.9, PFER=0.1*length(m$baselearner), + folds=folds0, sampling.type="SS")) + } + + #if(grepl("stabsel", as.character(warnings()))) print("stab1: INCREASE mstop!!!") + + print(stab1$selected) + + ## Function to obtain effects of original formula + shortnames2 <- function(x){ + if(substr(x,1,1)=="\"") x <- substr(x, 2, nchar(x)-1) + + sign <- "%O%" + if( !grepl(sign, x) ) sign <- "%X%" + + xpart <- unlist(strsplit(x, sign)) + for(i in 1:length(xpart)){ + xpart[i] <- gsub("\\\"", "'", xpart[i], fixed=TRUE) + commaSep <- unlist(strsplit(xpart[i], ",")) + xpart[i] <- paste(paste(commaSep[!grepl("index", commaSep)], collapse=","), sep="") + } + ret <- xpart + if(length(xpart)>1) ret <- xpart[1] + ret + } + + # create a new formula containing only selected effects + newForm <- formula(paste("Y ~ 1 + ", paste(lapply(names(m$baselearner)[stab1$selected], shortnames2), + collapse=" + "))) + print(newForm) + + # fit the model with the effects selected by stabsel + m <- try(FDboost(newForm, timeformula=timeformula, + data=data, control=control, numInt="Riemann", + offset=NULL, offset_control=o_control(k_min=10))) + + #summary(m) + attr(m, "mAll") <- mAll + } + + + ################################################################## + # search for optimal stopping iteration + if(any(class(m)=="FDboost")){ + + # set up two different splittings of the data + set.seed(attr(data, "call")$seed) + folds1 <- cvMa(ydim=m$ydim, type="bootstrap", B=10) + + set.seed(attr(data, "call")$seed + 100) + folds2 <- cvMa(ydim=m$ydim, type="bootstrap", B=10) + + # cvm <- try(suppressMessages(cvrisk(m, papply = lapply, grid=grid))) + if(Sys.info()["sysname"]=="Linux"){ # use 10 cores on Linux + suppressWarnings(cvm <- try(cvrisk(m, folds = folds1, grid=grid, mc.cores=10), silent=TRUE)) + }else cvm <- try(cvrisk(m, folds = folds1, grid=grid)) + + # Try for a second time if cvrisk() stops with error + if(class(cvm)!="cvrisk"){ + if(Sys.info()["sysname"]=="Linux"){ + suppressWarnings(cvm <- try(cvrisk(m, folds = folds2, grid=grid, mc.cores=10), silent=TRUE)) + }else cvm <- try(cvrisk(m, folds = folds2, grid=grid)) + cat(paste("2nd calculation of cvrisk, class(cvm) =", class(cvm), "\n", sep=" ")) + } + # print(max(grid)) + # plot(cvm) + }else cvm <- NULL + })[3] + + if(any(class(m)=="FDboost") & class(cvm)=="cvrisk"){ + print(mstop(cvm)) + m <- m[mstop(cvm)] + m$runTime <- time + m$long <- FALSE + return(m) + }else return(NULL) +} + +if(FALSE){ + m2m <- fitModelMboost(data2, m_max=500) +} + + +### Fit model to data in long format +fitModelMboostLong <- function(data, + control=boost_control(mstop=100, nu=0.1), # settings of mboost + grid=seq(10, 100, by=10), + m_max=2500, + nuisance=0, + ...){ + + #scenario <- attr(data, "call")$scenario + formula <- attr(data, "formulaFDboostLong") + timeformula <- attr(data, "timeformulaLong") + + # m <- FDboost(Ylong ~ 1 + bhist(X1, s, tlong, df = 5.0625) + bhist(X2, s, tlong, df = 5.0625), + # timeformula=~bbs(tlong, knots = 10, df = 2.25), + # id=data$id, data=data) + + time <- system.time({ + m <- try(FDboost(eval(formula), timeformula = timeformula, id=~id, + data=data, control=control, numInt="Riemann", + offset=NULL, offset_control=o_control(k_min=10))) + + + ################################################################## + # do stability selection + if(doStabsel && nuisance>0 & length(m$baselearner) > 5){ + + mAll <- m[1] # save model with all baselearners + + # fix the cutoff at 0.9 and the PFER at 1 + print(stabsel_parameters(p=length(m$baselearner), PFER=0.1*length(m$baselearner), cutoff=0.9, + sampling.type="SS")) + + folds0 <- cvLong(id=m$id, weights=model.weights(m), B=50, type="subsampling") + + m[200] + #table(selected(m)) + + if(Sys.info()["sysname"]=="Linux"){ + stab1 <- try(stabsel(m, cutoff=0.9, PFER=0.1*length(m$baselearner), + folds=folds0, sampling.type="SS", mc.cores=10)) + }else{ # Windows + stab1 <- try(stabsel(m, cutoff=0.9, PFER=0.1*length(m$baselearner), + folds=folds0, sampling.type="SS")) + } + + #if(grepl("stabsel", as.character(warnings()))) print("stab1: INCREASE mstop!!!") + print(stab1$selected) + + ## Function to obtain effects of original formula + shortnames2 <- function(x){ + if(substr(x,1,1)=="\"") x <- substr(x, 2, nchar(x)-1) + + sign <- "%O%" + if( !grepl(sign, x) ) sign <- "%X%" + + xpart <- unlist(strsplit(x, sign)) + for(i in 1:length(xpart)){ + xpart[i] <- gsub("\\\"", "'", xpart[i], fixed=TRUE) + commaSep <- unlist(strsplit(xpart[i], ",")) + xpart[i] <- paste(paste(commaSep[!grepl("index", commaSep)], collapse=","), sep="") + } + ret <- xpart + if(length(xpart)>1) ret <- xpart[1] + ret + } + + # create a new formula containing only selected effects + newForm <- formula(paste("Ylong ~ 1 + ", + paste(lapply(names(m$baselearner)[stab1$selected], shortnames2), + collapse=" + "))) + + print(newForm) + + # fit the model with the effects selected by stabsel + m <- try(FDboost(newForm, timeformula=timeformula, id=~id, + data=data, control=control, numInt="Riemann", + offset=NULL, offset_control=o_control(k_min=10))) + #summary(m) + attr(m, "mAll") <- mAll + } + + + ################################################################## + # search for optimal stopping iteration + if(any(class(m)=="FDboost")){ + + # set up two different splittings of the data + set.seed(attr(data, "call")$seed) + folds1 <- cvLong(id=m$id, weights=model.weights(m), type="bootstrap", B=10) + + set.seed(attr(data, "call")$seed + 100) + folds2 <- cvLong(id=m$id, weights=model.weights(m), type="bootstrap", B=10) + + # cvm <- try(suppressMessages(cvrisk(m, papply = lapply, grid=grid))) + if(Sys.info()["sysname"]=="Linux"){ # use 10 cores on Linux + # results are not the same as in validateFDboost the offset is refitted + # in cvrisk the smooth offset of the model with all data is used + suppressWarnings(cvm <- try(cvrisk(m, folds = folds1, grid=grid, mc.cores=10), silent=TRUE)) + #cvm2 <- try(validateFDboost(m, folds = folds1, grid=grid, + # getCoefCV=FALSE, mc.cores=10), silent=TRUE) + }else suppressWarnings(cvm <- try(cvrisk(m, folds = folds1, grid=grid))) + + # Try for a second time if cvrisk() stops with error + if(class(cvm)!="cvrisk"){ + if(Sys.info()["sysname"]=="Linux"){ + cvm <- try(cvrisk(m, folds = folds2, grid=grid, mc.cores=10), silent=TRUE) + }else cvm <- try(cvrisk(m, folds = folds2, grid=grid)) + cat(paste("2nd calculation of cvrisk, class(cvm) =", class(cvm), "\n", sep=" ")) + } + + #print(max(grid)) + # plot(cvm) + }else cvm <- NULL + })[3] + + if(any(class(m)=="FDboost") & class(cvm)=="cvrisk"){ + print(mstop(cvm)) + m <- m[mstop(cvm)] + m$runTime <- time + m$long <- TRUE + return(m) + }else return(NULL) +} + +if(FALSE){ + m2m <- fitModelMboostLong(data2, m_max=200) +} + + + +### calculate some errors/ measures for goodness of fit of the model +getErrors <- function(data, m=NULL, plotModel=FALSE){ + + scenario <- attr(data, "call")$scenario + + # In case that model was not fitted: m=NULL + errorE <- c(msey=NA, mseg0=NA, + msefx1=NA, msefx2=NA, + msefx1f=NA, msefx2f=NA, + msefz1=NA + ) + relerrorE <- errorE + names(relerrorE) <- paste("rel", names(errorE), sep="") + relerrorE[["relmsefx1b"]] <- NA + relerrorE[["relmsefx2b"]] <- NA + + ret <- as.list(c(errorE, relerrorE, #relmseyT=NA, + funRsqrt=NA, mstop=NA, time.elapsed=NA, long=NA)) + + if(is.null(m)) return(ret) + + classM <- class(m)[1] + + # Save number of iterations + mstop <- switch(classM, + "pffr" = NA, + "FDboost" = mstop(m), + "FDboostLong" = mstop(m), + "NULL" = NA) + + + # function to predict each component of linear predictor separately for FDboost() and pffr() + # intercept =TRUE indicates that the first variable is an intercept + # to which the offset should be added + + predictComponents <- function(object, intercept=TRUE){ + fit <- NULL + if(any(class(object)=="FDboost")){ + fit <- predict(object=object, which=1:length(object$baselearner)) + if(any(class(object)=="FDboostLong")){ + if(intercept) fit[,1] <- fit[,1] + object$offset # add offset + }else{ + if(intercept) fit[[1]] <- fit[[1]] + object$offset # add offset + } + }else{ + fit <- predict(object=object, type="terms") + if(intercept) fit[[1]] <- fit[[1]] + coef(object, se=FALSE, seWithMean=FALSE)$pterms[1] # add global constan intercept + } + return(fit) + } + + # Perdiciton for pffr or FDboost, each effect separately + fit <- switch(classM, + "pffr" = predictComponents(m), + "FDboost" = predictComponents(m), + "FDboostLong" = predictComponents(m), + "NULL" = NULL) + + # prediction of all effects together + yhat <- switch(classM, + "pffr" = if(m$long) fitted(m)$.value else fitted(m), + "FDboost" = predict(m), + "FDboostLong" = predict(m), + "NULL" = NULL) + + ############### Calculate errors of estimated coefficients directly on coefficients + if(any(class(m)=="pffr")){ + cm <- coef(m, se=FALSE, seWithMean=FALSE, n1=40) + + # functional intercept g0 + if(scenario %in% c("2")){ + est_g0 <- drop(cm$smterms[[1]]$value) + cm$pterms[1] + true_g0 <- data$true_g0 + } else{ + est_g0 <- true_g0 <- NA + } + + #plot(true_g0, col=2, ylim=range(true_g0, est_g0)); points(est_g0) + #mean((est_g0-true_g0)^2) + + if(scenario %in% c("1")){ + true_fz1 <- data$true_fz1 + est_fz1 <- t(cbind(cm$smterms[[1]]$value + cm$pterms[1], + cm$smterms[[2]]$value + cm$pterms[2], + cm$smterms[[3]]$value + cm$pterms[3])) + }else est_fz1 <- true_fz1 <- NA + # funplot(seq(0,1,l=40), (true_fz1), ylim=range(true_fz1, est_fz1)) + # funplot(seq(0,1,l=40), (est_fz1), ylim=range(true_fz1, est_fz1), lwd=1.5, add=TRUE) + + ### funciton to set lower triangular to 0 or NA + lowerTo <- function(x, repl=0){ + stopifnot(ncol(x)==nrow(x)) + #x*outer(1:ncol(x), 1:nrow(x), "<=") # gives the same if repl=0 + x[ outer(1:ncol(x), 1:nrow(x), "<=")==FALSE] <- repl + x + } + + true_bst1 <- est_bst1 <- true_bst2 <- est_bst2 <- NA #<- true_bst3 <- est_bst3 <- true_bst4 <- est_bst4 <- NA + if(scenario %in% c("1", "2")){ + whereX1 <- if(scenario %in% c("1")) 4 else 2 # 1 intercept, 2-4 z1 + true_bst1 <- data$true_bst1 + est_bst1 <- lowerTo(matrix(drop(cm$smterms[[whereX1]]$value), ncol=40)) + if(scenario %in% c("2")){ + true_bst2 <- data$true_bst2 + est_bst2 <- lowerTo(matrix(drop(cm$smterms[[3]]$value), ncol=40)) + } + } + # par(mfrow=c(1,2)) + # persp(seq(0,1,l=40), seq(0,1,l=40), true_bst1, zlim=range(true_bst1, est_bst1), theta=30, ticktype="detailed") + # persp(seq(0,1,l=40), seq(0,1,l=40), est_bst1, zlim=range(true_bst1, est_bst1), theta=30, ticktype="detailed") + # persp(seq(0,1,l=40), seq(0,1,l=40), true_bst2, zlim=range(true_bst2, est_bst2), theta=30, ticktype="detailed") + # persp(seq(0,1,l=40), seq(0,1,l=40), est_bst2, zlim=range(true_bst2, est_bst2), theta=30, ticktype="detailed") + + ## get estimated effects + if(scenario %in% c("2")){ + if(get("p", environment(attr(data, "timeformula"))) < 1){ # irregualr response + true_x1f <- data$X1flong + true_x2f <- data$X2flong + est_x1f <- fit[[2]]$.value + est_x2f <- fit[[3]]$.value + }else{ # regualr response + true_x1f <- data$X1f + true_x2f <- data$X2f + est_x1f <- fit[[2]] + est_x2f <- fit[[3]] + } + }else{ + true_x1f <- true_x2f <- est_x1f <- est_x2f <- NA + } + + } + + ################ Calculate errors of estimated coefficients directly on coefficients + if(any(class(m)=="FDboost")){ + + ## compute coefficients + cm <- coef(m, which=1:3) + + if(scenario %in% c("2")){ + # functional intercept g0 + est_g0 <- drop(cm$smterms[[1]]$value) + cm$offset$value + true_g0 <- data$true_g0 + # tgrid <- seq(0,1,l=40) + # plot(true_g0 ~ tgrid, col=2, ylim=range(true_g0, est_g0)); points(est_g0~tgrid) + # mean((est_g0-true_g0)^2) + }else{ + est_g0 <- true_g0 <- NA + } + + est_fz1 <- true_fz1 <- NA + + true_bst1 <- est_bst1 <- true_bst2 <- est_bst2 <- NA #<- true_bst3 <- est_bst3 <- true_bst4 <- est_bst4 <- NA + if(scenario == "2"){ + whereX1 <- if(scenario %in% c("1")) 3 else 2 + true_bst1 <- data$true_bst1 + est_bst1 <- matrix(cm$smterms[[whereX1]]$value, ncol=40, nrow=40) + if(scenario %in% c("2")){ + true_bst2 <- data$true_bst2 + est_bst2 <- matrix(cm$smterms[[3]]$value, ncol=40, nrow=40) + true_bst3 <- data$true_bst3 + } + } + # par(mfrow=c(1,2)) + # persp(seq(0,1,l=40), seq(0,1,l=40), true_bst1, zlim=range(true_bst1, est_bst1), theta=30, ticktype="detailed") + # persp(seq(0,1,l=40), seq(0,1,l=40), est_bst1, zlim=range(true_bst1, est_bst1), theta=30, ticktype="detailed") + # persp(seq(0,1,l=40), seq(0,1,l=40), true_bst2, zlim=range(true_bst2, est_bst2), theta=30, ticktype="detailed") + # persp(seq(0,1,l=40), seq(0,1,l=40), est_bst2, zlim=range(true_bst2, est_bst2), theta=30, ticktype="detailed") + + ## get estimated effects + if(scenario %in% c("2")){ + if(get("p", environment(attr(data, "timeformula"))) < 1){ # irregular response + true_x1f <- data$X1flong + true_x2f <- data$X2flong + est_x1f <- fit[,2] + est_x2f <- fit[,3] + }else{ # regular response + true_x1f <- data$X1f + true_x2f <- data$X2f + est_x1f <- fit[[2]] + est_x2f <- fit[[3]] + } + }else{ + true_x1f <- true_x2f <- est_x1f <- est_x2f <- NA + } + + + } + + # Calculate MSE + calcError <- function(x, xhat){ + if((length(x)==1 & is.na(x[1]))|(length(xhat)==1 & is.na(xhat[1]))){ + return(NA) + }else{ + mean((x - xhat)^2) + } + } + + ## only look at part of coefficient surface that was really fitted: + limits <- function(s, t) { + (s < t) + } + sgrid <- cm$smterms[[2]]$x + tgrid <- cm$smterms[[2]]$y + ind0 <- !t(outer( sgrid, tgrid, limits) ) + + errorE <- c(msey = if(m$long) calcError(data$Ytruelong, yhat) else calcError(data$Ytrue, yhat), + mseg0 = calcError(true_g0, est_g0), + msefx1 = calcError(true_bst1[ind0], est_bst1[ind0]), + msefx2 = calcError(true_bst2[ind0], est_bst2[ind0]), + msefx1f= calcError(true_x1f, est_x1f), + msefx2f= calcError(true_x2f, est_x2f), + msefz1 = calcError(true_fz1, est_fz1)) + + ### look at the error for each place of beta + diffSurface <- true_bst1 - est_bst1 + + # calculate irMSE that is the MSE standardized by the global variance + relcalcError <- function(x, xhat){ + if((length(x)==1 & is.na(x[1]))|(length(xhat)==1 & is.na(xhat[1]))) return(NA) + stopifnot(dim(x)==dim(xhat)) + + # Calculation like functional R^2 - standardize with global mu + mu <- mean(x) + stand <- mean((x-mu)^2) + if (stand==0){ + warning("Error is scaled by sigmaEps") + stand <- attr(data, "sigmaEps") + } + # Standardize with global "variability" + err <- mean( (x-xhat)^2) / stand + return(err) + } + + relerrorE <- c(msey = if(m$long) relcalcError(data$Ytruelong, yhat) else relcalcError(data$Ytrue, yhat), + mseg0 = relcalcError(true_g0, est_g0), + msefx1 = relcalcError(true_bst1[ind0], est_bst1[ind0]), + msefx2 = relcalcError(true_bst2[ind0], est_bst2[ind0]), + msefx1f= relcalcError(true_x1f, est_x1f), + msefx2f= relcalcError(true_x2f, est_x2f), + msefz1 = relcalcError(true_fz1, est_fz1)) + + names(relerrorE) <- paste("rel", names(errorE), sep="") + + ### compute relativeMSE as in identifiability paper: + relerrorE[["relmsefx1b"]] <- mean((est_bst1[ind0] - true_bst1[ind0])^2)/mean(true_bst1[ind0]^2) + relerrorE[["relmsefx2b"]] <- mean((est_bst2[ind0] - true_bst2[ind0])^2)/mean(true_bst2[ind0]^2) + + + # return list with errors and relative errors + ret <- as.list(c(errorE, relerrorE, + mstop=mstop, time=m$runTime, diffSurface = c(diffSurface))) + + # Save information for plotting + if(plotModel==TRUE){ + est <- list(Ytrue=data$Ytrue, Ytruelong=data$Ytruelong, id=data$id, + yhat=yhat, + true_g0=true_g0, est_g0=est_g0, + true_bst1=true_bst1, est_bst1=est_bst1, + true_bst2=true_bst2, est_bst2=est_bst2, + true_fz1=true_fz1, est_fz1=est_fz1) + attr(ret, "est") <- est + } + + ret$long <- if(m$long) TRUE else FALSE + + return(ret) +} + +if(FALSE){ + eNULL <- getErrors(NULL, NULL) + length(eNULL) + e2 <- getErrors(data2, m2) #, plotModel=TRUE + length(e2) + #cbind(eNULL, e2) +} + +#true_fz2, est_fz2 + +if(FALSE){ + e2m <- getErrors(data2, m2m) #, plotModel=TRUE + cbind(e2, e2m) +} + + +# function to plot true values, estimates of FDboost and estimates of pffr +# depends on results of function getErrors() +# use only a subset of 10 observations for plotting them as example +plotModel <- function(err, errB=NULL, data, theseSettings, + subset=sample(1:theseSettings$M, size=10)){ + + ### funciton to set lower triangular to 0 or NA + lowerTo <- function(x, repl=0){ + stopifnot(ncol(x)==nrow(x)) + #x*outer(1:ncol(x), 1:nrow(x), "<=") # gives the same if repl=0 + x[ outer(1:ncol(x), 1:nrow(x), "<=")==FALSE] <- repl + x + } + + est <- attr(err, "est") + estB <- attr(errB, "est") + + model <- "pffr" + modelB <- "mboost" + + # set errors to NULL if no model was fitted + if(sum(is.na(err))==length(err)) err <- NULL + if(sum(is.na(errB))==length(errB)) errB <- NULL + + # Plot nothing if none of the models could be fitted + if(is.null(err) & is.null(errB)){ + return(NULL) + } + + settingString <- paste(names(theseSettings), unlist(theseSettings), sep=":") + settingString <- paste(settingString[names(theseSettings) %in% c("a1","a2","a3","M","k")], collapse=" ") + #opar <- par() + #on.exit(try(par(opar), silent=TRUE)) + + par(xpd=TRUE, mar=par()$mar/2) + + #clrs <- try(alpha(rainbow(theseSettings$M), 4 * 255/ (length(unique(data$id))/5) ), silent=TRUE ) + + #clrs <- alpha(rainbow(theseSettings$M), 4*255/(min(theseSettings$M, 40)/5)) + clrs <- alpha( rainbow(length(subset)), 200 ) + if(class(clrs)=="try-error") clrs <- rainbow(theseSettings$M) + + # plotIntercept <- function(m=m, mb=mb, fit=fit, fitB=fitB, errors=errors, errorsB=errorsB, data=data){ + plotIntercept <- function(){ + range <- range(est$est_g0, estB$est_g0, data$true_g0) + plot(data$true_g0, main=bquote(beta[0](t)), xlab="", ylab="", xaxt="n", ylim=range, type="l") + if(!is.null(err)){ + plot(est$est_g0, xlab="", ylab="", xaxt="n", ylim=range, type="l", + main=bquote(paste("FAMM: ", hat(beta)[0](t), ": reliMSE", phantom(x)%~~% .(round(err$relmseg0, 4))))) + } + if(!is.null(errB)){ + plot(estB$est_g0, xlab="", ylab="", xaxt="n", ylim=range, type="l", + main=bquote(paste("FDboost: ", hat(beta)[0](t), ": reliMSE", phantom(x)%~~% .(round(errB$relmseg0, 4))))) + } + } + + twoModels <- !( is.null(errB)|is.null(err) ) + + layout(matrix(1:(10+5*twoModels), ncol=2+1*twoModels, byrow=TRUE)) + + # plot the intercept + if(theseSettings$scenario %in% c("2")) plotIntercept() + + # If pffr was not fitted but FDboost was, then change err and errB + if(is.null(err) & !is.null(errB)){ + err <- errB + est <- estB + errB <- NULL + estB <- NULL + model <- modelB + } + + # Plot \beta_1(s,t) + if(theseSettings$scenario %in% c("1","2")){ + tgrid <- seq(0,1, l=40) + sgrid <- seq(0,1, l=40) + # Only plot part of the points -> grid is visible + k=(2*1:20) + #k=1:40 + range <- range(lowerTo(est$est_bst1, NA), lowerTo(estB$est_bst1, NA), lowerTo(est$true_bst1, NA), na.rm=TRUE) + persp(tgrid[k], sgrid[k], z=lowerTo(est$true_bst1[k,k], NA), theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(beta[1](s,t)))) + persp(tgrid[k], sgrid[k], lowerTo(est$est_bst1[k,k], NA), theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta)[1](s,t), ": reliMSE", phantom(x)%~~% .(round(err$relmsefx1b, 4))))) + if(!is.null(errB)){ + persp(tgrid[k], sgrid[k], lowerTo(estB$est_bst1[k,k], NA), theta=30, phi=30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta)[1](s,t), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefx1b, 4))))) + } + } + + # Plot \beta_2(s,t), \beta_3(s,t), \beta_4(s,t) + if(theseSettings$scenario %in% c("2")){ + tgrid <- seq(0,1, l=40) + sgrid <- seq(0,1, l=40) + # Only plot part of the points -> grid is visible + k=(2*1:20) + #k=1:40 + range <- range(lowerTo(est$est_bst2, NA), lowerTo(estB$est_bst2, NA), lowerTo(est$true_bst2, NA), na.rm=TRUE) + persp(tgrid[k], sgrid[k], z=lowerTo(est$true_bst2[k,k], NA), theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(beta[2](s,t)))) + persp(tgrid[k], sgrid[k], lowerTo(est$est_bst2[k,k],NA), theta = 30, phi = 30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta)[2](s,t), ": reliMSE", phantom(x)%~~% .(round(err$relmsefx2b, 4))))) + if(!is.null(errB)){ + persp(tgrid[k], sgrid[k], lowerTo(estB$est_bst2[k,k], NA), theta=30, phi=30, + ticktype="detailed", zlim=range, xlab="s", ylab="t", zlab="", + main=bquote(paste(hat(beta)[2](s,t), ": reliMSE", phantom(x)%~~% .(round(errB$relmsefx2b, 4))))) + } + } + + # Plot Ytrue, reliMSE(Yfitted), Y and Ytrue-Yfitted + ylim <- range(est$Ytrue, est$Yhat, data$Y) + subsetID <- data$id %in% subset + if(err$long && errB$long){ ### plot the irregualr data + funplot(data$tlong[subsetID], data$Ytruelong[subsetID], id=data$id[subsetID], + col=clrs, xlab="", ylab="", xaxt="n", + pch="", main=expression(E(Y[i](t))), ylim=ylim) + }else{ + funplot(data$t, data$Ytrue[subset,], col=clrs, xlab="", ylab="", xaxt="n", pch="", + main=expression(E(Y[i](t))), ylim=ylim) + } + + if(err$long){ + plot(data$tlong[subsetID], est$yhat[subsetID], ylim=ylim, col="white", xlab="", ylab="", xaxt="n", + main=bquote(paste(hat(Y)[i](t), ": reliMSE", phantom(x)%~~%.(round(err$relmsey, 4))))) + funplot(data$tlong[subsetID], est$yhat[subsetID], id=data$id[subsetID], + col=clrs, xlab="", ylab="", xaxt="n", + pch="", main=expression( hat(Y)[i](t) ), ylim=ylim, add=TRUE) + }else{ + matlplot(data$t, t(est$yhat[subset,]), col=clrs, xlab="", ylab="", xaxt="n", ylim=ylim, + main=bquote(paste(hat(Y)[i](t), ": reliMSE", phantom(x)%~~%.(round(err$relmsey, 4))))) + rug(data$t, 0.01) + } + + if(!is.null(errB)){ + if(errB$long){ + plot(data$tlong[subsetID], estB$yhat[subsetID], ylim=ylim, col="white", xlab="", ylab="", xaxt="n", + main=bquote(paste(hat(Y)[i](t), ": reliMSE", phantom(x)%~~%.(round(errB$relmsey, 4))))) + funplot(data$tlong[subsetID], estB$yhat[subsetID], id=data$id[subsetID], + col=clrs, xlab="", ylab="", xaxt="n", + pch="", main=expression( hat(Y)[i](t) ), ylim=ylim, add=TRUE) + }else{ + matlplot(data$t, t(estB$yhat[subset,]), col=clrs, xlab="", ylab="", xaxt="n", ylim=ylim, + main=bquote(paste(hat(Y)[i](t), ": reliMSE", phantom(x)%~~%.(round(errB$relmsey, 4))))) + rug(data$t, 0.01) + } + } + + # plot data with error + if(err$long){ + funplot(data$tlong[subsetID], data$Ylong[subsetID], id=data$id[subsetID], + col=clrs, xlab="", ylab="", xaxt="n", + pch="", main=expression(Y[i](t)), ylim=ylim) + }else{ + matlplot(data$t, t(data$Y[subset,]), lwd=.5, lty=1, col=clrs, xlab="", ylab="", xaxt="n", + main=expression(Y[i](t))) + rug(data$t, 0.01) + } + + ### plot residuals + + if(err$long){ + ylim <- range(data$Ytruelong - est$yhat, data$Ytruelong - estB$yhat) + funplot(data$tlong[subsetID], (data$Ytruelong - est$yhat)[subsetID], id=data$id[subsetID], + col=clrs, xlab="", ylab="", xaxt="n", + pch="", main=expression(E(Y[i](t)) - hat(Y)[i](t)), ylim=ylim) + + if(!is.null(errB)){ + funplot(data$tlong[subsetID], (data$Ytruelong - estB$yhat)[subsetID], id=data$id[subsetID], + col=clrs, xlab="", ylab="", xaxt="n", + pch="", main=expression(E(Y[i](t)) - hat(Y)[i](t)), ylim=ylim) + } + }else{ + range <- range(data$Ytrue - est$yhat, data$Ytruelong - estB$yhat) + matlplot(data$t, t((data$Ytrue - est$yhat)[subset,]), lwd=.5, lty=1, col=clrs, xlab="", + ylab="", xaxt="n", main=expression(E(Y[i](t)) - hat(Y)[i](t)), ylim=range) + + if(!is.null(errB)) matlplot(t((data$Ytrue - estB$yhat)[subset,]), lwd=.5, lty=1, col=clrs, xlab="", + ylab="", xaxt="n", main=expression(E(Y[i](t)) - hat(Y)[i](t)), ylim=range) + } + + ##title(sub=settingString, cex.sub=1.5, line=-2, outer=TRUE) + par(xpd=FALSE, mar=par()$mar*2) + +} + + +### CEHCK +#M=10; ni=1; Gy=30; Gx=20; snrEps=1; snrE=0; snrB=1; balanced=TRUE +if(FALSE){ + + ### models on all data - regular grid + str(data2 <- makeData(scenario=2, seed=123)) #, nuisance=4 + summary(m2 <- fitModelPffr(data2), freq=FALSE) + #plot(m2, pers=TRUE, pages=1) + summary(m2m <- fitModelMboost(data2, m_max=300), freq=FALSE) #, nuisance=4 + e2 <- getErrors(data2, m2, plotModel=TRUE) + e2m <- getErrors(data2, m2m, plotModel=TRUE) + # cbind(e2, e2m) + plotModel(err=e2, errB=e2m, data=data2, theseSettings=list(M=25, Gy=30, Gx=35, snrEps=2, scenario="2")) + + + ### models on irregular data + str(data2 <- makeData(scenario=2, seed=123, nuisance=4)) # + summary(m2l <- fitModelPffrLong(data2), freq=FALSE) + #plot(m2l, pers=TRUE, pages=1) + summary(m2ml <- fitModelMboostLong(data2, m_max=300, nuisance=4), freq=FALSE) + e2l <- getErrors(data2, m2l, plotModel=TRUE) + e2ml <- getErrors(data2, m2ml, plotModel=TRUE) + # cbind(e2l, e2ml) + plotModel(err=e2l, errB=e2ml, data=data2, theseSettings=list(M=25, Gy=30, Gx=35, snrEps=2, scenario="2")) +} + + +# save proportions of selected variables +selVar <- function(m, nuisance=0){ + + allVariables <- c("ONEx, t", "ONEx, tlong", + #paste("z", 1, sep=""), + paste("X", 1:(nuisance+2), sep="")) + + retlist <- vector("list", length(allVariables)) + names(retlist) <- allVariables + + if(is.null(m)) return(retlist) + + xs <- selected(m) + nm <- variable.names(m) + selprob <- tabulate(xs, nbins = length(nm)) / length(xs) + #names(selprob) <- names(nm) + + sel <- data.frame(vars=nm, selprob) + d1 <- data.frame(vars=allVariables) + + ret <- merge(d1, sel, by="vars", all.x=TRUE) + + # transform dataframe to a list + retlist <- list() + for(i in 1:nrow(ret)){ + retlist[[i]] <- ret[i,2] + } + names(retlist) <- ret[,1] + + return(retlist) +} + + +### one replication of simulation to plot the models of boosting and pffr +# theseSettings=settings[[2]] +# theseSettings=settingsSplit[[9]][[1]] +oneRep <- function(theseSettings){ + #browser() + #print(data.frame(theseSettings)) + + # Generate data + arginS <- theseSettings$inS + arginS <<- theseSettings$inS + penaltyS <- theseSettings$penaltyS + penaltyS <<- theseSettings$penaltyS + diffPen <- theseSettings$diffPen + diffPen <<- theseSettings$diffPen + # theseSettings$type <- "locale" + # theseSettings$type <- "locale0" + # theseSettings$type <- "end" + # theseSettings$type <- "end0" + # theseSettings$type <- "start" + # theseSettings$type <- "start0" + # theseSettings$type <- "fourier" + set.seed(theseSettings$seed) + data <- do.call(makeData, theseSettings) + # funplot(data$s, data$X1) + args <- theseSettings + args$data <- data + + # look for optimal mstop up to 1000 or 2000 depending on inS + args$control <- boost_control(mstop=100, nu=0.1) + if(arginS=="smooth"){ + args$grid <- seq(10, 1000, by = 10) + }else{ + args$grid <- seq(10, 2000, by = 10) + } + args$m_max <- 2000 + + print(unlist(theseSettings)[c(1,3,4,6,9,11,19)]) + + # Fit models + + if(args$p<1){ + #print("long format") + modMboost <- suppressMessages(do.call(fitModelMboostLong, args)) # args$grid <- seq(10, 100, by = 10) + modPffr <- suppressMessages(try(do.call(fitModelPffrLong, args))) + }else{ + #print("wide format") + modMboost <- suppressMessages(do.call(fitModelMboost, args)) # args$grid <- seq(10, 100, by = 10) + modPffr <- suppressMessages(try(do.call(fitModelPffr, args))) + } + + if(is.null(modPffr)) print(paste("modPffr, set " , theseSettings$set, ", is NULL", sep="")) + if(is.null(modMboost)) print(paste("modMboost, set " , theseSettings$set, ", is NULL", sep="")) + + err <- getErrors(data, modPffr, plotModel=TRUE) + errB <- getErrors(data, modMboost, plotModel=TRUE) + + # Save models of first rep + if(theseSettings$rep==1){ + temp <- c("type", "a", "scenario", "k", "centerX", "penaltyS", "diffPen") + temp2 <- theseSettings[temp] + temp[temp %in% "scenario"] <- "sc" + temp[temp %in% "type"] <- "" + temp[temp %in% "penaltyS"] <- "" + nm <- paste(temp, temp2, sep="", collapse="_") + + pdf(paste(pathModels, nm, ".pdf", sep=""), width=7, height=12) + try(plotModel(err=err, errB=errB, data=data, theseSettings=theseSettings)) + + par(mfrow=c(4,2)) + funplot(data$s, data$X1, xlab="s", ylab="", main="X1") + funplot(data$s, data$X2, xlab="s", ylab="", main="X2") + + predPffr2 <- predict(modPffr, type="terms")[[2]][[".value"]] + predPffr3 <- predict(modPffr, type="terms")[[3]][[".value"]] + + predMboost2 <- predict(modMboost, which=2)#[,1] + predMboost3 <- predict(modMboost, which=3)#[,1] + + if(length(predMboost2)==1) predMboost2 <- rep(0, length(data$tlong)) + if(length(predMboost3)==1) predMboost3 <- rep(0, length(data$tlong)) + + range <- range(data$X1f, data$X2f, + predMboost2, predMboost3, + predPffr2, predPffr3) + + funplot(data$t, data$X1f, xlab="t", ylab="", main="effect of X1", ylim=range) + funplot(data$t, data$X2f, xlab="t", ylab="", main="effect of X2", ylim=range) + + funplot(data$tlong, predMboost2, data$id, xlab="t", ylab="", main="FDboost: effect of X1", ylim=range) + funplot(data$tlong, predMboost3, data$id, xlab="t", ylab="", main="FDboost: effect of X2", ylim=range) + funplot(data$tlong, predPffr2, data$id, xlab="t", ylab="", main="pffr: effect of X1", ylim=range) + funplot(data$tlong, predPffr3, data$id, xlab="t", ylab="", main="pffr: effect of X2", ylim=range) + + dev.off() + } + + # Calculate errors for both models + resMboost <- try(c(model=2, getErrors(data, modMboost))) + resPffr <- try(c(model=1, getErrors(data, modPffr))) + #cbind(resMboost, resPffr) + + rm(modMboost); rm(modPffr); rm(data); rm(args) + + res <- rbind(do.call(data.frame, c(theseSettings, resPffr)), + do.call(data.frame, c(theseSettings, resMboost))) + + return(res) +} + + +### one replication of simulation: only fit the models of mboost!! +# theseSettings=settings[[1]] +# theseSettings=settingsSplit[[9]][[1]] +oneRepFDboost <- function(theseSettings){ + #browser() + #print(data.frame(theseSettings)) + + # Generate data + arginS <- theseSettings$inS + arginS <<- theseSettings$inS + penaltyS <- theseSettings$penaltyS + penaltyS <<- theseSettings$penaltyS + diffPen <- theseSettings$diffPen + diffPen <<- theseSettings$diffPen + + set.seed(theseSettings$seed) + data <- do.call(makeData, theseSettings) + args <- theseSettings + args$data <- data + + # look for optimal mstop up to 1000 or 2000 depending on inS + args$control <- boost_control(mstop=100, nu=0.1) + if(arginS=="smooth"){ + args$grid <- seq(10, 1000, by = 10) + }else{ + args$grid <- seq(10, 2000, by = 10) + } + args$m_max <- 2000 + + # Fit models + modPffr <- NULL + ### modPffr <- suppressMessages(do.call(fitModelPffr, args)) + + if(FALSE){ + formula <- attr(data, "formulaFDboostLong") + timeformula <- attr(data, "timeformulaLong") + + if(FALSE){ + + ## lead effect + mylimits <- function(s, t) { + (s < t) & (s < t-3) + } + + ## band effect + mylimits <- function(s, t) { + (s < t + 5) & (s > t -5) + } + + formula <- Ylong ~ 1 + bhist(X1, s, tlong, df = 5.0176, knots = 5, inS = arginS, + penalty = "ps", differences = 2, check.ident = TRUE) + + bhist(X2, s, tlong, df = 5.0176, knots = 5, inS = arginS, + penalty = penaltyS, differences = diffPen, check.ident = FALSE) + + } + + m <- FDboost(eval(formula), timeformula = timeformula, id=~id, + data=data, control=boost_control(mstop=100, nu=0.1), + numInt="Riemann", offset=NULL, + offset_control=o_control(k_min=10)) + # test <- getDiags(m, data) + + str(extract(m)) + desMatrix <- extract(m)[[2]] + dim(desMatrix) + colSums(desMatrix) # there are columns that are completely zero! + m$coef()[[2]] + round(matrix(m$coef()[[2]], ncol=sqrt(ncol(desMatrix))), 2) + plot(m, which=2, pers=TRUE) + plot(m, which=2) + persp(matrix(m$coef()[[2]], ncol=sqrt(ncol(desMatrix))), theta=30, phi=30) + image(matrix(m$coef()[[2]], ncol=sqrt(ncol(desMatrix)))) + } + + if(args$p<1){ + #print("long format") + modMboost <- suppressMessages(do.call(fitModelMboostLong, args)) # args$m_max=200 + }else{ + #print("wide format") + modMboost <- suppressMessages(do.call(fitModelMboost, args)) # args$m_max=100 + } + #browser() + + # Calculate errors for both models + resMboost <- try(c(model=2, getErrors(data, modMboost))) + resPffr <- try(c(model=1, getErrors(data, modPffr))) + # cbind(resMboost, resPffr) + + # compute the measures of identifiability + identMboostX1 <- getDiags(modMboost, data, bl=2) + identMboostX2 <- getDiags(modMboost, data, bl=3) + names(identMboostX2) <- paste0(names(identMboostX2), ".2") + + #### selected variables + selectedVariables <- selVar(m=modMboost, nuisance=8) + + + rm(modMboost); rm(modPffr); rm(data); rm(args) + + res <- rbind(do.call(data.frame, c(theseSettings, resMboost, + unlist(identMboostX1), unlist(identMboostX2), + selectedVariables))) + + return(res) +} + +# test <- oneRep(theseSettings) + + +#s# one replication of simulation +# theseSettings=settings[[1]] +# theseSettings=settingsSplit[[9]][[1]] +oneRepPffr <- function(theseSettings){ + + # Generate data + arginS <- theseSettings$inS + arginS <<- theseSettings$inS + penaltyS <- theseSettings$penaltyS + penaltyS <<- theseSettings$penaltyS + diffPen <- theseSettings$diffPen + diffPen <<- theseSettings$diffPen + + set.seed(theseSettings$seed) + data <- do.call(makeData, theseSettings) + #print(data$Y[5,5]) + #print(data$Ytrue[5,5]) + #print(data$X1[5,5]) + #print(data$X2[5,5]) + args <- theseSettings + args$data <- data + + print(unlist(theseSettings)[c(1,3,4,6,9,11,19)]) + + # Fit models + #modPffr <- NULL + + if(args$p<1){ + #print("long format") + modPffr <- suppressMessages(try(do.call(fitModelPffrLong, args))) + }else{ + #print("wide format") + modPffr <- suppressMessages(try(do.call(fitModelPffr, args))) + } + + # Should not be necessary! + if(any(class(modPffr)=="try-error")){ + warning(paste("fitModelPffr, set " , theseSettings$set, ", gives error!", sep="")) + modPffr <- NULL + } + + ### modMboost <- suppressMessages(do.call(fitModelMboost, args)) + modMboost <- NULL + + if(is.null(modPffr)){ + print(paste("modPffr, set " , theseSettings$set, ", is NULL", sep="")) + } + + # Calculate errors for both models + resMboost <- try(c(model=2, getErrors(data, modMboost))) + resPffr <- try(c(model=1, getErrors(data, modPffr))) + #cbind(resMboost, resPffr) + + # compute the measures of identifiability + identPffrX1 <- getDiags(modPffr, data, bl=2) + identPffrX2 <- getDiags(modPffr, data, bl=3) + names(identPffrX2) <- paste0(names(identPffrX2), ".2") + + rm(modMboost); rm(modPffr); rm(data); rm(args) + + res <- rbind(do.call(data.frame, c(theseSettings, resPffr, + unlist(identPffrX1), unlist(identPffrX2)))) + + return(res) +} + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/readme.txt b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/readme.txt new file mode 100644 index 0000000..74a1bb1 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/readme.txt @@ -0,0 +1,24 @@ + +Code for simulation study presented in +Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +Boosting flexible functional regression models with a high number of functional historical effects, +Statistics and Computing, 27(4), 913-926. + + +Use the run_...R files to run the different settings of the simulation study, + +- run_FDboost2.R fit the models without nuisance variables by FDboost +- run_FDboost3.R fit the models with nuisance variables by FDboost, use stability selection +- run_FDboost4.R fit the models with nuisance variables by FDboost + +- run_pffr2.R fit the models without nuisance variables by FAMM +- run_pffr3.R try to fit the models with nuisance variables by FAMM (cannot fit the models, always gives error!) + +- run_PlotModels.R get plots of the data settings and the estimated coefficients for FAMM and FDboost + +The code in analyze_results.R can be used to get plots and tables using the results. + +simUtils.R and boosting4.R contain utility functions. + + +The parallelization only works on Linux, not on Windows. \ No newline at end of file diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost2.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost2.R new file mode 100644 index 0000000..640630d --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost2.R @@ -0,0 +1,205 @@ +############################################################################### +# run the simulations for boosting of models with functional historical effects +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +rm(list=ls()) + +library(FDboost) +library(splines) +library(MASS) +library(Matrix) + +# setwd("../") +# path <- getwd() +# +# source(paste0(getwd(),"/Code/boosting4.R")) # functions for simulations +# +# pathResults <- paste0(path, "/results/") +# pathModels <- paste0(path, "/models/") + +source("boosting4.R") +pathResults <- NULL +pathModels <- NULL + +getwd() + + +doStabsel <- FALSE + +###################################### M=30, Gy=27, but p=0.8! + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set1 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(0, 1, 2), + type=c("lines"), + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set1) + +usecores <- 10 +options(cores=usecores) + +# boosting on set1 +res1 <- try(doSimFDboost(settings=set1)) +#res1 +save(res1, file=paste(pathResults, "res1.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set2 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("bsplines"), + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set2) + +usecores <- 10 +options(cores=usecores) + +# boosting on set2 +res2 <- try(doSimFDboost(settings=set2)) +#res2 +save(res2, file=paste(pathResults, "res2.Rdata", sep="")) + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set3 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("local", "end"), ##, "start" + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set3) + +usecores <- 10 +options(cores=usecores) + +# boosting on set3 +res3 <- try(doSimFDboost(settings=set3)) +#res3 +save(res3, file=paste(pathResults, "res3.Rdata", sep="")) + + + +### do not fit the fourier-settings +# set.seed(18102012) +# +# arginS <- "smooth" +# penaltyS <- "ps" +# +# +# set4 <- makeSettings( +# dgpsettings=list(M=c(30), +# ni=c(1), +# p=c(0.8), +# Gy=c(27), +# Gx=c(100), +# snrEps=c(2), +# snrE=c(0), +# snrB=c(2), +# scenario=c(2), +# k=c(4), +# type=c("fourier"), +# balanced=c(TRUE), +# nuisance=c(0), # 10 +# a=c("pen1coef4", "pen2coef4"), +# regularS=c(TRUE), +# regularT=c(FALSE), +# rep=1:20), +# algorithms=list(addNoise=c(FALSE), +# centerX=c(TRUE), +# penaltyS=c("ps","pss"), +# diffPen=c(1,2), +# inS=c("smooth")) +# ) +# +# length(set4) +# +# usecores <- 10 +# options(cores=usecores) +# +# # boosting on set4 +# res4 <- try(doSimFDboost(settings=set4)) +# #res4 +# save(res4, file=paste(pathResults, "res4.Rdata", sep="")) +# + + +# ###################################### + +print(sessionInfo()) + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost3.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost3.R new file mode 100644 index 0000000..92b5b80 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost3.R @@ -0,0 +1,205 @@ +############################################################################### +# run the simulations for boosting of models with functional historical effects +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +rm(list=ls()) + +library(FDboost) +library(splines) +library(MASS) +library(Matrix) + +# setwd("../") +# path <- getwd() +# +# source(paste0(getwd(),"/Code/boosting4.R")) # functions for simulations +# +# pathResults <- paste0(path, "/results/") +# pathModels <- paste0(path, "/models/") + +source("boosting4.R") +pathResults <- NULL +pathModels <- NULL + +getwd() + +doStabsel <- TRUE + + +###################################### M=30, Gy=27, but p=0.8! + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set1 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(0, 1, 2), + type=c("lines"), + balanced=c(TRUE), + nuisance=c(8), # add 8 nuisance variables + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set1) + +usecores <- 10 +options(cores=usecores) + +# boosting on set1 +res1n <- try(doSimFDboost(settings=set1)) +#res1n +save(res1n, file=paste(pathResults, "res1nuisance.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set2 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("bsplines"), + balanced=c(TRUE), + nuisance=c(8), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set2) + +usecores <- 10 +options(cores=usecores) + +# boosting on set2 +res2n <- try(doSimFDboost(settings=set2)) +#res2n +save(res2n, file=paste(pathResults, "res2nuisance.Rdata", sep="")) + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set3 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("local", "end"), ##, "start" + balanced=c(TRUE), + nuisance=c(8), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set3) + +usecores <- 10 +options(cores=usecores) + +# boosting on set3 +res3n <- try(doSimFDboost(settings=set3)) +#res3n +save(res3n, file=paste(pathResults, "res3nuisance.Rdata", sep="")) + + + +### do not fit the fourier-settings +# set.seed(18102012) +# +# arginS <- "smooth" +# penaltyS <- "ps" +# +# +# set4 <- makeSettings( +# dgpsettings=list(M=c(30), +# ni=c(1), +# p=c(0.8), +# Gy=c(27), +# Gx=c(100), +# snrEps=c(2), +# snrE=c(0), +# snrB=c(2), +# scenario=c(2), +# k=c(4), +# type=c("fourier"), +# balanced=c(TRUE), +# nuisance=c(8), # 10 +# a=c("pen1coef4", "pen2coef4"), +# regularS=c(TRUE), +# regularT=c(FALSE), +# rep=1:20), +# algorithms=list(addNoise=c(FALSE), +# centerX=c(TRUE), +# penaltyS=c("ps","pss"), +# diffPen=c(1,2), +# inS=c("smooth")) +# ) +# +# length(set4) +# +# usecores <- 10 +# options(cores=usecores) +# +# # boosting on set4 +# res4n <- try(doSimFDboost(settings=set4)) +# #res4n +# save(res4n, file=paste(pathResults, "res4nuisance.Rdata", sep="")) +# + + +# ###################################### + +print(sessionInfo()) + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost4.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost4.R new file mode 100644 index 0000000..7a05228 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_FDboost4.R @@ -0,0 +1,205 @@ +############################################################################### +# run the simulations for boosting of models with functional historical effects +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +rm(list=ls()) + +library(FDboost) +library(splines) +library(MASS) +library(Matrix) + +# setwd("../") +# path <- getwd() +# +# source(paste0(getwd(),"/Code/boosting4.R")) # functions for simulations +# +# pathResults <- paste0(path, "/results/") +# pathModels <- paste0(path, "/models/") + +source("boosting4.R") +pathResults <- NULL +pathModels <- NULL + +getwd() + + +doStabsel <- FALSE + +###################################### M=30, Gy=27, but p=0.8! + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set1 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(0, 1, 2), + type=c("lines"), + balanced=c(TRUE), + nuisance=c(8), # add 8 nuisance variables + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set1) + +usecores <- 10 +options(cores=usecores) + +# boosting on set1 +res1nu <- try(doSimFDboost(settings=set1)) +#res1nu +save(res1nu, file=paste(pathResults, "res1nu.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set2 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("bsplines"), + balanced=c(TRUE), + nuisance=c(8), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set2) + +usecores <- 10 +options(cores=usecores) + +# boosting on set2 +res2nu <- try(doSimFDboost(settings=set2)) +#res2nu +save(res2nu, file=paste(pathResults, "res2nu.Rdata", sep="")) + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set3 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("local", "end"), ##, "start" + balanced=c(TRUE), + nuisance=c(8), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set3) + +usecores <- 10 +options(cores=usecores) + +# boosting on set3 +res3nu <- try(doSimFDboost(settings=set3)) +#res3nu +save(res3nu, file=paste(pathResults, "res3nu.Rdata", sep="")) + + + +### do not fit the fourier-settings +# set.seed(18102012) +# +# arginS <- "smooth" +# penaltyS <- "ps" +# +# +# set4 <- makeSettings( +# dgpsettings=list(M=c(30), +# ni=c(1), +# p=c(0.8), +# Gy=c(27), +# Gx=c(100), +# snrEps=c(2), +# snrE=c(0), +# snrB=c(2), +# scenario=c(2), +# k=c(4), +# type=c("fourier"), +# balanced=c(TRUE), +# nuisance=c(8), # 10 +# a=c("pen1coef4", "pen2coef4"), +# regularS=c(TRUE), +# regularT=c(FALSE), +# rep=1:20), +# algorithms=list(addNoise=c(FALSE), +# centerX=c(TRUE), +# penaltyS=c("ps","pss"), +# diffPen=c(1,2), +# inS=c("smooth")) +# ) +# +# length(set4) +# +# usecores <- 10 +# options(cores=usecores) +# +# # boosting on set4 +# res4nu <- try(doSimFDboost(settings=set4)) +# #res4nu +# save(res4nu, file=paste(pathResults, "res4nu.Rdata", sep="")) +# + + +# ###################################### + +print(sessionInfo()) + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_PlotModels.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_PlotModels.R new file mode 100644 index 0000000..64ae956 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_PlotModels.R @@ -0,0 +1,162 @@ +############################################################################### +# run the simulations for boosting/FAMM of models with functional historical effects +# to plot the models: data / true and estimated coefficients +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + + +rm(list=ls()) + +print(R.Version()$version.string) + +## library(refundDevel) +library(refund) +library(FDboost) +library(splines) + +# setwd("../") +# path <- getwd() +# +# source(paste0(getwd(),"/Code/boosting4.R")) # functions for simulations +# +# pathResults <- paste0(path, "/results/") +# pathModels <- paste0(path, "/models/") + +source("boosting4.R") +pathResults <- NULL +pathModels <- NULL + +getwd() + + +doStabsel <- FALSE + +###################################### M=30 + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set1 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(0, 1, 2), + type=c("lines"), + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps"), + diffPen=c(1), + inS=c("smooth")) +) + +length(set1) + +usecores <- 5 +options(cores=usecores) +res1 <- try(doSim(settings=set1, cores=usecores)) + +save(res1, file=paste(pathResults, "res1plot.Rdata", sep="")) + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set2 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("bsplines"), + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps"), + diffPen=c(1), + inS=c("smooth")) +) + +length(set2) + +usecores <- 5 +options(cores=usecores) + +# boosting on set2 +res2 <- try(doSim(settings=set2, cores=usecores)) +#res2 +save(res2, file=paste(pathResults, "res2plot.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set3 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("local", "end"), ##, "start" + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps"), + diffPen=c(1), + inS=c("smooth")) +) + +length(set3) + +usecores <- 5 +options(cores=usecores) + +# boosting on set3 +res3 <- try(doSim(settings=set3, cores=usecores)) +#res3 +save(res3, file=paste(pathResults, "res3plot.Rdata", sep="")) + + + +print(sessionInfo()) + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr2.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr2.R new file mode 100644 index 0000000..490f639 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr2.R @@ -0,0 +1,206 @@ +############################################################################### +# run the simulations for FAMM of models with functional historical effects +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +rm(list=ls()) + +print(R.Version()$version.string) + +## library(refundDevel) +library(refund) +library(FDboost) +library(splines) +library(MASS) +library(Matrix) + +# setwd("../") +# path <- getwd() +# +# source(paste0(getwd(),"/Code/boosting4.R")) # functions for simulations +# +# pathResults <- paste0(path, "/results/") +# pathModels <- paste0(path, "/models/") + +source("boosting4.R") +pathResults <- NULL +pathModels <- NULL + +getwd() + +###################################### M=30 + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set1 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(0, 1, 2), + type=c("lines"), + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set1) + +usecores <- 5 +options(cores=usecores) + +# FAMM on set1 +pffr1 <- try(doSimPffr(settings=set1, cores=usecores)) +#pffr1 +save(pffr1, file=paste(pathResults, "pffr1.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set2 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("bsplines"), + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set2) + +usecores <- 5 +options(cores=usecores) + +# FAMM on set2 +pffr2 <- try(doSimPffr(settings=set2, cores=usecores)) +#pffr2 +save(pffr2, file=paste(pathResults, "pffr2.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set3 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("local", "end"), ##, "start" + balanced=c(TRUE), + nuisance=c(0), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set3) + +usecores <- 5 +options(cores=usecores) + +# FAMM on set3 +pffr3 <- try(doSimPffr(settings=set3, cores=usecores)) +#pffr3 +save(pffr3, file=paste(pathResults, "pffr3.Rdata", sep="")) + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + + +# set4 <- makeSettings( +# dgpsettings=list(M=c(30), +# ni=c(1), +# p=c(0.8), +# Gy=c(27), +# Gx=c(100), +# snrEps=c(2), +# snrE=c(0), +# snrB=c(2), +# scenario=c(2), +# k=c(4), +# type=c("fourier"), +# balanced=c(TRUE), +# nuisance=c(0), # 10 +# a=c("pen1coef4", "pen.1coef4"), +# regularS=c(TRUE), +# regularT=c(FALSE), +# rep=1:20), +# algorithms=list(addNoise=c(FALSE), +# centerX=c(TRUE, FALSE), +# penaltyS=c("ps","pss"), +# diffPen=c(1,2), +# inS=c("smooth")) +# ) +# +# length(set4) +# +# usecores <- 5 +# options(cores=usecores) +# +# # FAMM on set4 +# pffr4 <- try(doSimPffr(settings=set4, cores=usecores)) +# #pffr4 +# save(pffr4, file=paste(pathResults, "pffr4.Rdata", sep="")) +# + + +###################################### + +print(sessionInfo()) + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr3.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr3.R new file mode 100644 index 0000000..de8d7d8 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/run_pffr3.R @@ -0,0 +1,207 @@ +############################################################################### +# run the simulations for FAMM of models with functional historical effects +# code based on code by Fabian Scheipl +# author: Sarah Brockhaus +############################################################################### + +rm(list=ls()) + +print(R.Version()$version.string) + +## library(refundDevel) +library(refund) +library(FDboost) +library(splines) +library(MASS) +library(Matrix) + +# setwd("../") +# path <- getwd() +# +# source(paste0(getwd(),"/Code/boosting4.R")) # functions for simulations +# +# pathResults <- paste0(path, "/results/") +# pathModels <- paste0(path, "/models/") + +source("boosting4.R") +pathResults <- NULL +pathModels <- NULL + + +getwd() + +###################################### M=30 + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set1 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(0, 1, 2), + type=c("lines"), + balanced=c(TRUE), + nuisance=c(18), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), ########### rep=1:20) + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set1) + +usecores <- 5 +options(cores=usecores) + +# FAMM on set1 +pffr1 <- try(doSimPffr(settings=set1, cores=usecores)) +#pffr1 +save(pffr1, file=paste(pathResults, "pffr1nuisance.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set2 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("bsplines"), + balanced=c(TRUE), + nuisance=c(8), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set2) + +usecores <- 10 +options(cores=usecores) + +# FAMM on set2 +pffr2 <- try(doSimPffr(settings=set2, cores=usecores)) +#pffr2 +save(pffr2, file=paste(pathResults, "pffr2nuisance.Rdata", sep="")) + + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + +set3 <- makeSettings( + dgpsettings=list(M=c(30), + ni=c(1), + p=c(0.8), + Gy=c(27), + Gx=c(100), + snrEps=c(2), + snrE=c(0), + snrB=c(2), + scenario=c(2), + k=c(5, 10), + type=c("local", "end"), ##, "start" + balanced=c(TRUE), + nuisance=c(8), # 10 + a=c("pen1coef4", "pen2coef4"), + regularS=c(TRUE), + regularT=c(FALSE), + rep=1:20), + algorithms=list(addNoise=c(FALSE), + centerX=c(TRUE), + penaltyS=c("ps","pss"), + diffPen=c(1,2), + inS=c("smooth")) +) + +length(set3) + +usecores <- 10 +options(cores=usecores) + +# FAMM on set3 +pffr3 <- try(doSimPffr(settings=set3, cores=usecores)) +#pffr3 +save(pffr3, file=paste(pathResults, "pffr3nuisance.Rdata", sep="")) + + +set.seed(18102012) + +arginS <- "smooth" +penaltyS <- "ps" + + +# set4 <- makeSettings( +# dgpsettings=list(M=c(30), +# ni=c(1), +# p=c(0.8), +# Gy=c(27), +# Gx=c(100), +# snrEps=c(2), +# snrE=c(0), +# snrB=c(2), +# scenario=c(2), +# k=c(4), +# type=c("fourier"), +# balanced=c(TRUE), +# nuisance=c(0), # 10 +# a=c("pen1coef4", "pen.1coef4"), +# regularS=c(TRUE), +# regularT=c(FALSE), +# rep=1:20), +# algorithms=list(addNoise=c(FALSE), +# centerX=c(TRUE, FALSE), +# penaltyS=c("ps","pss"), +# diffPen=c(1,2), +# inS=c("smooth")) +# ) +# +# length(set4) +# +# usecores <- 10 +# options(cores=usecores) +# +# # FAMM on set4 +# pffr4 <- try(doSimPffr(settings=set4, cores=usecores)) +# #pffr4 +# save(pffr4, file=paste(pathResults, "pffr4.Rdata", sep="")) +# + + +###################################### + +print(sessionInfo()) + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/simUtils.R b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/simUtils.R new file mode 100644 index 0000000..d198b30 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/inst/simHist/simUtils.R @@ -0,0 +1,957 @@ +############################################################################### +# Utility functions for functional regression with pffr and FDboost +# code based on code of Fabian Scheipl: utility functions for lfpr simulations +# Author: Sarah Brockhaus +############################################################################### + + +################################# +# Function of Fabian "superUtils.R" +expandList <- function(...) { + ## expand.grid for lists + dots <- list(...) + #how many settings per entry + dims <- lapply(dots, length) + #make all combinations of settings + sets <- do.call(expand.grid, lapply(dims, function(x) seq(1:x))) + ret <- apply(sets, 1, function(x) { + l <- list() + for (i in 1:length(x)) l[[i]] <- dots[[i]][[as.numeric(x[i])]] + names(l) <- colnames(sets) + return(l) + }) + for (c in 1:ncol(sets)) sets[, c] <- factor(sets[, c], labels = paste(dots[[colnames(sets)[c]]])) + attr(ret, "settings") <- sets + return(ret) +} + + +makeSettings <- function(dgpsettings, algorithms){ + # generates a full factorial design of all settings + # + # dgpsettings: a named list of parameters for the data generating process + # algorithms: a named list of parameters for the algorithms/estimators + # + # sets up the simulation study so that algorithms are compared on the same data + # for each combination of dgpsettings by re-using the same seed for all + # algorithms i.e., replication of a "datasetting" will produce the same data + # regardless of the "algorithm". + + datasettings <- do.call(expand.grid, c(dgpsettings, stringsAsFactors = + FALSE)) + datasettings$seed <- as.integer(sample(1L:5e7L, nrow(datasettings))) + datasettings$datasetting <- 1:nrow(datasettings) + + algsettings <- do.call(expand.grid, c(algorithms, stringsAsFactors = + FALSE)) + algsettings$algorithm <- 1:nrow(algsettings) + + settings <- cbind(datasettings[rep(1:nrow(datasettings), + each = nrow(algsettings)), ], + algsettings[rep(1:nrow(algsettings), + times = nrow(datasettings)), ], + set=1:(nrow(datasettings)*nrow(algsettings)), + combination=rep(1:(nrow(algsettings)*nrow(datasettings)/max(datasettings$rep)), + times= max(datasettings$rep)) ) + + settingsList <- lapply(1:nrow(settings), function(j) sapply(1:ncol(settings), + function(i) settings[j,][i])) + + attr(settingsList, "settings") <- settings + + return(settingsList) +} + +# generate colors +alpha <- function(x, alpha=25){ + tmp <- sapply(x, col2rgb) + tmp <- rbind(tmp, rep(alpha, length(x)))/255 + return(apply(tmp, 2, function(x) do.call(rgb, as.list(x)))) +} + +################################# +# Do the iterations over oneRep() +doSim <- function(settings, cores=40){ + library(plyr) + + # only works on Linux -> with try() no error on windows + try(library(doMC)) + try(registerDoMC(cores=cores)) + + split <- sample(rep(1:cores, length=length(settings))) + + settingsSplit <- alply(1:cores, 1, function(i) { + settings[split==i] + }) + + ret <- ldply(settingsSplit, function(settings) { + return(ldply(settings, oneRep, .parallel=FALSE)) + }, .parallel=TRUE) + + return(ret) +} +# +# # Do the iterations over oneRep2() +# doSim2 <- function(settings, cores=40){ +# library(plyr) +# +# # only works on Linux -> with try() no error on windows +# try(library(doMC)) +# try(registerDoMC(cores=cores)) +# +# split <- sample(rep(1:cores, length=length(settings))) +# +# settingsSplit <- alply(1:cores, 1, function(i) { +# settings[split==i] +# }) +# +# ret <- ldply(settingsSplit, function(settings) { +# return(ldply(settings, oneRep2, .parallel=FALSE)) +# }, .parallel=TRUE) +# +# return(ret) +# } +# + +# Do the iterations over oneRepPffr() +doSimPffr <- function(settings, cores=10){ + library(plyr) + + # only works on Linux -> with try() no error on windows + try(library(doMC)) + try(registerDoMC(cores=cores)) + + split <- sample(rep(1:cores, length=length(settings))) + + settingsSplit <- alply(1:cores, 1, function(i) { + settings[split==i] + }) + + ret <- ldply(settingsSplit, function(settings) { + return(ldply(settings, oneRepPffr, .parallel=FALSE)) + }, .parallel=TRUE) + + return(ret) +} + +# Do the iterations over oneRepFDboost() +# slightly modified doSafeSim() +doSimFDboost <- function(settings){ #, savefile + library(plyr) + + ret <- data.frame() + failed <- list() + + for(s in 1:length(settings)){ + res <- try(do.call(oneRepFDboost, settings[s]), silent = TRUE) + if(any(class(res)=="try-error")){ + cat("\n some of ", s, "failed:\n") + print(do.call(rbind, settings[s])) + failed <- c(failed, settings[s]) + }else{ + ret <- rbind(ret, res) + save(ret, file="savefile.Rdata") + save(ret, file=glue("cpy", "savefile.Rdata")) + cat(format(Sys.time(), "%b %d %X"), ": ", s, " of ", length(settings), "\n") + } + } + #ret <- list(ret=ret, failed=failed) + attr(ret, "failed") <- failed + #save(ret, file=savefile) + #save(ret, file=glue("cpy", savefile)) + return(ret) +} + +## Try function ldply() +#test.list <- list(set1=1:4, set2=5:8, set3=9:12) +#test.fun <- function(l) data.frame(l, x=rep(99,4)) +#test.fun(test.list[[1]]) +#ldply(test.list, test.fun + + +glue <- function(..., collapse = NULL) { + paste(..., sep = "", collapse) +} +# +# doSafeSim <- function(settings, savefile){ +# library(plyr) +# +# ret <- data.frame() +# failed <- list() +# +# for(s in 1:length(settings)){ +# res <- try(do.call(oneRep, settings[s]), silent = TRUE) +# if(any(class(res)=="try-error")){ +# cat("\n some of ", s, "failed:\n") +# print(do.call(rbind, settings[s])) +# failed <- c(failed, settings[s]) +# }else{ +# ret <- rbind(ret, res) +# save(ret, file=savefile) +# save(ret, file=glue("cpy", savefile)) +# cat(format(Sys.time(), "%b %d %X"), ": ", s, " of ", length(settings), "\n") +# } +# } +# ret <- list(ret=ret, failed=failed) +# save(ret, file=savefile) +# save(ret, file=glue("cpy", savefile)) +# return(ret) +# } + + + +################################# +# Funcitons for generating variables and coefficients + +# function for generating a functional covariable as (spline-basis)%*%(random coefficient) +rf <- function(x=seq(0,1,length=100), k=15) { + + # parallel increasing lines with random slope + if(k==0) ret <- rnorm(1, mean=-2, sd=1) + 0.3*x + + # lines with random slopes + if(k==1) ret <- rnorm(1, mean=0, sd=0.1)*x + + # lines with random intercepts and random slopes + if(k==2) ret <- rnorm(1, mean=-2, sd=1) + rnorm(1, mean=0, sd=0.1)*x + + # data simulated by splines with random coefficients + if(k>2) ret <- drop(bs(x, k, int=TRUE) %*% runif(k, -3, 3)) + + return(ret) +} + + + +# function for generating a functional covariable with special properties +rf2 <- function(x=seq(0,1,length=100), k=15, type="bsplines") { + + if(type=="lines"){ + ret <- rf(x=x, k=k) + } + + if(type=="bsplines"){ + ret <- rf(x=x, k=k) + } + + if(type == "local"){ + ## locale but with different random bases + temp <- c( min(x)-0.05*(range(x)[2] - range(x)[1]), max(x)+0.05*(range(x)[2] - range(x)[1]) ) + ret <- bs(x, 5*k, intercept=TRUE, Boundary.knots=temp)[,sample(2:(5*k-1), k)] %*% c(runif(k, -3, 3)) + # ret<- cbind(ret, bs(x, 5*k, intercept=TRUE)[,sample(2:(5*k-1), k)] %*% c(runif(k, -3, 3))) + # funplot(x, t(ret)) + } + + ### all information is at the same locations + # if(type == "locale0"){ + # ## local and all functions have the same local bases + # ret <- bs(x, 5*k, intercept=TRUE)[,round(seq(5, 5*k-5, l=k))] %*% c(runif(k, -3, 3)) + # # ret <- cbind(ret, bs(x, 5*k, intercept=TRUE)[,round(seq(5, 5*k-5, l=k))] %*% c(runif(k-2, -3, 3), runif(2, -2, 2))) + # } + + ### information in the beginning + if(type == "start"){ + ## information in the beginning + # ret <- cbind(bs(x, 10*k, intercept=TRUE)[,sample(2:(3*k), k-1)], 1) %*% c(runif(k-1, -3, 2), runif(1, -1, 2)) + ret <- bs(x, 10*k, intercept=TRUE)[,sample(2:(3*k), k)] %*% c(runif(k, -3, 3)) + } + + ### some information in the end + if(type == "end"){ + ## only information in the end + #ret <- cbind(bs(x, 10*k, intercept=TRUE)[,sample((7*k):(10*k-1), k-1)], 1) %*% c(runif(k-1, -3, 2), runif(1, -1, 2)) + ret <- bs(x, 10*k, intercept=TRUE)[ ,sample((7*k):(10*k-1), k)] %*% c(runif(k, -3, 3)) + } + + ## use a fourier basis with linear decreasing eigenvalues + if(type == "fourierLin"){ + EFourier <- eval.basis(x, create.fourier.basis(rangeval=c(0, 1), + nbasis=ifelse(k%%2, k, k+1))) + loadings <- replicate(1, rnorm(k, sd=sqrt(((k+1)-(1:k))/k)) ) + ret <- EFourier[,1:k] %*% loadings + } + + ## use a fourier basis with exponentailly decreasing eigenvalues + if(type == "fourierExp"){ + EFourier <- eval.basis(x, create.fourier.basis(rangeval=c(0, 1), + nbasis=ifelse(k%%2, k, k+1))) + loadings <- replicate(1, rnorm(k, sd=sqrt(exp(-(0:(k-1))/2)) )) + ret <- EFourier[,1:k] %*% loadings + } + + ## use a fourier basis with constant eigenvalues + if(type == "fourier"){ + #ret <- cos(runif(1, 1, 2)*pi*x)*runif(1, 1, 2) #*seq(1, runif(1,2,5), l=length(x)) + #ret <- cbind(ret, cos(runif(1, 1, 2)*pi*x)*runif(1, 1, 2)) + #funplot(x, t(ret)) + EFourier <- eval.basis(x, create.fourier.basis(rangeval=c(0, 1), + nbasis=ifelse(k%%2, k, k+1))) + loadings <- replicate(1, rnorm(k, sd=1)) + ret <- EFourier[,1:k] %*% loadings + } + + return(drop(ret)) +} + +types <- c("bsplines","locale","locale0","start","start0","end","end0","fourier") + + +### plot examples for all datasettings +if(FALSE){ + library(FDboost) + library(splines) + s <- seq(0, 1, l=100)*15 + 1 + generateX <- function(k, type){ + centerX <- TRUE + X1 <- t(replicate(10, rf2(x=s, k=k, type=type))) + if(centerX) X1 <- sweep(X1, 2, apply(X1, 2, mean)) + funplot(s, X1, type="l", rug = FALSE, + lwd=2, col=1, lty=1, xlab="s", ylab="", + main=paste(type, "-", k)) + return(X1) + } + pdf("dataSim.pdf") + par(mar=c(3.5, 3, 2.5, 1), cex=2, mgp = c(2, 1, 0), cex.main=1.5) + set.seed(124) + X1 <- generateX(k=5, type="local") + X1 <- generateX(k=10, type="local") + X1 <- generateX(k=5, type="bsplines") + X1 <- generateX(k=10, type="bsplines") + X1 <- generateX(k=5, type="end") + X1 <- generateX(k=10, type="end") + X1 <- generateX(k=0, type="lines") + X1 <- generateX(k=1, type="lines") + X1 <- generateX(k=2, type="lines") + frame() + dev.off() +} + +# +# # rf1 <- function(x=seq(0,1,length=100)) { +# # m <- ceiling(runif(1)*5) ## number of components +# # f <- x*0 + rnorm(1); +# # mu <- runif(m,min(x),max(x)) +# # sig <- (runif(m)+.5)*(max(x)-min(x))/10 +# # for (i in 1:m) f <- f + dnorm(x,mu[i],sig[i]) +# # f +# # } +# # # matlplot(seq(0,1,length=100), (replicate(50, rf1()))) +# # +# # rf2 <- function(x=seq(0,1,length=100)) { +# # m <- sample(2:4, 1) ## number of components +# # f <- x*0; +# # for (i in 1:m) f <- f + rnorm(1, sd=1/i) * sin(i/2*pi*x) + rnorm(1, sd=1/i) * cos(i/2*pi*x) +# # f +# # } +# # # matlplot(seq(0,1,length=100), (replicate(50, rf2()))) +# +# rf3 <- function(x=seq(0,1,length=100)) { +# rnorm(1)/2 + rnorm(1)*(x-.5) + rnorm(1)*(x-.2)^2 + rnorm(1)*(x-.8)^3 +# } +# # matlplot(seq(0,1,length=100), (replicate(50, rf3()))) +# +# rf4 <- function(x=seq(0,1,length=100)) { +# drop(bs(x, 5, int=TRUE) %*% ((-2:2)/2+rnorm(5))) +# } +# #matlplot(seq(0,1,length=100), (replicate(50, rf4()))) +# +# # rf5 <- function(x=seq(0,1,length=100)) { +# # m <- ceiling(runif(1)*5)+1 +# # w <- rnorm(m, sd=1/(1:m)) +# # drop(poly(x, m+1)[,-1]%*%w) +# # } +# # matlplot(seq(0,1,length=100), scale(replicate(50, rf5()))) + +# # standardize matrix, so that colSums are zero +# zeroConstraint <- function(x){ +# stopifnot(is.matrix(x)) +# t(t(x) - colMeans(x)) +# } + +# # generate zero centered scalar covariates +# cenScalarCof <- function(n){ +# z <- runif(n) - 0.5 +# z <- z - mean(z) +# z +# } + +## built a regular grid over the range of a scalar covariable +#zgrid <- function (z, l=40) seq(min(z), max(z), l=l) + +# # generate a smooth global intercept +# # global intercept +# intf <- function(t){ +# 0.5*cos(3*pi*t^2) +# } + +# generate smooth intercept +intf1 <- function(t){ + # 1 + log(t+0.5) + 1 + 2*sqrt(t) +} + + +# ## beta(s,t) +# (from Sonja's example) +test1 <- function(s, t){ + + stopifnot(length(s)==length(t)) + ret <- 1/2* sin(s*2*t*pi)*log(1+s+t) + s*t*2 + exp(s)*t^2 + ret[s>t] <- 0 + + return(ret) +} +# persp(seq(0,1, l=20), seq(0,1, l=20), outer(seq(0,1, l=20),seq(0,1, l=20), test1)) +# image(seq(0,1, l=31), seq(0,1, l=20), outer(seq(0,1, l=31), seq(0,1, l=20), test1)) + + +# (from ?gam example) +test2 <- function(s, t, ss=0.3, st=0.4){ + + stopifnot(length(s)==length(t)) +# ret <- 4*((pi^ss*st)*(1.2*exp(-(s-0.2)^2/ss^2-(t-0.3)^2/st^2) + +# 0.8*exp(-(s-0.7)^2/ss^2-(t-0.8)^2/st^2))) + ret <- 1.5*sin(pi*t+0.3) * sin(pi*s) + ret[s>t] <- 0 + + return(ret) +} + +# persp(seq(0,1, l=20), seq(0,1, l=20), outer(seq(0,1, l=20),seq(0,1, l=20), test2)) + + +# # Harezlak etAl. 2007 +# test3 <- function(s, t, a1=3, a2=1, a3=1, a4=1){ +# stopifnot(length(s)==length(t)) +# +# ret <- a4*sin(a1*t - a2*s) + a3 # Harezlak etAl. 2007 +# +# ret[s>t] <- 0 +# +# return(ret) +# } +# +# # persp(seq(0,1, l=20), seq(0,1, l=20), outer(seq(0,1, l=20),seq(0,1, l=20), test3)) +# # persp(seq(0,1, l=20), seq(0,1, l=20), outer(seq(0,1, l=20),seq(0,1, l=20), test3, 6, 3, 0, 10), ticktype="detailed") +# +# # g2zt <- function(z, t){ 2*(-t^2-0.1)*sin(pi*z+0.5) } +# # #g2zt <- function(z, t){ 2*(-t^2-0.1)*cos(pi*z + pi/4) } + + +# similar to Harezlak etAl. 2007 with reparametrization to 1, ..., 16 +test3 <- function(s, t, a1=3, a2=1, a3=1, a4=1){ + stopifnot(length(s)==length(t)) + + s <- s/15-1 + t <- t/15-1 + + ret <- a4*sin(a1*t + a2*s) + a3 + t + s + + ret[s>t] <- 0 + + return(ret) +} + +### function to set lower triangular to 0 or NA +lowerTo <- function(x, repl=0){ + stopifnot(ncol(x)==nrow(x)) + #x*outer(1:ncol(x), 1:nrow(x), "<=") # gives the same if repl=0 + x[ outer(1:ncol(x), 1:nrow(x), "<=")==FALSE] <- repl + x +} + +#persp(1:16, 1:16, lowerTo(outer(1:16, 1:16, test3, 2, 2, 1, 3), NA), ticktype="detailed", zlab="", theta=30, phi=30) +#persp(1:16, 1:16, lowerTo(outer(1:16, 1:16, test3, 1, 1, 1, 3), NA), ticktype="detailed", zlab="", theta=30, phi=30) +#persp(1:16, 1:16, lowerTo(outer(1:16, 1:16, test3, 0, 3, 1, 3), NA), ticktype="detailed", zlab="", theta=30, phi=30) +#persp(1:16, 1:16, lowerTo(outer(1:16, 1:16, test3, 3, 0, 1, 3), NA), ticktype="detailed", zlab="", theta=30, phi=30) + + + +## function written by Fabian Scheipl for functional effect +## changed coefficient surface to historical effect +randomcoef <- function(s, t, coef=NULL, seed=NULL, df=5, pen=c(1,1), lambda=c(1,1)){ + if(!is.null(seed)) set.seed(seed) + require(splines) + Bs <- bs(s, df=df, intercept = TRUE) + Bt <- bs(t, df=df, intercept = TRUE) + + # Recursion for difference operator matrix + makeDiffOp <- function(degree, dim){ + if(degree==0){ + return(diag(dim)) + } else { + return(diff(makeDiffOp(degree-1, dim))) + } + } + Pt <- lambda[1] * kronecker(crossprod(makeDiffOp(pen[1], df)), diag(df)) + Ps <- lambda[2] * kronecker(diag(df), crossprod(makeDiffOp(pen[2], df))) + P <- .1*diag(df^2) + Pt + Ps + + if(is.null(coef)){ + coef <- matrix(solve(P, rnorm(df^2)), df, df) + } + + + ret <- Bs%*%coef%*%t(Bt) + + rownames(ret) <- round(s, 2) + colnames(ret) <- round(t, 2) + + for(i in 1:length(s)){ + for(j in 1:length(t)){ + if(s[i] > t[j]){ + ret[i, j] <- 0 + } + } + } + + attr(ret, "coef") <- coef + + return(ret) + +} + + +## coefficient functions with FIRST order differences +pen1coef4 <- function(s, t, coef=NULL) randomcoef(s,t, coef=coef, df=4, lambda=c(1,1), pen=c(1,1)) +#pen.1coef4 <- function(s,t, coef=NULL) randomcoef(s,t, coef=coef, df=4, lambda=c(.1,.1)) +#pen1coef6 <- function(s, t, coef=NULL) randomcoef(s, t, coef=coef, df=6) +#pen.1coef6 <- function(s,t, coef=NULL) randomcoef(s,t, coef=coef, df=6, lambda=c(.1,.1)) + + +## coefficient functions with SECOND order differences +#pen1coef4s <- function(s, t, coef=NULL) randomcoef(s,t, coef=coef, df=4, pen=c(2,2)) +pen2coef4 <- function(s,t, coef=NULL) randomcoef(s,t, coef=coef, df=4, lambda=c(1,1), pen=c(2,2)) + +#pen1coef2 <- function(s, t, coef=NULL) randomcoef(s,t, coef=coef, df=2) + +if(FALSE){ + s <- seq(0, 1, l=25) + t <- seq(0, 1, l=25) + test <- pen1coef6(s, t, coef=NULL) + #persp(s, t, test, ticktype="detailed") + #test2 <- pen1coef6(sgrid, tgrid, coef=attr(test, "coef")) + #persp(sgrid, tgrid, test2, ticktype="detailed") + + par(mfrow=c(1,2)) + persp(s, t, lowerTo(pen1coef4(s,t), NA), zlab="", theta=30, phi=30, ticktype="detailed", main="pen1coef4") + persp(s, t, lowerTo(pen2coef4(s,t), NA), zlab="", theta=30, phi=30, ticktype="detailed", main="pen.1coef4") + + +} + + + +############################### +dlv1 <- function(A, B, tol=1e-10){ + ## A, B orthnormal!! + #Rolf Larsson, Mattias Villani (2001) + #"A distance measure between cointegration spaces" + if(NCOL(A)==0 | NCOL(B)==0){ + return(1.0) + } + + if(NROW(A) != NROW(B) | NCOL(A) > NROW(A) | NCOL(B) > NROW(B)){ + return(NA) + } + + if(NCOL(B)<=NCOL(A)){ + Aorth <- MASS::Null(A) + dist <- sum(diag(t(B) %*% Aorth %*% t(Aorth) %*% B)) / + min(NCOL(B), NROW(B) - NCOL(B)) + } else { + Borth <- MASS::Null(B) + dist <- sum(diag(t(A) %*% Borth %*% t(Borth) %*% A)) / + min(NCOL(A), NROW(A)-NCOL(A)) + } + return(dist) +} + +dlv2 <- function(A, B, tol=1e-10){ + ## A, B orthnormal!! + + #Rolf Larsson, Mattias Villani (2001) + #"A distance measure between cointegration spaces" + + + if(NCOL(A)==0 | NCOL(B)==0){ + return(1.0) + } + + if(NROW(A) != NROW(B) | NCOL(A) > NROW(A) | NCOL(B) > NROW(B)){ + return(NA) + } + + trace <- if(NCOL(B)<=NCOL(A)){ + sum(diag(t(B) %*% A %*% t(A) %*% B)) + } else { + sum(diag(t(A) %*% B %*% t(B) %*% A)) + } + + dist <- (min(NCOL(B), NCOL(A)) - trace) + + dist / min(NCOL(A), NCOL(B), + NROW(A) - NCOL(A), NROW(B) - NCOL(B)) +} + +## measure degree of overlap between the spans of X and Y using A=svd(X)$u, B=svd(Y)$u +## code written by Fabian Scheipl +trace_lv <- function(A, B, tol=1e-10){ + ## A, B orthnormal!! + + #Rolf Larsson, Mattias Villani (2001) + #"A distance measure between cointegration spaces" + + if(NCOL(A)==0 | NCOL(B)==0){ + return(0) + } + + if(NROW(A) != NROW(B) | NCOL(A) > NROW(A) | NCOL(B) > NROW(B)){ + return(NA) + } + + trace <- if(NCOL(B)<=NCOL(A)){ + sum(diag(t(B) %*% A %*% t(A) %*% B)) + } else { + sum(diag(t(A) %*% B %*% t(B) %*% A)) + } + trace +} + + + +##################### +## function to compute identifiability checks, part of FDboost 0.0-13 +check_ident <- function(X1, L, Bs, K, xname, penalty, + cumOverlap=FALSE, + limits=NULL, yind=NULL, + t_unique=NULL, + id=NULL, + X1des=NULL, ind0=NULL, xind=NULL, + giveWarnings = TRUE){ + + ## center X1 per column + X1 <- scale(X1, scale=FALSE) + + #print("check.ident") + ## check whether (number of basis functions in Bs) < (number of relevant eigenfunctions of X1) + evls <- svd(X1, nu=0, nv=0)$d^2 # eigenvalues of centered fun. cov. + evls[evls<0] <- 0 + maxK <- max(1, min(which((cumsum(evls)/sum(evls)) >= .995))) + bsdim <- ncol(Bs) # number of basis functions in Bs + #if(maxK < bsdim){ + # warning(" (" , bsdim , ") larger than effective rank of <", xname, "> (", maxK, "). ", + # "Effect identifiable only through penalty.") + #} + ## automatically use less basis-functions in case of problems? + ## you would have to change args$knots accordingly + + ### compute condition number of Ds^t Ds + Ds <- (X1 * L) %*% Bs + DstDs <- crossprod(Ds) + e_DstDs <- try(eigen(DstDs)) + e_DstDs$values <- pmax(0, e_DstDs$values) # set negative eigenvalues to 0 + logCondDs <- log10(e_DstDs$values[1]) - log10(tail(e_DstDs$values, 1)) + if(giveWarnings & logCondDs > 6 & is.null(limits)){ + warning("condition number for <", xname, "> greater than 10^6. ", + "Effect identifiable only through penalty.") + } + + ### compute condition number of Ds^t Ds for subsections of Ds accoring to limits + logCondDs_hist <- NULL + + # look at condition number of Ds for all values of yind for historical effect + # use X1des, as this is the marginal design matrix using the limits + if(!is.null(limits)){ + ind0Bs <- ((!ind0)*1) %*% Bs # matrix to check for 0 columns + ## implementation is suitable for common grid of t, maybe with some missings + ## common grid is assumed if Y(t) is observed at least in 80% for each point + if( all(table(yind)/max(id)>0.8) ){ + if(is.null(t_unique)) t_unique <- sort(unique(yind)) + logCondDs_hist <- rep(NA, length=length(t_unique)) + for(k in 1:length(t_unique)){ + Ds_t <- X1des[yind==t_unique[k], ] # get rows of Ds corresponding to yind + ind0Bs_t <- ind0Bs[yind==t_unique[k], ] # get rows of ind0Bs corresponding to yind + # only keep columns that are not completely 0, otherwise matrix is always rank deficient + # idea: only this part is used to model y(t) at this point + # also delete if not perfectly but almost zero, for all spline bases + Ds_t <- Ds_t[ , apply(ind0Bs_t, 2, function(x) !all(abs(x)<10^-1) ), drop=FALSE ] + if(dim(Ds_t)[2]!=0){ # for matrix with 0 columns does not make sense + DstDs_t <- crossprod(Ds_t) + e_DstDs_t <- try(eigen(DstDs_t)) + e_DstDs_t$values <- pmax(0, e_DstDs_t$values) # set negative eigenvalues to 0 + logCondDs_t <- log10(e_DstDs_t$values[1]) - log10(tail(e_DstDs_t$values, 1)) + logCondDs_hist[k] <- logCondDs_t + } + ## matplot(xind, Bs, type="l", lwd=2, ylim=c(-2,2)); rug(xind); rug(yind, col=2, lwd=2) + ## matplot(knots[1:ncol(Ds_t)], t(Ds_t), type="l", lwd=1, add=TRUE) + ## lines(t_unique, logCondDs_hist-6, col=2, lwd=4) + } + names(logCondDs_hist) <- round(t_unique,2) + + ### implementation for seriously irregular observation points t + }else{ + # use the mean number grid points, in the case of irregular t + #t_unique <- seq(min(yind), max(yind), length=round(mean(table(id)))) + ### use quantiles of yind, as only at places with observations effect can be identifiable + ### using quntiles prevents Ds_t from beeing completely empty + if(is.null(t_unique)) t_unique <- quantile(yind, probs=seq(0,1,length=round(mean(table(id)))) ) + names(t_unique) <- NULL + logCondDs_hist <- rep(NA, length=length(t_unique)-1) + for(k in 1:(length(t_unique)-1)){ + # get rows of Ds corresponding to t_unique[k] <= yind < t_unique[k+1] + Ds_t <- X1des[(t_unique[k] <= yind) & (yind < t_unique[k+1]), ] + ind0Bs_t <- ind0Bs[(t_unique[k] <= yind) & (yind < t_unique[k+1]), ] + # for the last interval: include upper limit + if(k==length(t_unique)-1){ + Ds_t <- X1des[(t_unique[k] <= yind) & (yind <= t_unique[k+1]), ] + ind0Bs_t <- ind0Bs[(t_unique[k] <= yind) & (yind <= t_unique[k+1]), ] + } + # only keep columns that are not completely 0, otherwise matrix is always rank deficient + # idea: only this part is used to model y(t) at this point + # also delete if not perfectly but almost zero, for all spline bases + Ds_t <- Ds_t[ , apply(ind0Bs_t, 2, function(x) !all(abs(x)<10^-1) ), drop=FALSE] + if(dim(Ds_t)[2]!=0){ # for matrix with 0 columns does not make sense + DstDs_t <- crossprod(Ds_t) + e_DstDs_t <- try(eigen(DstDs_t)) + e_DstDs_t$values <- pmax(0, e_DstDs_t$values) # set negative eigenvalues to 0 + logCondDs_t <- log10(e_DstDs_t$values[1]) - log10(tail(e_DstDs_t$values, 1)) + logCondDs_hist[k] <- logCondDs_t + } + } + names(logCondDs_hist) <- round(t_unique[-length(t_unique)],2) + } + if(giveWarnings & any(logCondDs_hist > 6)){ + # get the last entry of t, for which the condition number is >10^6 + temp <- names(which.max(which(logCondDs_hist > 6))) + warning("condition number for <", xname, "> considering limits of historical effect ", + "greater than 10^6, for some time-points up to ", temp, ". ", + "Effect in this region identifiable only through penalty.") + } + } ## end of computation of logCondDs_hist for historical effects + + + ## measure degree of overlap between the spans of ker(t(X1)) and W%*%Bs%*%ker(K) + ## overlap after Larsson and Villani 2001, Scheipl and Greven, 2014 + + tryNA <- function(expr){ + ret <- try(expr, silent = TRUE) + if(any(class(ret)=="try-error")) return(NA) + return(ret) + } + tryNull <- function(expr){ + ret <- try(expr, silent = TRUE) + if(any(class(ret)=="try-error")) return(matrix(NA, 0, 0)) + return(ret) + } + + ### get special measures for kernel overlap of WB_s(P_s) with subset of Xobs + ### overlap measure of Larsson and Villani 2001 + ### as proposed by Scheipl and Greven 2015 + getOverlap <- function(subset, X1, L, Bs, K){ + # In the case that all observations are 0, kernel is everything -> kernel overlap + if(all(X1[ , subset]==0)){ + return(5) + } + KeXsub <- tryNull(Null(t(X1[ , subset]))) + if(ncol(KeXsub)==0){ # no null space + return(0) + } + KePen2sub <- tryNull(diag(L[1,subset]) %*% Bs[subset,] %*% Null(K)) + overlapSub <- tryNA(trace_lv(svd(KeXsub)$u, svd(KePen2sub)$u)) + return(overlapSub) + } + + cumOverlapKe <- NULL + overlapKe <- NULL + overlapKeComplete <- NULL + + # ## cumulative overlap for historical model in the special case of s ntemp){ # case that rest is bigger than group size + # subs <- c(list(1:restm), lapply(1:8, function(i) 1:(restm+i*ntemp)), list(1:ncol(X1))) + # }else{ + # subs <- c(lapply(1:9, function(i) 1:(restm+i*ntemp)), list(1:ncol(X1))) + # } + # cumOverlapKe <- sapply(subs, getOverlap, X1=X1, L=L, Bs=Bs, K=K) + # overlapKe <- max(cumOverlapKe, na.rm = TRUE) #cumOverlapKe[[length(cumOverlapKe)]] + # + # }else{ # overlap between whole matrix X and penalty + # overlapKe <- getOverlap(subset=1:ncol(X1), X1=X1, L=L, Bs=Bs, K=K) + # } + # print("overlapKe") + # print(overlapKe) + # plot( seq(min(t_unique), max(t_unique), l=10), cumOverlapKe, ylim=c(0,1)) + + + ## sequential overlap for historical model with general integraion limits + if(!is.null(limits)){ + + subs <- list() + for(k in 1:length(t_unique)){ + subs[[k]] <- which(limits(s=xind, t=t_unique[k])) + } + cumOverlapKe <- sapply(subs, getOverlap, X1=X1, L=L, Bs=Bs, K=K) + overlapKe <- max(cumOverlapKe, na.rm = TRUE) #cumOverlapKe[[length(cumOverlapKe)]] + + }else{ # overlap between whole matrix X and penalty + overlapKe <- getOverlap(subset=1:ncol(X1), X1=X1, L=L, Bs=Bs, K=K) + } + + overlapKeComplete <- getOverlap(subset=1:ncol(X1), X1=X1, L=L, Bs=Bs, K=K) + + if(giveWarnings & overlapKe >= 1){ + warning("Kernel overlap for <", xname, "> and the specified basis and penalty detected. ", + "Changing basis for X-direction to to make model identifiable through penalty. ", + "Coefficient surface estimate will be inherently unreliable.") + penalty <- "pss" + } + + return(list(logCondDs=logCondDs, logCondDs_hist=logCondDs_hist, + overlapKe=overlapKe, cumOverlapKe=cumOverlapKe, + overlapKeComplete=overlapKeComplete, + maxK=maxK, penalty=penalty)) +} + + + + +## get diagnostic measures of the FDboost model +## code by Fabian Scheipl, from identifiability paper +getDiags <- function(m, data, bl=2, cut=.995){ + + + if(is.null(m)){ + diags <- vector(6, mode="list") + names(diags) <- c("logCondDs", "logCondDs_hist", "overlapKe", + "cumOverlapKe", "maxK", "penalty" ) + return( diags ) + } + + + tryNA <- function(expr){ + ret <- try(expr, silent = TRUE) + if(any(class(ret)=="try-error")) return(NA) + return(ret) + } + tryNull <- function(expr){ + ret <- try(expr, silent = TRUE) + if(any(class(ret)=="try-error")) return(matrix(NA, 0, 0)) + return(ret) + } + + # #get Ds=XWBs & Ps + # Bs <- (m$smooth[[1]]$margin[[1]]$X[seq(1, + # ncol(data$Y)*ncol(data$X1), + # by=ncol(data$Y)), ]) + # Ds <- (data$X1 * m$pffr$ff[[1]]$L) %*% Bs + # + # DstDs <- crossprod(Ds) + # Ps <- m$sig2 * m$sp[1] * m$smooth[[1]]$margin[[1]]$S[[1]] + + limitsDefault <- function(s, t) { + (s < t) | (s == t) + } + + + if(any(class(m)=="FDboost")){ + # Ds <- X1des + # Ps <- K1 + # Bs <- Bs + Bs <- get("args", environment(m$baselearner[[bl]]$dpp))$Bs + L <- get("args", environment(m$baselearner[[bl]]$dpp))$L + Xobs <- scale(m$baselearner[[bl]]$get_data()[[1]], scale=FALSE) + ### use Ds like for functional model (NOT historical model) + Ds <- (Xobs * L) %*% Bs + #Ds <- get("args", environment(m$baselearner[[bl]]$dpp))$X1des + Ps <- get("args", environment(m$baselearner[[bl]]$dpp))$K1 + + D <- extract(m, "design", which=bl)[[1]] + ### multiply the penalty matrix with the corresponding lambda?? + ### should be irrelevant for boosting, as there is only one lambda in both directions + P <- extract(m, "penalty", which=bl)[[1]] + # P <- extract(m, "lambda")[[bl]] + + + ## get information necessary for ident_check() + xind <- get("args", environment(m$baselearner[[bl]]$dpp))$s + yind <- m$yind + id <- m$id + + ind0 <- !t(outer( xind, yind, limitsDefault) ) + + X1 <- m$baselearner[[bl]]$get_data()[[1]] + X1des <- X1[id, ] + X1des[ind0] <- 0 + #X1des <- Matrix(X1des, sparse=TRUE) # convert into sparse matrix + # X1des <- X1des * Lnew + X1des <- X1des %*% Bs + + + }else{ + # if(m$long){ + # Bs <- unique(m$smooth[[bl]]$margin[[1]]$X) + # }else{ + # Bs <- (m$smooth[[bl]]$margin[[1]]$X[seq(1, + # ncol(data$Y)*ncol(data$X1), + # by=ncol(data$Y)), ]) + # } + + Bs <- unique(m$smooth[[bl]]$margin[[1]]$X) + L <- m$pffr$ff[[bl-1]]$L + Xobs <- scale(m$pffr$ff[[bl-1]]$LX / L, scale=FALSE) + Ds <- (Xobs * L) %*% Bs + #Ps <- m$sig2 * m$sp[3] * m$smooth[[bl]]$margin[[1]]$S[[1]] + Ps <- m$smooth[[bl]]$margin[[1]]$S[[1]] + + ### get desig and penalty matrix of historical effect + D <- predict(m, type="lpmatrix", reformat = FALSE)[ ,(m$smooth[[bl]]$first.para):(m$smooth[[bl]]$last.para)] + + if(bl==2){ + where.sp <- c(2,3) + }else{ + where.sp <- c(4,5) + } + + Pt <- m$smooth[[bl]]$margin[[2]]$S[[1]] + #P <- (m$sig2*m$sp[where.sp[1]]) * kronecker(Ps , diag(ncol(Pt))) + + # (m$sig2*m$sp[where.sp[2]]) * kronecker(diag(ncol(Ps)), Pt) + + P <- kronecker(Ps , diag(ncol(Pt))) + kronecker(diag(ncol(Ps)), Pt) + + ## get information necessary for ident_check() + xind <- data$s + yind <- data$tlong + id <- data$id + + ind0 <- !t(outer( xind, yind, limitsDefault) ) + + X1 <- data[[paste0("X", bl-1)]] + X1des <- X1[id, ] + X1des[ind0] <- 0 + #X1des <- Matrix(X1des, sparse=TRUE) # convert into sparse matrix + # X1des <- X1des * Lnew + X1des <- X1des %*% Bs + + } + + + ########### use check_ident() from package FDboost + #browser() + ident_check <- check_ident(X1=Xobs, L=L, Bs=Bs, K=Ps, xname="test", penalty="ps", + cumOverlap = FALSE, limits = limitsDefault, + yind = yind, t_unique=sort(unique(yind)), + id = id, X1des = X1des, ind0 = ind0, xind = xind, + giveWarnings=FALSE) + + ident_check + +} + + + + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost-package.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost-package.Rd new file mode 100644 index 0000000..cb90f8c --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost-package.Rd @@ -0,0 +1,87 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/FDboost-package.R +\docType{package} +\name{FDboost-package} +\alias{FDboost-package} +\alias{FDboost_package} +\alias{package-FDboost} +\title{FDboost: Boosting Functional Regression Models} +\description{ +Regression models for functional data, i.e., scalar-on-function, +function-on-scalar and function-on-function regression models, are fitted +by a component-wise gradient boosting algorithm. +} +\details{ +This package is intended to fit regression models with functional variables. +It is possible to fit models with functional response and/or functional covariates, +resulting in scalar-on-function, function-on-scalar and function-on-function regression. +Furthermore, the package can be used to fit density-on-scalar regression models. +Details on the functional regression models that can be fitted with \pkg{FDboost} +can be found in Brockhaus et al. (2015, 2017, 2018) and Ruegamer et al. (2018). +A hands-on tutorial for the package can be found +in Brockhaus, Ruegamer and Greven (2020), see . +For density-on-scalar regression models see Maier et al. (2021). + +Using component-wise gradient boosting as fitting procedure, \pkg{FDboost} relies on +the R package \pkg{mboost} (Hothorn et al., 2017). +A comprehensive tutorial to \pkg{mboost} is given in Hofner et al. (2014). + +The main fitting function is \code{\link{FDboost}}. +The model complexity is controlled by the number of boosting iterations (mstop). +Like the fitting procedures in \pkg{mboost}, the function \code{FDboost} DOES NOT +select an appropriate stopping iteration. This must be chosen by the user. +The user can determine an adequate stopping iteration by resampling methods like +cross-validation or bootstrap. +This can be done using the function \code{\link{applyFolds}}. + +Aside from common effect surface plots, tensor product factorization via the +function \code{\link{factorize}} presents an alternative tool for visualization +of estimated effects for non-linear function-on-scalar models +(Stoecker, Steyer and Greven (2022), \url{https://arxiv.org/abs/2109.02624}). +After factorization, effects are decomposed multiple scalar effects into +functional main effect directions, which can be separately plotted allowing to +visualize more complex effect structures. +} +\references{ +Brockhaus, S., Ruegamer, D. and Greven, S. (2020): +Boosting Functional Regression Models with FDboost. +Journal of Statistical Software, 94(10), 1–50. + + +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +The functional linear array model. Statistical Modelling, 15(3), 279-300. + +Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +Boosting flexible functional regression models with a high number of functional historical effects, +Statistics and Computing, 27(4), 913-926. + +Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): +Signal regression models for location, scale and shape with an application to stock returns. +Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 665-686. + +Hothorn T., Buehlmann P., Kneib T., Schmid M., and Hofner B. (2017). mboost: Model-Based Boosting, +R package version 2.8-1, \url{https://cran.r-project.org/package=mboost} + +Hofner, B., Mayr, A., Robinzonov, N., Schmid, M. (2014). Model-based Boosting in R: +A Hands-on Tutorial Using the R Package mboost. Computational Statistics, 29, 3-35. +\url{https://cran.r-project.org/package=mboost/vignettes/mboost_tutorial.pdf} + +Maier, E.-M., Stoecker, A., Fitzenberger, B., Greven, S. (2021): +Additive Density-on-Scalar Regression in Bayes Hilbert Spaces with an Application to Gender Economics. +arXiv preprint arXiv:2110.11771. + +Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). +Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. +Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. + +Stoecker A., Steyer L., Greven S. (2022): +Functional Additive Models on Manifolds of Planar Shapes and Forms. +arXiv preprint arXiv:2109.02624. +} +\seealso{ +\code{\link{FDboost}} for the main fitting function and +\code{\link{applyFolds}} for model tuning via resampling methods. +} +\author{ +Sarah Brockhaus, David Ruegamer and Almond Stoecker +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost.Rd new file mode 100644 index 0000000..7703136 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost.Rd @@ -0,0 +1,463 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/FDboost.R +\name{FDboost} +\alias{FDboost} +\title{Model-based Gradient Boosting for Functional Response} +\usage{ +FDboost( + formula, + timeformula, + id = NULL, + numInt = "equal", + data, + weights = NULL, + offset = NULL, + offset_control = o_control(), + check0 = FALSE, + ... +) +} +\arguments{ +\item{formula}{a symbolic description of the model to be fit. +Per default no intercept is added, only a smooth offset, see argument \code{offset}. +To add a smooth intercept, use 1, e.g., \code{y ~ 1} for a pure intercept model.} + +\item{timeformula}{one-sided formula for the specification of the effect over the index of the response. +For functional response \eqn{Y_i(t)} typically use \code{~ bbs(t)} to obtain smooth +effects over \eqn{t}. +In the limiting case of \eqn{Y_i} being a scalar response, +use \code{~ bols(1)}, which sets up a base-learner for the scalar 1. +Or use \code{timeformula = NULL}, then the scalar response is treated as scalar.} + +\item{id}{defaults to NULL which means that all response trajectories are observed +on a common grid allowing to represent the response as a matrix. +If the response is given in long format for observation-specific grids, \code{id} +contains the information which observations belong to the same trajectory and must +be supplied as a formula, \code{~ nameid}, where the variable \code{nameid} should +contain integers 1, 2, 3, ..., N.} + +\item{numInt}{integration scheme for the integration of the loss function. +One of \code{c("equal", "Riemann")} meaning equal weights of 1 or +trapezoidal Riemann weights. +Alternatively a vector of length \code{ncol(response)} containing +positive weights can be specified.} + +\item{data}{a data frame or list containing the variables in the model.} + +\item{weights}{only for internal use to specify resampling weights; +per default all weights are equal to 1.} + +\item{offset}{a numeric vector to be used as offset over the index of the response (optional). +If no offset is specified, per default \code{offset = NULL} which means that a +smooth time-specific offset is computed and used before the model fit to center the data. +If you do not want to use a time-specific offset, set \code{offset = "scalar"} to get an overall scalar offset, +like in \code{mboost}.} + +\item{offset_control}{parameters for the estimation of the offset, +defaults to \code{o_control()}, see \code{\link{o_control}}.} + +\item{check0}{logical, for response in matrix form, i.e. response that is observed on a common grid, +check the fitted effects for the sum-to-zero constraint +\eqn{h_j(x_i)(t) = 0} for all \eqn{t} and give a warning if it is not fulfilled. Defaults to \code{FALSE}.} + +\item{...}{additional arguments passed to \code{\link[mboost]{mboost}}, +including, \code{family} and \code{control}.} +} +\value{ +An object of class \code{FDboost} that inherits from \code{mboost}. +Special \code{\link{predict.FDboost}}, \code{\link{coef.FDboost}} and +\code{\link{plot.FDboost}} methods are available. +The methods of \code{\link[mboost]{mboost}} are available as well, +e.g., \code{\link[mboost:methods]{extract}}. +The \code{FDboost}-object is a named list containing: +\item{...}{all elements of an \code{mboost}-object} +\item{yname}{the name of the response} +\item{ydim}{dimension of the response matrix, if the response is represented as such} +\item{yind}{the observation (time-)points of the response, i.e. the evaluation points, + with its name as attribute} +\item{data}{the data that was used for the model fit} +\item{id}{the id variable of the response} +\item{predictOffset}{the function to predict the smooth offset} +\item{offsetFDboost}{offset as specified in call to FDboost} +\item{offsetMboost}{offset as given to mboost} +\item{call}{the call to \code{FDboost}} +\item{callEval}{the evaluated function call to \code{FDboost} without data} +\item{numInt}{value of argument \code{numInt} determining the numerical integration scheme} +\item{timeformula}{the time-formula} +\item{formulaFDboost}{the formula with which \code{FDboost} was called} +\item{formulaMboost}{the formula with which \code{mboost} was called within \code{FDboost}} +} +\description{ +Gradient boosting for optimizing arbitrary loss functions, where component-wise models +are utilized as base-learners in the case of functional responses. +Scalar responses are treated as the special case where each functional response has +only one observation. +This function is a wrapper for \code{mboost}'s \code{\link[mboost]{mboost}} and its +siblings to fit models of the general form +\deqn{\xi(Y_i(t) | X_i = x_i) = \sum_{j} h_j(x_i, t), i = 1, ..., N,} +with a functional (but not necessarily continuous) response \eqn{Y(t)}, +transformation function \eqn{\xi}, e.g., the expectation, the median or some quantile, +and partial effects \eqn{h_j(x_i, t)} depending on covariates \eqn{x_i} +and the current index of the response \eqn{t}. The index of the response can +be for example time. +Possible effects are, e.g., a smooth intercept \eqn{\beta_0(t)}, +a linear functional effect \eqn{\int x_i(s)\beta(s,t)ds}, +potentially with integration limits depending on \eqn{t}, +smooth and linear effects of scalar covariates \eqn{f(z_i,t)} or \eqn{z_i \beta(t)}. +A hands-on tutorial for the package can be found at . +} +\details{ +In matrix representation of functional response and covariates each row +represents one functional observation, e.g., \code{Y[i,t_g]} corresponds to \eqn{Y_i(t_g)}, +giving a by matrix. +For the model fit, the matrix of the functional +response evaluations \eqn{Y_i(t_g)} are stacked internally into one long vector. + +If it is possible to represent the model as a generalized linear array model +(Currie et al., 2006), the array structure is used for an efficient implementation, +see \code{\link[mboost]{mboost}}. This is only possible if the design +matrix can be written as the Kronecker product of two marginal design +matrices yielding a functional linear array model (FLAM), +see Brockhaus et al. (2015) for details. +The Kronecker product of two marginal bases is implemented in R-package mboost +in the function \code{\%O\%}, see \code{\link[mboost:baselearners]{\%O\%}}. + +When \code{\%O\%} is called with a specification of \code{df} in both base-learners, +e.g., \code{bbs(x1, df = df1) \%O\% bbs(t, df = df2)}, the global \code{df} for the +Kroneckered base-learner is computed as \code{df = df1 * df2}. +And thus the penalty has only one smoothness parameter lambda resulting in an isotropic penalty. +A Kronecker product with anisotropic penalty is \code{\%A\%}, allowing for different +amount of smoothness in the two directions, see \code{\link{\%A\%}}. +If the formula contains base-learners connected by \code{\%O\%}, \code{\%A\%} or \code{\%A0\%}, +those effects are not expanded with \code{timeformula}, allowing for model specifications +with different effects in time-direction. + +If the response is observed on curve-specific grids it must be supplied +as a vector in long format and the argument \code{id} has +to be specified (as formula!) to define which observations belong to which curve. +In this case the base-learners are built as row tensor-products of marginal base-learners, +see Scheipl et al. (2015) and Brockhaus et al. (2017), for details on how to set up the effects. +The row tensor product of two marginal bases is implemented in R-package mboost +in the function \code{\%X\%}, see \code{\link[mboost:baselearners]{\%X\%}}. + +A scalar response can be seen as special case of a functional response with only +one time-point, and thus it can be represented as FLAM with basis 1 in +time-direction, use \code{timeformula = ~bols(1)}. In this case, a penalty in the +time-direction is used, see Brockhaus et al. (2015) for details. +Alternatively, the scalar response is fitted as scalar response, like in the function +\code{\link[mboost]{mboost}} in package mboost. +The advantage of using \code{FDboost} in that case +is that methods for the functional base-learners are available, e.g., \code{plot}. + +The desired regression type is specified by the \code{family}-argument, +see the help-page of \code{\link[mboost]{mboost}}. For example a mean regression model is obtained by +\code{family = Gaussian()} which is the default or median regression +by \code{family = QuantReg()}; +see \code{\link[mboost]{Family}} for a list of implemented families. + +With \code{FDboost} the following covariate effects can be estimated by specifying +the following effects in the \code{formula} +(similar to function \code{\link[refund]{pffr}} +in R-package refund. +The \code{timeformula} is used to expand the effects in \code{t}-direction. +\itemize{ +\item Linear functional effect of scalar (numeric or factor) covariate \eqn{z} that varies + smoothly over \eqn{t}, i.e. \eqn{z_i \beta(t)}, specified as + \code{bolsc(z)}, see \code{\link{bolsc}}, + or for a group effect with mean zero use \code{brandomc(z)}. +\item Nonlinear effects of a scalar covariate that vary smoothly over \eqn{t}, + i.e. \eqn{f(z_i, t)}, specified as \code{bbsc(z)}, + see \code{\link{bbsc}}. +\item (Nonlinear) effects of scalar covariates that are constant + over \eqn{t}, e.g., \eqn{f(z_i)}, specified as \code{c(bbs(z))}, + or \eqn{\beta z_i}, specified as \code{c(bols(z))}. +\item Interaction terms between two scalar covariates, e.g., \eqn{z_i1 zi2 \beta(t)}, + are specified as \code{bols(z1) \%Xc\% bols(z2)} and + an interaction \eqn{z_i1 f(zi2, t)} as \code{bols(z1) \%Xc\% bbs(z2)}, as + \code{\%Xc\%} applies the sum-to-zero constraint to the desgin matrix of the tensor product + built by \code{\%Xc\%}, see \code{\link{\%Xc\%}}. +\item Function-on-function regression terms of functional covariates \code{x}, + e.g., \eqn{\int x_i(s)\beta(s,t)ds}, specified as \code{bsignal(x, s = s)}, + using P-splines, see \code{\link{bsignal}}. + Terms given by \code{\link{bfpc}} provide FPC-based effects of functional + covariates, see \code{\link{bfpc}}. +\item Function-on-function regression terms of functional covariates \code{x} + with integration limits \eqn{[l(t), u(t)]} depending on \eqn{t}, + e.g., \eqn{\int_[l(t), u(t)] x_i(s)\beta(s,t)ds}, specified as + \code{bhist(x, s = s, time = t, limits)}. The \code{limits} argument defaults to + \code{"s<=t"} which yields a historical effect with limits \eqn{[min(t),t]}, + see \code{\link{bhist}}. +\item Concurrent effects of functional covariates \code{x} + measured on the same grid as the response, i.e., \eqn{x_i(s)\beta(t)}, + are specified as \code{bconcurrent(x, s = s, time = t)}, + see \code{\link{bconcurrent}}. +\item Interaction effects can be estimated as tensor product smooth, e.g., + \eqn{ z \int x_i(s)\beta(s,t)ds} as \code{bsignal(x, s = s) \%X\% bolsc(z)} +\item For interaction effects with historical functional effects, e.g., + \eqn{ z_i \int_[l(t),u(t)] x_i(s)\beta(s,t)ds} the base-learner + \code{bhistx} should be used instead of \code{bhist}, + e.g., \code{bhistx(x, limits) \%X\% bolsc(z)}, see \code{\link{bhistx}}. +\item Generally, the \code{c()}-notation can be used to get effects that are + constant over the index of the functional response. +\item If the \code{formula} in \code{FDboost} contains base-learners connected by +\code{\%O\%}, \code{\%A\%} or \code{\%A0\%}, those effects are not expanded with \code{timeformula}, +allowing for model specifications with different effects in time-direction. +} + +In order to obtain a fair selection of base-learners, the same degrees of freedom (df) +should be specified for all baselearners. If the number of df differs among the base-learners, +the selection is biased towards more flexible base-learners with higher df as they are more +likely to yield larger improvements of the fit. It is recommended to use +a rather small number of df for all base-learners. +It is not possible to specify df larger than the rank of the design matrix. +For base-learners with rank-deficient penalty, it is not possible to specify df smaller than the +rank of the null space of the penalty (e.g., in \code{bbs} unpenalized part of P-splines). +The df of the base-learners in an FDboost-object can be checked using \code{extract(object, "df")}, +see \code{\link[mboost:methods]{extract}}. + +The most important tuning parameter of component-wise gradient boosting +is the number of boosting iterations. It is recommended to use the number of +boosting iterations as only tuning parameter, +fixing the step-length at a small value (e.g., nu = 0.1). +Note that the default number of boosting iterations is 100 which is arbitrary and in most +cases not adequate (the optimal number of boosting iterations can considerably exceed 100). +The optimal stopping iteration can be determined by resampling methods like +cross-validation or bootstrapping, see the function \code{\link{cvrisk.FDboost}} which searches +the optimal stopping iteration on a grid, which in many cases has to be extended. +} +\examples{ +######## Example for function-on-scalar-regression +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## fit median regression model with 100 boosting iterations, +## step-length 0.4 and smooth time-specific offset +## the factors are coded such that the effects are zero for each timepoint t +## no integration weights are used! +mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df = 2) + bolsc(T_A, df = 2), + timeformula = ~ bbs(time, df = 4), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) + +\donttest{ + #### find optimal mstop over 5-fold bootstrap, small number of folds for example + #### do the resampling on the level of curves + + ## possibility 1: smooth offset and transformation matrices are refitted + set.seed(123) + appl1 <- applyFolds(mod1, folds = cv(rep(1, length(unique(mod1$id))), B = 5), + grid = 1:500) + ## plot(appl1) + mstop(appl1) + mod1[mstop(appl1)] + + ## possibility 2: smooth offset is refitted, + ## computes oob-risk and the estimated coefficients on the folds + set.seed(123) + val1 <- validateFDboost(mod1, folds = cv(rep(1, length(unique(mod1$id))), B = 5), + grid = 1:500) + ## plot(val1) + mstop(val1) + mod1[mstop(val1)] + + ## possibility 3: very efficient + ## using the function cvrisk; be careful to do the resampling on the level of curves + folds1 <- cvLong(id = mod1$id, weights = model.weights(mod1), B = 5) + cvm1 <- cvrisk(mod1, folds = folds1, grid = 1:500) + ## plot(cvm1) + mstop(cvm1) + +## look at the model +summary(mod1) +coef(mod1) +plot(mod1) +plotPredicted(mod1, lwdPred = 2) +} + +######## Example for scalar-on-function-regression +data("fuelSubset", package = "FDboost") + +## center the functional covariates per observed wavelength +fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) +fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) + +## to make mboost:::df2lambda() happy (all design matrix entries < 10) +## reduce range of argvals to [0,1] to get smaller integration weights +fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / + (max(uvvis.lambda) - min(uvvis.lambda) )) +fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / + (max(nir.lambda) - min(nir.lambda) )) + +## model fit with scalar response +## include no intercept as all base-learners are centered around 0 +mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE), + timeformula = NULL, data = fuelSubset, control = boost_control(mstop = 200)) + +## additionally include a non-linear effect of the scalar variable h2o +mod2s <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE) + + bbs(h2o, df = 4), + timeformula = NULL, data = fuelSubset, control = boost_control(mstop = 200)) + +## alternative model fit as FLAM model with scalar response; as timeformula = ~ bols(1) +## adds a penalty over the index of the response, i.e., here a ridge penalty +## thus, mod2f and mod2 have different penalties +mod2f <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE), + timeformula = ~ bols(1), data = fuelSubset, control = boost_control(mstop = 200)) + +\donttest{ + ## bootstrap to find optimal mstop takes some time + set.seed(123) + folds2 <- cv(weights = model.weights(mod2), B = 10) + cvm2 <- cvrisk(mod2, folds = folds2, grid = 1:1000) + mstop(cvm2) ## mod2[327] + summary(mod2) + ## plot(mod2) +} + +## Example for function-on-function-regression +if(require(fda)){ + + data("CanadianWeather", package = "fda") + CanadianWeather$l10precip <- t(log(CanadianWeather$monthlyPrecip)) + CanadianWeather$temp <- t(CanadianWeather$monthlyTemp) + CanadianWeather$region <- factor(CanadianWeather$region) + CanadianWeather$month.s <- CanadianWeather$month.t <- 1:12 + + ## center the temperature curves per time-point + CanadianWeather$temp <- scale(CanadianWeather$temp, scale = FALSE) + rownames(CanadianWeather$temp) <- NULL ## delete row-names + + ## fit model with cyclic splines over the year + mod3 <- FDboost(l10precip ~ bols(region, df = 2.5, contrasts.arg = "contr.dummy") + + bsignal(temp, month.s, knots = 11, cyclic = TRUE, + df = 2.5, boundary.knots = c(0.5,12.5), check.ident = FALSE), + timeformula = ~ bbs(month.t, knots = 11, cyclic = TRUE, + df = 3, boundary.knots = c(0.5, 12.5)), + offset = "scalar", offset_control = o_control(k_min = 5), + control = boost_control(mstop = 60), + data = CanadianWeather) + + \donttest{ + #### find the optimal mstop over 5-fold bootstrap + ## using the function applyFolds + set.seed(123) + folds3 <- cv(rep(1, length(unique(mod3$id))), B = 5) + appl3 <- applyFolds(mod3, folds = folds3, grid = 1:200) + + ## use function cvrisk; be careful to do the resampling on the level of curves + set.seed(123) + folds3long <- cvLong(id = mod3$id, weights = model.weights(mod3), B = 5) + cvm3 <- cvrisk(mod3, folds = folds3long, grid = 1:200) + mstop(cvm3) ## mod3[64] + + summary(mod3) + ## plot(mod3, pers = TRUE) + } +} + +######## Example for functional response observed on irregular grid +######## Delete part of observations in viscosity data-set +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## only keep one eighth of the observation points +set.seed(123) +selectObs <- sort(sample(x = 1:(64*46), size = 64*46/4, replace = FALSE)) +dataIrregular <- with(viscosity, list(vis = c(vis)[selectObs], + T_A = T_A, T_C = T_C, + time = rep(time, each = 64)[selectObs], + id = rep(1:64, 46)[selectObs])) + +## fit median regression model with 50 boosting iterations, +## step-length 0.4 and smooth time-specific offset +## the factors are in effect coding -1, 1 for the levels +## no integration weights are used! +mod4 <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept = FALSE) + + bols(T_A, contrasts.arg = "contr.sum", intercept=FALSE), + timeformula = ~ bbs(time, lambda = 100), id = ~id, + numInt = "Riemann", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = dataIrregular, control = boost_control(mstop = 50, nu = 0.4)) +## summary(mod4) +## plot(mod4) +## plotPredicted(mod4, lwdPred = 2) + +\donttest{ + ## Find optimal mstop, small grid/low B for a fast example + set.seed(123) + folds4 <- cv(rep(1, length(unique(mod4$id))), B = 3) + appl4 <- applyFolds(mod4, folds = folds4, grid = 1:50) + ## val4 <- validateFDboost(mod4, folds = folds4, grid = 1:50) + + set.seed(123) + folds4long <- cvLong(id = mod4$id, weights = model.weights(mod4), B = 3) + cvm4 <- cvrisk(mod4, folds = folds4long, grid = 1:50) + mstop(cvm4) +} + +## Be careful if you want to predict newdata with irregular response, +## as the argument index is not considered in the prediction of newdata. +## Thus, all covariates have to be repeated according to the number of observations +## in each response trajectroy. +## Predict four response curves with full time-observations +## for the four combinations of T_A and T_C. +newd <- list(T_A = factor(c(1,1,2,2), levels = 1:2, + labels = c("low", "high"))[rep(1:4, length(viscosity$time))], + T_C = factor(c(1,2,1,2), levels = 1:2, + labels = c("low", "high"))[rep(1:4, length(viscosity$time))], + time = rep(viscosity$time, 4)) + +pred <- predict(mod4, newdata = newd) +## funplot(x = rep(viscosity$time, 4), y = pred, id = rep(1:4, length(viscosity$time))) + + +} +\references{ +Brockhaus, S., Ruegamer, D. and Greven, S. (2017): +Boosting Functional Regression Models with FDboost. + + +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +The functional linear array model. Statistical Modelling, 15(3), 279-300. + +Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +Boosting flexible functional regression models with a high number of functional historical effects, +Statistics and Computing, 27(4), 913-926. + +Currie, I.D., Durban, M. and Eilers P.H.C. (2006): +Generalized linear array models with applications to multidimensional smoothing. +Journal of the Royal Statistical Society, Series B-Statistical Methodology, 68(2), 259-280. + +Scheipl, F., Staicu, A.-M. and Greven, S. (2015): +Functional additive mixed models, Journal of Computational and Graphical Statistics, 24(2), 477-501. +} +\seealso{ +Note that \link{FDboost} calls \code{\link[mboost]{mboost}} directly. +See, e.g., \code{\link[FDboost]{bsignal}} and \code{\link[FDboost]{bbsc}} +for possible base-learners. +} +\author{ +Sarah Brockhaus, Torsten Hothorn +} +\keyword{models} +\keyword{nonlinear} +\keyword{regression} +\keyword{smooth} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboostLSS.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboostLSS.Rd new file mode 100644 index 0000000..6998a35 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboostLSS.Rd @@ -0,0 +1,161 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/FDboostLSS.R +\name{FDboostLSS} +\alias{FDboostLSS} +\title{Model-based Gradient Boosting for Functional GAMLSS} +\usage{ +FDboostLSS( + formula, + timeformula, + data = list(), + families = GaussianLSS(), + control = boost_control(), + weights = NULL, + method = c("cyclic", "noncyclic"), + ... +) +} +\arguments{ +\item{formula}{a symbolic description of the model to be fit. +If \code{formula} is a single formula, the same formula is used for all distribution parameters. +\code{formula} can also be a (named) list, where each list element corresponds to one distribution +parameter of the GAMLSS distribution. The names must be the same as in the \code{families}.} + +\item{timeformula}{one-sided formula for the expansion over the index of the response. +For a functional response \eqn{Y_i(t)} typically \code{~bbs(t)} to obtain a smooth +expansion of the effects along \code{t}. In the limiting case that \eqn{Y_i} is a scalar response +use \code{~bols(1)}, which sets up a base-learner for the scalar 1. +Or you can use \code{timeformula=NULL}, then the scalar response is treated as scalar. +Analogously to \code{formula}, \code{timeformula} can either be a one-sided formula or +a named list of one-sided formulas.} + +\item{data}{a data frame or list containing the variables in the model.} + +\item{families}{an object of class \code{families}. It can be either one of the pre-defined distributions +that come along with the package \code{gamboostLSS} or a new distribution specified by the user +(see \code{\link[gamboostLSS]{Families}} for details). +Per default, the two-parametric \code{\link[gamboostLSS]{GaussianLSS}} family is used.} + +\item{control}{a list of parameters controlling the algorithm. +For more details see \code{\link[mboost]{boost_control}}.} + +\item{weights}{does not work!} + +\item{method}{fitting method, currently two methods are supported: +\code{"cyclic"} (see Mayr et al., 2012) and \code{"noncyclic"} +(algorithm with inner loss of Thomas et al., 2018).} + +\item{...}{additional arguments passed to \code{\link[FDboost]{FDboost}}, +including, \code{family} and \code{control}.} +} +\value{ +An object of class \code{FDboostLSS} that inherits from \code{mboostLSS}. +The \code{FDboostLSS}-object is a named list containing one list entry per distribution parameter +and some attributes. The list is named like the parameters, e.g. mu and sigma, +if the parameters mu and sigma are modeled. Each list-element is an object of class \code{FDboost}. +} +\description{ +Function for fitting generalized additive models for location, scale and shape (GAMLSS) +with functional data using component-wise gradient boosting, for details see +Brockhaus et al. (2018). +} +\details{ +For details on the theory of GAMLSS, see Rigby and Stasinopoulos (2005). +\code{FDboostLSS} calls \code{FDboost} to fit the distribution parameters of a GAMLSS - +a functional boosting model is fitted for each parameter of the response distribution. +In \code{\link[gamboostLSS]{mboostLSS}}, details on boosting of GAMLSS based on +Mayr et al. (2012) and Thomas et al. (2018) are given. +In \code{\link{FDboost}}, details on boosting regression models with functional variables +are given (Brockhaus et al., 2015, Brockhaus et al., 2017). +} +\examples{ +########### simulate Gaussian scalar-on-function data +n <- 500 ## number of observations +G <- 120 ## number of observations per functional covariate +set.seed(123) ## ensure reproducibility +z <- runif(n) ## scalar covariate +z <- z - mean(z) +s <- seq(0, 1, l=G) ## index of functional covariate +## generate functional covariate +if(require(splines)){ + x <- t(replicate(n, drop(bs(s, df = 5, int = TRUE) \%*\% runif(5, min = -1, max = 1)))) +}else{ + x <- matrix(rnorm(n*G), ncol = G, nrow = n) +} +x <- scale(x, center = TRUE, scale = FALSE) ## center x per observation point + +mu <- 2 + 0.5*z + (1/G*x) \%*\% sin(s*pi)*5 ## true functions for expectation +sigma <- exp(0.5*z - (1/G*x) \%*\% cos(s*pi)*2) ## for standard deviation + +y <- rnorm(mean = mu, sd = sigma, n = n) ## draw respone y_i ~ N(mu_i, sigma_i) + +## save data as list containing s as well +dat_list <- list(y = y, z = z, x = I(x), s = s) + +## model fit with noncyclic algorithm assuming Gaussian location scale model +m_boost <- FDboostLSS(list(mu = y ~ bols(z, df = 2) + bsignal(x, s, df = 2, knots = 16), + sigma = y ~ bols(z, df = 2) + bsignal(x, s, df = 2, knots = 16)), + timeformula = NULL, data = dat_list, method = "noncyclic") +summary(m_boost) + +\donttest{ + if(require(gamboostLSS)){ + ## find optimal number of boosting iterations on a grid in 1:1000 + ## using 5-fold bootstrap + ## takes some time, easy to parallelize on Linux + set.seed(123) + cvr <- cvrisk(m_boost, folds = cv(model.weights(m_boost[[1]]), B = 5), + grid = 1:1000, trace = FALSE) + ## use model at optimal stopping iterations + m_boost <- m_boost[mstop(cvr)] ## 832 + + ## plot smooth effects of functional covariates for mu and sigma + oldpar <- par(mfrow = c(1,2)) + plot(m_boost$mu, which = 2, ylim = c(0,5)) + lines(s, sin(s*pi)*5, col = 3, lwd = 2) + plot(m_boost$sigma, which = 2, ylim = c(-2.5,2.5)) + lines(s, -cos(s*pi)*2, col = 3, lwd = 2) + par(oldpar) + } +} +} +\references{ +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015). +The functional linear array model. Statistical Modelling, 15(3), 279-300. + +Brockhaus, S., Melcher, M., Leisch, F. and Greven, S. (2017): +Boosting flexible functional regression models with a high number of functional historical effects, +Statistics and Computing, 27(4), 913-926. + +Brockhaus, S., Fuest, A., Mayr, A. and Greven, S. (2018): +Signal regression models for location, scale and shape with an application to stock returns. +Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 665-686. + +Mayr, A., Fenske, N., Hofner, B., Kneib, T. and Schmid, M. (2012): +Generalized additive models for location, scale and shape for high-dimensional +data - a flexible approach based on boosting. +Journal of the Royal Statistical Society: Series C (Applied Statistics), 61(3), 403-427. + +Rigby, R. A. and D. M. Stasinopoulos (2005): +Generalized additive models for location, scale and shape (with discussion). +Journal of the Royal Statistical Society: Series C (Applied Statistics), 54(3), 507-554. + +Thomas, J., Mayr, A., Bischl, B., Schmid, M., Smith, A., and Hofner, B. (2018), +Gradient boosting for distributional regression - faster tuning and improved +variable selection via noncyclical updates. +Statistics and Computing, 28, 673-687. + +Stoecker, A., Brockhaus, S., Schaffer, S., von Bronk, B., Opitz, M., and Greven, S. (2019): +Boosting Functional Response Models for Location, Scale and Shape with an Application to Bacterial Competition. +\url{https://arxiv.org/abs/1809.09881} +} +\seealso{ +Note that \code{FDboostLSS} calls \code{\link{FDboost}} directly. +} +\author{ +Sarah Brockhaus +} +\keyword{models} +\keyword{nonlinear} +\keyword{regression} +\keyword{smooth} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost_fac-class.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost_fac-class.Rd new file mode 100644 index 0000000..f470d1f --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/FDboost_fac-class.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/factorize.R +\name{FDboost_fac-class} +\alias{FDboost_fac-class} +\title{`FDboost_fac` S3 class for factorized FDboost model components} +\description{ +Model factorization with `factorize()` decomposes an +`FDboost` model into two objects of class `FDboost_fac` - one for the +response and one for the covariate predictor. The first is essentially +an `FDboost` object and the second an `mboost` object, however, +in a 'read-only' mode and slightly adjusted methods (method defaults). +} +\seealso{ +[factorize(), factorize.FDboost()] +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/anisotropic_Kronecker.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/anisotropic_Kronecker.Rd new file mode 100644 index 0000000..91fe090 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/anisotropic_Kronecker.Rd @@ -0,0 +1,160 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/constrainedX.R +\name{anisotropic_Kronecker} +\alias{anisotropic_Kronecker} +\alias{\%A\%} +\alias{\%A0\%} +\alias{\%Xa0\%} +\title{Kronecker product or row tensor product of two base-learners with anisotropic penalty} +\usage{ +bl1 \%A\% bl2 + +bl1 \%A0\% bl2 + +bl1 \%Xa0\% bl2 +} +\arguments{ +\item{bl1}{base-learner 1, e.g. \code{bbs(x1)}} + +\item{bl2}{base-learner 2, e.g. \code{bbs(x2)}} +} +\value{ +An object of class \code{blg} (base-learner generator) with a \code{dpp} function +as for other \code{\link[mboost:baselearners]{baselearners}}. +} +\description{ +Kronecker product or row tensor product of two base-learners allowing for anisotropic penalties. +For the Kronecker product, \code{\%A\%} works in the general case, \code{\%A0\%} for the special case where +the penalty is zero in one direction. +For the row tensor product, \code{\%Xa0\%} works for the special case where +the penalty is zero in one direction. +} +\details{ +When \code{\%O\%} is called with a specification of \code{df} in both base-learners, +e.g. \code{bbs(x1, df = df1) \%O\% bbs(t, df = df2)}, the global \code{df} for the +Kroneckered base-learner is computed as \code{df = df1 * df2}. +And thus the penalty has only one smoothness parameter lambda resulting in an isotropic penalty, +\deqn{P = lambda * [(P1 o I) + (I o P2)],} +with overall penalty \eqn{P}, Kronecker product \eqn{o}, +marginal penalty matrices \eqn{P1, P2} and identity matrices \eqn{I}. +(Currie et al. (2006) introduced the generalized linear array model, which has a design matrix that +is composed of the Kronecker product of two marginal design matrices, which was implemented in mboost +as \code{\%O\%}. +See Brockhaus et al. (2015) for the application of array models to functional data.) + +In contrast, a Kronecker product with anisotropic penalty is obtained by \code{\%A\%}, +which allows for a different amount of smoothness in the two directions. +For example \code{bbs(x1, df = df1) \%A\% bbs(t, df = df2)} results in computing two +different values for lambda for the two marginal design matrices and a global value of +lambda to adjust for the global \code{df}, i.e. +\deqn{P = lambda * [(lambda1 * P1 o I) + (I o lambda2 * P2)],} +with Kronecker product \eqn{o}, +where \eqn{lambda1} is computed individually for \eqn{df1} and \eqn{P1}, +\eqn{lambda2} is computed individually for \eqn{df2} and \eqn{P2}, +and \eqn{lambda} is computed such that the global \eqn{df} hold \eqn{df = df1 * df2}. +For the computation of \eqn{lambda1} and \eqn{lambda2} weights specified in the model +call can only be used when the weights, are such that they are specified on the level +of rows and columns of the response matrix Y, e.g. resampling weights on the level of +rows of Y and integration weights on the columns of Y are possible. +If this the weights cannot be separated to blg1 and blg2 all +weights are set to 1 for the computation of \eqn{lambda1} and \eqn{lambda2} which implies that +\eqn{lambda1} and \eqn{lambda2} are equal over +folds of \code{cvrisk}. The computation of the global \eqn{lambda} considers the +specified \code{weights}, such the global \eqn{df} are correct. + +The operator \code{\%A0\%} treats the important special case where \eqn{lambda1 = 0} or +\eqn{lambda2 = 0}. In this case it suffices to compute the global lambda and computation gets +faster and arbitrary weights can be specified. Consider \eqn{lambda1 = 0} then the penalty becomes +\deqn{P = lambda * [(1 * P1 o I) + (I o lambda2 * P2)] = lambda * lambda2 * (I o P2),} +and only one global \eqn{lambda} is computed which is then \eqn{lambda * lambda2}. + +If the \code{formula} in \code{FDboost} contains base-learners connected by +\code{\%O\%}, \code{\%A\%} or \code{\%A0\%}, +those effects are not expanded with \code{timeformula}, allowing for model specifications +with different effects in time-direction. + +\code{\%Xa0\%} computes like \code{\%X\%} the row tensor product of two base-learners, +with the difference that it sets the penalty for one direction to zero. +Thus, \code{\%Xa0\%} behaves to \code{\%X\%} analogously like \code{\%A0\%} to \code{\%O\%}. +} +\examples{ + +######## Example for anisotropic penalty +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## isotropic penalty, as timeformula is kroneckered to each effect using \%O\% +## only for the smooth intercept \%A0\% is used, as 1-direction should not be penalized +mod1 <- FDboost(vis ~ 1 + + bolsc(T_C, df = 1) + + bolsc(T_A, df = 1) + + bols(T_C, df = 1) \%Xc\% bols(T_A, df = 1), + timeformula = ~ bbs(time, df = 3), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +## cf. the formula that is passed to mboost +mod1$formulaMboost + +## anisotropic effects using \%A0\%, as lambda1 = 0 for all base-learners +## in this case using \%A\% gives the same model, but three lambdas are computed explicitly +mod1a <- FDboost(vis ~ 1 + + bolsc(T_C, df = 1) \%A0\% bbs(time, df = 3) + + bolsc(T_A, df = 1) \%A0\% bbs(time, df = 3) + + bols(T_C, df = 1) \%Xc\% bols(T_A, df = 1) \%A0\% bbs(time, df = 3), + timeformula = ~ bbs(time, df = 3), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +## cf. the formula that is passed to mboost +mod1a$formulaMboost + +## alternative model specification by using a 0-matrix as penalty +## only works for bolsc() as in bols() one cannot specify K +## -> model without interaction term +K0 <- matrix(0, ncol = 2, nrow = 2) +mod1k0 <- FDboost(vis ~ 1 + + bolsc(T_C, df = 1, K = K0) + + bolsc(T_A, df = 1, K = K0), + timeformula = ~ bbs(time, df = 3), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +## cf. the formula that is passed to mboost +mod1k0$formulaMboost + +## optimize mstop for mod1, mod1a and mod1k0 +## ... + +## compare estimated coefficients +\donttest{ +if (interactive()) { + oldpar <- par(mfrow=c(4, 2)) + plot(mod1, which = 1) + plot(mod1a, which = 1) + plot(mod1, which = 2) + plot(mod1a, which = 2) + plot(mod1, which = 3) + plot(mod1a, which = 3) + funplot(mod1$yind, predict(mod1, which=4)) + funplot(mod1$yind, predict(mod1a, which=4)) + par(oldpar) +} +} + +} +\references{ +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +The functional linear array model. Statistical Modelling, 15(3), 279-300. + +Currie, I.D., Durban, M. and Eilers P.H.C. (2006): +Generalized linear array models with applications to multidimensional smoothing. +Journal of the Royal Statistical Society, Series B-Statistical Methodology, 68(2), 259-280. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/applyFolds.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/applyFolds.Rd new file mode 100644 index 0000000..b11e719 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/applyFolds.Rd @@ -0,0 +1,224 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/crossvalidation.R +\name{applyFolds} +\alias{applyFolds} +\alias{cvMa} +\alias{cvLong} +\alias{cvrisk.FDboost} +\title{Cross-Validation and Bootstrapping over Curves} +\usage{ +applyFolds( + object, + folds = cv(rep(1, length(unique(object$id))), type = "bootstrap"), + grid = 1:mstop(object), + fun = NULL, + riskFun = NULL, + numInt = object$numInt, + papply = mclapply, + mc.preschedule = FALSE, + showProgress = TRUE, + compress = FALSE, + ... +) + +\method{cvrisk}{FDboost}( + object, + folds = cvLong(id = object$id, weights = model.weights(object)), + grid = 1:mstop(object), + papply = mclapply, + fun = NULL, + mc.preschedule = FALSE, + ... +) + +cvLong( + id, + weights = rep(1, l = length(id)), + type = c("bootstrap", "kfold", "subsampling", "curves"), + B = ifelse(type == "kfold", 10, 25), + prob = 0.5, + strata = NULL +) + +cvMa( + ydim, + weights = rep(1, l = ydim[1] * ydim[2]), + type = c("bootstrap", "kfold", "subsampling", "curves"), + B = ifelse(type == "kfold", 10, 25), + prob = 0.5, + strata = NULL, + ... +) +} +\arguments{ +\item{object}{fitted FDboost-object} + +\item{folds}{a weight matrix with number of rows equal to the number of observed trajectories.} + +\item{grid}{the grid over which the optimal number of boosting iterations (mstop) is searched.} + +\item{fun}{if \code{fun} is \code{NULL}, the out-of-bag risk is returned. +\code{fun}, as a function of \code{object}, +may extract any other characteristic of the cross-validated models. These are returned as is.} + +\item{riskFun}{only exists in \code{applyFolds}; allows to compute other risk functions than the risk +of the family that was specified in object. +Must be specified as function of arguments \code{(y, f, w = 1)}, where \code{y} is the +observed response, \code{f} is the prediction from the model and \code{w} is the weight. +The risk function must return a scalar numeric value for vector valued input.} + +\item{numInt}{only exists in \code{applyFolds}; the scheme for numerical integration, +see \code{numInt} in \code{\link{FDboost}}.} + +\item{papply}{(parallel) apply function, defaults to \code{\link{mclapply}} from +R package \code{parallel}, see \code{\link[mboost]{cvrisk}} for details.} + +\item{mc.preschedule}{Defaults to \code{FALSE}. Preschedule tasks if they are parallelized using \code{mclapply}. +For details see \code{\link{mclapply}}.} + +\item{showProgress}{logical, defaults to \code{TRUE}.} + +\item{compress}{logical, defaults to \code{FALSE}. Only used to force a meaningful +behaviour of \code{applyFolds} with hmatrix objects when using nested resampling.} + +\item{...}{further arguments passed to the (parallel) apply function.} + +\item{id}{the id-vector as integers 1, 2, ... specifying which observations belong to the same curve, +deprecated in \code{cvMa()}.} + +\item{weights}{a numeric vector of (integration) weights, defaults to 1.} + +\item{type}{character argument for specifying the cross-validation +method. Currently (stratified) bootstrap, k-fold cross-validation, subsampling and +leaving-one-curve-out cross validation (i.e. jack knife on curves) are implemented.} + +\item{B}{number of folds, per default 25 for \code{bootstrap} and +\code{subsampling} and 10 for \code{kfold}.} + +\item{prob}{percentage of observations to be included in the learning samples +for subsampling.} + +\item{strata}{a factor of the same length as \code{weights} for stratification.} + +\item{ydim}{dimensions of response-matrix} +} +\value{ +\code{cvMa} and \code{cvLong} return a matrix of sampling weights to be used in \code{cvrisk}. + +The functions \code{applyFolds} and \code{cvrisk.FDboost} return a \code{cvrisk}-object, +which is a matrix of the computed out-of-bag risk. The matrix has the folds in rows and the +number of boosting iteratins in columns. Furhtermore, the matrix has attributes including: +\item{risk}{name of the applied risk function} +\item{call}{model call of the model object} +\item{mstop}{gird of stopping iterations that is used} +\item{type}{name for the type of folds} +} +\description{ +Cross-validation and bootstrapping over curves to compute the empirical risk for +hyper-parameter selection. +} +\details{ +The number of boosting iterations is an important hyper-parameter of boosting. +It be chosen using the functions \code{applyFolds} or \code{cvrisk.FDboost}. Those functions +compute honest, i.e., out-of-bag, estimates of the empirical risk for different +numbers of boosting iterations. +The weights (zero weights correspond to test cases) are defined via the folds matrix, +see \code{\link[mboost]{cvrisk}} in package mboost. + +In case of functional response, we recommend to use \code{applyFolds}. +It recomputes the model in each fold using \code{FDboost}. Thus, all parameters are recomputed, +including the smooth offset (if present) and the identifiability constraints (if present, only +relevant for \code{bolsc}, \code{brandomc} and \code{bbsc}). +Note, that the function \code{applyFolds} expects folds that give weights +per curve without considering integration weights. + +The function \code{cvrisk.FDboost} is a wrapper for \code{\link[mboost]{cvrisk}} in package mboost. +It overrides the default for the folds, so that the folds are sampled on the level of curves +(not on the level of single observations, which does not make sense for functional response). +Note that the smooth offset and the computation of the identifiability constraints +are not part of the refitting if \code{cvrisk} is used. +Per default the integration weights of the model fit are used to compute the prediction errors +(as the integration weights are part of the default folds). +Note that in \code{cvrisk} the weights are rescaled to sum up to one. + +The functions \code{cvMa} and \code{cvLong} can be used to build an appropriate +weight matrix for functional response to be used with \code{cvrisk} as sampling +is done on the level of curves. The probability for each +curve to enter a fold is equal over all curves. +The function \code{cvMa} takes the dimensions of the response matrix as input argument and thus +can only be used for regularly observed response. +The function \code{cvLong} takes the id variable and the weights as arguments and thus can be used +for responses in long format that are potentially observed irregularly. + +If \code{strata} is defined +sampling is performed in each stratum separately thus preserving +the distribution of the \code{strata} variable in each fold. +} +\note{ +Use argument \code{mc.cores = 1L} to set the numbers of cores that is used in +parallel computation. On Windows only 1 core is possible, \code{mc.cores = 1}, which is the default. +} +\examples{ +Ytest <- matrix(rnorm(15), ncol = 3) # 5 trajectories, each with 3 observations +Ylong <- as.vector(Ytest) +## 4-folds for bootstrap for the response in long format without integration weights +cvMa(ydim = c(5,3), type = "bootstrap", B = 4) +cvLong(id = rep(1:5, times = 3), type = "bootstrap", B = 4) + +if(require(fda)){ + ## load the data + data("CanadianWeather", package = "fda") + + ## use data on a daily basis + canada <- with(CanadianWeather, + list(temp = t(dailyAv[ , , "Temperature.C"]), + l10precip = t(dailyAv[ , , "log10precip"]), + l10precip_mean = log(colMeans(dailyAv[ , , "Precipitation.mm"]), base = 10), + lat = coordinates[ , "N.latitude"], + lon = coordinates[ , "W.longitude"], + region = factor(region), + place = factor(place), + day = 1:365, ## corresponds to t: evaluation points of the fun. response + day_s = 1:365)) ## corresponds to s: evaluation points of the fun. covariate + +## center temperature curves per day +canada$tempRaw <- canada$temp +canada$temp <- scale(canada$temp, scale = FALSE) +rownames(canada$temp) <- NULL ## delete row-names + +## fit the model +mod <- FDboost(l10precip ~ 1 + bolsc(region, df = 4) + + bsignal(temp, s = day_s, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), + timeformula = ~ bbs(day, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), + data = canada) +mod <- mod[75] + +\donttest{ + #### create folds for 3-fold bootstrap: one weight for each curve + set.seed(123) + folds_bs <- cv(weights = rep(1, mod$ydim[1]), type = "bootstrap", B = 3) + + ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations + cvr <- applyFolds(mod, folds = folds_bs, grid = 1:75) + + ## weights per observation point + folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] + attr(folds_bs_long, "type") <- "3-fold bootstrap" + ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations + cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) +} + +\donttest{ + ## plot the out-of-bag risk + oldpar <- par(mfrow = c(1,3)) + plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) + plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) + par(oldpar) +} + +} + +} +\seealso{ +\code{\link[mboost]{cvrisk}} to perform cross-validation with scalar response. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/bbsc.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/bbsc.Rd new file mode 100644 index 0000000..0096ea6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/bbsc.Rd @@ -0,0 +1,171 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/baselearners.R +\name{bbsc} +\alias{bbsc} +\alias{brandomc} +\alias{bolsc} +\title{Constrained Base-learners for Scalar Covariates} +\usage{ +bbsc( + ..., + by = NULL, + index = NULL, + knots = 10, + boundary.knots = NULL, + degree = 3, + differences = 2, + df = 4, + lambda = NULL, + center = FALSE, + cyclic = FALSE +) + +bolsc( + ..., + by = NULL, + index = NULL, + intercept = TRUE, + df = NULL, + lambda = 0, + K = NULL, + weights = NULL, + contrasts.arg = "contr.treatment" +) + +brandomc(..., contrasts.arg = "contr.dummy", df = 4) +} +\arguments{ +\item{...}{one or more predictor variables or one matrix or data +frame of predictor variables.} + +\item{by}{an optional variable defining varying coefficients, +either a factor or numeric variable.} + +\item{index}{a vector of integers for expanding the variables in \code{...}.} + +\item{knots}{either the number of knots or a vector of the positions +of the interior knots (for more details see \code{\link[mboost:baselearners]{bbs}}).} + +\item{boundary.knots}{boundary points at which to anchor the B-spline basis +(default the range of the data). A vector (of length 2) +for the lower and the upper boundary knot can be specified.} + +\item{degree}{degree of the regression spline.} + +\item{differences}{a non-negative integer, typically 1, 2 or 3. +If \code{differences} = \emph{k}, \emph{k}-th-order differences are used as +a penalty (\emph{0}-th order differences specify a ridge penalty).} + +\item{df}{trace of the hat matrix for the base-learner defining the +base-learner complexity. Low values of \code{df} correspond to a +large amount of smoothing and thus to "weaker" base-learners.} + +\item{lambda}{smoothing parameter of the penalty, computed from \code{df} when +\code{df} is specified.} + +\item{center}{See \code{\link[mboost:baselearners]{bbs}}.} + +\item{cyclic}{if \code{cyclic = TRUE} the fitted values coincide at +the boundaries (useful for cyclic covariates such as day time etc.).} + +\item{intercept}{if \code{intercept = TRUE} an intercept is added to the design matrix +of a linear base-learner.} + +\item{K}{in \code{bolsc} it is possible to specify the penalty matrix K} + +\item{weights}{experiemtnal! weights that are used for the computation of the transformation matrix Z.} + +\item{contrasts.arg}{Note that a special \code{contrasts.arg} exists in +package \code{mboost}, namely "contr.dummy". This contrast is used per default +in \code{brandomc}. It leads to a +dummy coding as returned by \code{model.matrix(~ x - 1)} were the +intercept is implicitly included but each factor level gets a +separate effect estimate (for more details see \code{\link[mboost:baselearners]{brandom}}).} +} +\value{ +Equally to the base-learners of package \code{mboost}: + +An object of class \code{blg} (base-learner generator) with a +\code{dpp} function (data pre-processing) and other functions. + +The call to \code{dpp} returns an object of class +\code{bl} (base-learner) with a \code{fit} function. The call to +\code{fit} finally returns an object of class \code{bm} (base-model). +} +\description{ +Constrained base-learners for fitting effects of scalar covariates in models +with functional response +} +\details{ +The base-learners \code{bbsc}, \code{bolsc} and \code{brandomc} are +the base-learners \code{\link[mboost:baselearners]{bbs}}, \code{\link[mboost:baselearners]{bols}} and +\code{\link[mboost:baselearners]{brandom}} with additional identifiability constraints. +The constraints enforce that +\eqn{\sum_{i} \hat h(x_i, t) = 0} for all \eqn{t}, so that +effects varying over \eqn{t} can be interpreted as deviations +from the global functional intercept, see Web Appendix A of +Scheipl et al. (2015). +The constraint is enforced by a basis transformation of the design and penalty matrix. +In particular, it is sufficient to apply the constraint on the covariate-part of the design +and penalty matrix and thus, it is not necessary to change the basis in $t$-direction. +See Appendix A of Brockhaus et al. (2015) for technical details on how to enforce this sum-to-zero constraint. + +Cannot deal with any missing values in the covariates. +} +\examples{ +#### simulate data with functional response and scalar covariate (functional ANOVA) +n <- 60 ## number of cases +Gy <- 27 ## number of observation poionts per response curve +dat <- list() +dat$t <- (1:Gy-1)^2/(Gy-1)^2 +set.seed(123) +dat$z1 <- rep(c(-1, 1), length = n) +dat$z1_fac <- factor(dat$z1, levels = c(-1, 1), labels = c("1", "2")) +# dat$z1 <- runif(n) +# dat$z1 <- dat$z1 - mean(dat$z1) + +# mean and standard deviation for the functional response +mut <- matrix(2*sin(pi*dat$t), ncol = Gy, nrow = n, byrow = TRUE) + + outer(dat$z1, dat$t, function(z1, t) z1*cos(pi*t) ) # true linear predictor +sigma <- 0.1 + +# draw respone y_i(t) ~ N(mu_i(t), sigma) +dat$y <- apply(mut, 2, function(x) rnorm(mean = x, sd = sigma, n = n)) + +## fit function-on-scalar model with a linear effect of z1 +m1 <- FDboost(y ~ 1 + bolsc(z1_fac, df = 1), timeformula = ~ bbs(t, df = 6), data = dat) + +# look for optimal mSTOP using cvrisk() or validateFDboost() + \donttest{ +cvm <- cvrisk(m1, grid = 1:500) +m1[mstop(cvm)] +} +m1[200] # use 200 boosting iterations + +# plot true and estimated coefficients +plot(dat$t, 2*sin(pi*dat$t), col = 2, type = "l", main = "intercept") +plot(m1, which = 1, lty = 2, add = TRUE) + +plot(dat$t, 1*cos(pi*dat$t), col = 2, type = "l", main = "effect of z1") +lines(dat$t, -1*cos(pi*dat$t), col = 2, type = "l") +plot(m1, which = 2, lty = 2, col = 1, add = TRUE) + + +} +\references{ +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +The functional linear array model. Statistical Modelling, 15(3), 279-300. + +Scheipl, F., Staicu, A.-M. and Greven, S. (2015): +Functional Additive Mixed Models, Journal of Computational and Graphical Statistics, 24(2), 477-501. +} +\seealso{ +\code{\link{FDboost}} for the model fit. +\code{\link[mboost:baselearners]{bbs}}, \code{\link[mboost:baselearners]{bols}} +and \code{\link[mboost:baselearners]{brandom}} for the +corresponding base-learners in \code{mboost}. +} +\author{ +Sarah Brockhaus, Almond Stoecker +} +\keyword{models} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/bhistx.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/bhistx.Rd new file mode 100644 index 0000000..8f7a55c --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/bhistx.Rd @@ -0,0 +1,176 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/baselearnersX.R +\name{bhistx} +\alias{bhistx} +\title{Base-learners for Functional Covariates} +\usage{ +bhistx( + x, + limits = "s<=t", + standard = c("no", "time", "length"), + intFun = integrationWeightsLeft, + inS = c("smooth", "linear", "constant"), + inTime = c("smooth", "linear", "constant"), + knots = 10, + boundary.knots = NULL, + degree = 3, + differences = 1, + df = 4, + lambda = NULL, + penalty = c("ps", "pss"), + check.ident = FALSE +) +} +\arguments{ +\item{x}{object of type \code{hmatrix} containing time, index and functional covariate; +note that \code{timeLab} in the \code{hmatrix}-object must be equal to +the name of the time-variable in \code{timeformula} in the \code{FDboost}-call} + +\item{limits}{defaults to \code{"s<=t"} for an historical effect with s<=t; +either one of \code{"s matrix, i.e., each row is one functional observation.} + +\item{s}{vector for the index of the functional variable x(s) giving the +measurement points of the functional covariate.} + +\item{index}{a vector of integers for expanding the covariate in \code{x} +For example, \code{bsignal(X, s, index = index)} is equal to \code{bsignal(X[index,], s)}, +where index is an integer of length greater or equal to \code{NROW(x)}.} + +\item{inS}{the functional effect can be smooth, linear or constant in s, +which is the index of the functional covariates x(s).} + +\item{knots}{either the number of knots or a vector of the positions +of the interior knots (for more details see \code{\link[mboost:baselearners]{bbs}}).} + +\item{boundary.knots}{boundary points at which to anchor the B-spline basis +(default the range of the data). A vector (of length 2) +for the lower and the upper boundary knot can be specified.} + +\item{degree}{degree of the regression spline.} + +\item{differences}{a non-negative integer, typically 1, 2 or 3. Defaults to 1. +If \code{differences} = \emph{k}, \emph{k}-th-order differences are used as +a penalty (\emph{0}-th order differences specify a ridge penalty).} + +\item{df}{trace of the hat matrix for the base-learner defining the +base-learner complexity. Low values of \code{df} correspond to a +large amount of smoothing and thus to "weaker" base-learners.} + +\item{lambda}{smoothing parameter of the penalty, computed from \code{df} when \code{df} is specified.} + +\item{center}{See \code{\link[mboost:baselearners]{bbs}}. +The effect is re-parameterized such that the unpenalized part of the fit is subtracted and only +the penalized effect is fitted, using a spectral decomposition of the penalty matrix. +The unpenalized, parametric part has then to be included in separate +base-learners using \code{bsignal(..., inS = 'constant')} or \code{bsignal(..., inS = 'linear')} +for first (\code{difference = 1}) and second (\code{difference = 2}) order difference penalty respectively. +See the help on the argument \code{center} of \code{\link[mboost:baselearners]{bbs}}.} + +\item{cyclic}{if \code{cyclic = TRUE} the fitted coefficient function coincides at the boundaries +(useful for cyclic covariates such as day time etc.).} + +\item{Z}{a transformation matrix for the design-matrix over the index of the covariate. +\code{Z} can be calculated as the transformation matrix for a sum-to-zero constraint in the case +that all trajectories have the same mean +(then a shift in the coefficient function is not identifiable).} + +\item{penalty}{for \code{bsignal}, by default, \code{penalty = "ps"}, the difference penalty for P-splines is used, +for \code{penalty = "pss"} the penalty matrix is transformed to have full rank, +so called shrinkage approach by Marra and Wood (2011). +For \code{bfpc} the penalty can be either \code{"identity"} for a ridge penalty +(the default) or \code{"inverse"} to use the matrix with the inverse eigenvalues +on the diagonal as penalty matrix or \code{"no"} for no penalty.} + +\item{check.ident}{use checks for identifiability of the effect, based on Scheipl and Greven (2016) +for linear functional effect using \code{bsignal} and +based on Brockhaus et al. (2017) for historical effects using \code{bhist}} + +\item{time}{vector for the index of the functional response y(time) +giving the measurement points of the functional response.} + +\item{limits}{defaults to \code{"s<=t"} for an historical effect with s<=t; +either one of \code{"s matches +stopifnot(all.equal(as.numeric(t(predict(m))), as.numeric(PREDSf))) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + +} +\references{ +Stoecker, A., Steyer L. and Greven, S. (2022): +Functional additive models on manifolds of planar shapes and forms + +} +\seealso{ +[FDboost_fac-class] +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/fitted.FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/fitted.FDboost.Rd new file mode 100644 index 0000000..78de5d6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/fitted.FDboost.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods.R +\name{fitted.FDboost} +\alias{fitted.FDboost} +\title{Fitted values of a boosted functional regression model} +\usage{ +\method{fitted}{FDboost}(object, toFDboost = TRUE, ...) +} +\arguments{ +\item{object}{a fitted \code{FDboost}-object} + +\item{toFDboost}{logical, defaults to \code{TRUE}. In case of regular response in wide format +(i.e., response is supplied as matrix): should the predictions be returned as matrix, or list +of matrices instead of vectors} + +\item{...}{additional arguments passed on to \code{\link{predict.FDboost}}} +} +\value{ +matrix or vector of fitted values +} +\description{ +Takes a fitted \code{FDboost}-object and computes the fitted values. +} +\seealso{ +\code{\link{FDboost}} for the model fit. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/fuelSubset.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/fuelSubset.Rd new file mode 100644 index 0000000..55d56a2 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/fuelSubset.Rd @@ -0,0 +1,67 @@ +\name{fuelSubset} +\alias{fuelSubset} +\docType{data} +\title{Spectral data of fossil fuels} +\description{ + +For 129 laboratory samples of fossil fuels the heat value and the humidity were +determined together with two spectra. +One spectrum is ultraviolet-visible (UV-VIS), measured at 1335 wavelengths in +the range of 250.4 to 878.4 nanometer (nm), the other a near infrared spectrum +(NIR) measured at 2307 wavelengths in the range of 800.4 to 2779.0 nm. +\code{fuelSubset} is a subset of the original dataset containing only 10\% of +the original measures of the spectra, resulting in 231 measures of the +NIR spectrum and 134 measures of the UVVIS spectrum. + +} +\usage{data("fuelSubset")} +\format{ + A data list with 129 observations on the following 7 variables. + \describe{ + \item{\code{heatan}}{heat value in mega joule (mJ)} + \item{\code{h2o}}{humidity in percent} + \item{\code{NIR}}{near infrared spectrum (NIR) } + \item{\code{UVVIS}}{ultraviolet-visible spectrum (UV-VIS)} + \item{\code{nir.lambda}}{wavelength of NIR spectrum in nm} + \item{\code{uvvis.lambda}}{wavelength of UV-VIS spectrum in nm} + \item{\code{h2o.fit}}{predicted values of humidity} + } +} +\details{ +The aim is to predict the heat value using the spectral data. The variable +\code{h2o.fit} was generated by a functional linear regression model, using +both spectra and their derivatives as predictors. +} +\source{ + + Siemens AG + + Fuchs, K., Scheipl, F. & Greven, S. (2015), Penalized scalar-on-functions + regression with interaction term. Computational Statistics and Data Analysis. 81, 38-51. + +} +\examples{ + + data("fuelSubset", package = "FDboost") + + ## center the functional covariates per observed wavelength + fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) + fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) + + ## to make mboost::df2lambda() happy (all design matrix entries < 10) + ## reduce range of argvals to [0,1] to get smaller integration weights + fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / + (max(uvvis.lambda) - min(uvvis.lambda) )) + fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / + (max(nir.lambda) - min(nir.lambda) )) + + + ### fit mean regression model with 100 boosting iterations, + ### step-length 0.1 and + mod <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots=40, df=4, check.ident=FALSE) + + bsignal(NIR, nir.lambda, knots=40, df=4, check.ident=FALSE), + timeformula = NULL, data = fuelSubset) + summary(mod) + ## plot(mod) +} +\keyword{datasets} \ No newline at end of file diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/funMRD.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/funMRD.Rd new file mode 100644 index 0000000..161af1d --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/funMRD.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilityFunctions.R +\name{funMRD} +\alias{funMRD} +\title{Functional MRD} +\usage{ +funMRD(object, overTime = TRUE, breaks = object$yind, global = FALSE, ...) +} +\arguments{ +\item{object}{fitted FDboost-object with regular response} + +\item{overTime}{per default the functional MRD is calculated over time +if \code{overTime=FALSE}, the MRD is calculated per curve} + +\item{breaks}{an optional vector or number giving the time-points at which the model is evaluated. +Can be specified as number of equidistant time-points or as vector of time-points. +Defaults to the index of the response in the model.} + +\item{global}{logical. defaults to \code{FALSE}, +if TRUE the global MRD like in a normal linear model is calculated} + +\item{...}{currently not used} +} +\value{ +Returns a vector with the calculated MRD and some extra information in attributes. +} +\description{ +Calculates the functional MRD for a fitted FDboost-object +} +\details{ +Formula to calculate MRD over time, \code{overTime=TRUE}: \cr +\eqn{ MRD(t) = n^{-1} \sum_i |Y_i(t) - \hat{Y}_i(t)| / |Y_i(t)| } + +Formula to calculate MRD over subjects, \code{overTime=FALSE}: \cr +\eqn{ MRD_{i} = \int |Y_i(t) - \hat{Y}_i(t)| / |Y_i(t)| dt \approx G^{-1} \sum_g |Y_i(t_g) - \hat{Y}_i(t_g)| / |Y_i(t)|} +} +\note{ +\code{breaks} cannot be changed in the case the \code{bsignal()} +is used over the same domain +as the response! In that case you would have to rename the index of the response or that +of the covariates. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/funMSE.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/funMSE.Rd new file mode 100644 index 0000000..dda7486 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/funMSE.Rd @@ -0,0 +1,56 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilityFunctions.R +\name{funMSE} +\alias{funMSE} +\title{Functional MSE} +\usage{ +funMSE( + object, + overTime = TRUE, + breaks = object$yind, + global = FALSE, + relative = FALSE, + root = FALSE, + ... +) +} +\arguments{ +\item{object}{fitted FDboost-object} + +\item{overTime}{per default the functional R-squared is calculated over time +if \code{overTime=FALSE}, the R-squared is calculated per curve} + +\item{breaks}{an optional vector or number giving the time-points at which the model is evaluated. +Can be specified as number of equidistant time-points or as vector of time-points. +Defaults to the index of the response in the model.} + +\item{global}{logical. defaults to \code{FALSE}, +if TRUE the global R-squared like in a normal linear model is calculated} + +\item{relative}{logical. defaults to \code{FALSE}. If \code{TRUE} the MSE is standardized +by the global variance of the response \cr +\eqn{ n^{-1} \int \sum_i (Y_i(t) - \bar{Y})^2 dt \approx G^{-1} n^{-1} \sum_g \sum_i (Y_i(t_g) - \bar{Y})^2 }} + +\item{root}{take the square root of the MSE} + +\item{...}{currently not used} +} +\value{ +Returns a vector with the calculated MSE and some extra information in attributes. +} +\description{ +Calculates the functional MSE for a fitted FDboost-object +} +\details{ +Formula to calculate MSE over time, \code{overTime=TRUE}: \cr +\eqn{ MSE(t) = n^{-1} \sum_i (Y_i(t) - \hat{Y}_i(t))^2 } + +Formula to calculate MSE over subjects, \code{overTime=FALSE}: \cr +\eqn{ MSE_i = \int (Y_i(t) - \hat{Y}_i(t))^2 dt \approx G^{-1} \sum_g (Y_i(t_g) - \hat{Y}_i(t_g))^2} +} +\note{ +\code{breaks} cannot be changed in the case the \code{bsignal()} +is used over the same domain +as the response! In that case you would have to rename the index of the response or that +of the covariates. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/funRsquared.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/funRsquared.Rd new file mode 100644 index 0000000..9985a8c --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/funRsquared.Rd @@ -0,0 +1,53 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilityFunctions.R +\name{funRsquared} +\alias{funRsquared} +\title{Functional R-squared} +\usage{ +funRsquared(object, overTime = TRUE, breaks = object$yind, global = FALSE, ...) +} +\arguments{ +\item{object}{fitted FDboost-object} + +\item{overTime}{per default the functional R-squared is calculated over time +if \code{overTime=FALSE}, the R-squared is calculated per curve} + +\item{breaks}{an optional vector or number giving the time-points at which the model is evaluated. +Can be specified as number of equidistant time-points or as vector of time-points. +Defaults to the index of the response in the model.} + +\item{global}{logical. defaults to \code{FALSE}, +if TRUE the global R-squared like in a normal linear model is calculated} + +\item{...}{currently not used} +} +\value{ +Returns a vector with the calculated R-squared and some extra information in attributes. +} +\description{ +Calculates the functional R-squared for a fitted FDboost-object +} +\details{ +\code{breaks} should be set to some grid, if there are many +missing values or time-points with very few observations in the dataset. +Otherwise at these points of t the variance will be almost 0 +(or even 0 if there is only one observation at a time-point), +and then the prediction by the local means \eqn{\mu(t)} is locally very good. +The observations are interpolated linearly if necessary. + +Formula to calculate R-squared over time, \code{overTime=TRUE}: \cr +\eqn{R^2(t) = 1 - \sum_{i}( Y_i(t) - \hat{Y}_i(t))^2 / \sum_{i}( Y_i(t) - \bar{Y}(t) )^2 } + +Formula to calculate R-squared over subjects, \code{overTime=FALSE}: \cr +\eqn{R^2_i = 1 - \int (Y_i(t) - \hat{Y}_i(t))^2 dt / \int (Y_i(t) - \bar{Y}_i )^2 dt } +} +\note{ +\code{breaks} cannot be changed in the case the \code{bsignal()} +is used over the same domain +as the response! In that case you would have to rename the index of the response or that +of the covariates. +} +\references{ +Ramsay, J., Silverman, B. (2006). Functional data analysis. +Wiley Online Library. chapter 16.3 +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/funplot.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/funplot.Rd new file mode 100644 index 0000000..8b6198a --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/funplot.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilityFunctions.R +\name{funplot} +\alias{funplot} +\title{Plot functional data with linear interpolation of missing values} +\usage{ +funplot(x, y, id = NULL, rug = TRUE, ...) +} +\arguments{ +\item{x}{optional, time-vector for plotting} + +\item{y}{matrix of functional data with functions in rows and measured times in columns; +or vector or functional observations, in this case id has to be specified} + +\item{id}{defaults to NULL for y matrix, is id-variables for y in long format} + +\item{rug}{logical. Should rugs be plotted? Defaults to TRUE.} + +\item{...}{further arguments passed to \code{\link[graphics]{matplot}}.} +} +\value{ +see \code{\link[graphics]{matplot}} +} +\description{ +Plot functional data with linear interpolation of missing values +} +\details{ +All observations are marked by a small cross (\code{pch=3}). +Missing values are imputed by linear interpolation. Parts that are +interpolated are plotted by dotted lines, parts with non-missing values as solid lines. +} +\examples{ +\donttest{ +### examples for regular data in wide format +data(viscosity) +with(viscosity, funplot(timeAll, visAll, pch=20)) +if(require(fda)){ + with(fda::growth, funplot(age, t(hgtm))) +} +} +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.Rd new file mode 100644 index 0000000..046c954 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hmatrix.R +\name{getTime} +\alias{getTime} +\alias{getId} +\alias{getX} +\alias{getArgvals} +\alias{getTimeLab} +\alias{getIdLab} +\alias{getXLab} +\alias{getArgvalsLab} +\title{Generic functions to asses attributes of functional data objects} +\usage{ +getTime(object) + +getId(object) + +getX(object) + +getArgvals(object) + +getTimeLab(object) + +getIdLab(object) + +getXLab(object) + +getArgvalsLab(object) +} +\arguments{ +\item{object}{an R-object, currently implemented for hmatrix and fmatrix} +} +\value{ +properties of a hmatrix or fmatrix +} +\description{ +Extract attributes of an object. +} +\details{ +Extract the time variable \code{getTime}, the id\code{getId}, +the functional covariate \code{getX}, its argument values \code{getArgvals}. +Or the names of the different variables \code{getTimeLab}, +\code{getIdLab}, \code{getXLab}, \code{getArgvalsLab}. +} +\seealso{ +\code{\link{hmatrix}} for the h.atrix class. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.hmatrix.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.hmatrix.Rd new file mode 100644 index 0000000..6139327 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/getTime.hmatrix.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hmatrix.R +\name{getTime.hmatrix} +\alias{getTime.hmatrix} +\alias{getId.hmatrix} +\alias{getX.hmatrix} +\alias{getArgvals.hmatrix} +\alias{getTimeLab.hmatrix} +\alias{getXLab.hmatrix} +\alias{getArgvalsLab.hmatrix} +\alias{getIdLab.hmatrix} +\title{Extract attributes of hmatrix} +\usage{ +\method{getTime}{hmatrix}(object) + +\method{getId}{hmatrix}(object) + +\method{getX}{hmatrix}(object) + +\method{getArgvals}{hmatrix}(object) + +\method{getTimeLab}{hmatrix}(object) + +\method{getIdLab}{hmatrix}(object) + +\method{getXLab}{hmatrix}(object) + +\method{getArgvalsLab}{hmatrix}(object) +} +\arguments{ +\item{object}{object of class hmatrix} +} +\value{ +properties of a hmatrix +} +\description{ +Extract attributes of an object of class \code{hmatrix}. +} +\details{ +Extract the time variable \code{getTime}, the id\code{getId}, +the functional covariate \code{getX}, its argument values \code{getArgvals}. +Or the names of the different variables \code{getTimeLab}, +\code{getIdLab}, \code{getXLab}, \code{getArgvalsLab} for an object of class \code{hmatrix}. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/grapes-Xc-grapes.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/grapes-Xc-grapes.Rd new file mode 100644 index 0000000..11f3826 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/grapes-Xc-grapes.Rd @@ -0,0 +1,86 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/constrainedX.R +\name{\%Xc\%} +\alias{\%Xc\%} +\title{Constrained row tensor product} +\usage{ +bl1 \%Xc\% bl2 +} +\arguments{ +\item{bl1}{base-learner 1, e.g. \code{bols(x1)}} + +\item{bl2}{base-learner 2, e.g. \code{bols(x2)}} +} +\value{ +An object of class \code{blg} (base-learner generator) with a \code{dpp} function +as for other \code{\link[mboost:baselearners]{baselearners}}. +} +\description{ +Combining single base-learners to form new, more complex base-learners, with +an identifiability constraint to center the interaction around the intercept and +around the two main effects. Suitable for functional response. +} +\details{ +Similar to \code{\%X\%} in package \code{mboost}, see +\code{\link[mboost:baselearners]{\%X\%}}, +a row tensor product of linear base-learners is returned by \code{\%Xc\%}. +\code{\%Xc\%} applies a sum-to-zero constraint to the design matrix suitable for +functional response if an interaction of two scalar covariates is specified +in the case that the model contains a global intercept and both main effects, +as the interaction is centered around the intercept and centered around the two main effects. +See Web Appendix A of Brockhaus et al. (2015) for details on how to enforce the constraint +for the functional intercept. +Use, e.g., in a model call to \code{FDboost}, following the scheme, +\code{y ~ 1 + bolsc(x1) + bolsc(x2) + bols(x1) \%Xc\% bols(x2)}, +where \code{1} induces a global intercept and \code{x1}, \code{x2} are factor variables, +see Ruegamer et al. (2018). +} +\examples{ + +######## Example for function-on-scalar-regression with interaction effect of two scalar covariates +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## fit model with interaction that is centered around the intercept +## and the two main effects +mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df=1) + bolsc(T_A, df=1) + + bols(T_C, df=1) \%Xc\% bols(T_A, df=1), + timeformula = ~bbs(time, df=6), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) + +## check centering around intercept +colMeans(predict(mod1, which = 4)) + +## check centering around main effects +colMeans(predict(mod1, which = 4)[viscosity$T_A == "low", ]) +colMeans(predict(mod1, which = 4)[viscosity$T_A == "high", ]) +colMeans(predict(mod1, which = 4)[viscosity$T_C == "low", ]) +colMeans(predict(mod1, which = 4)[viscosity$T_C == "low", ]) + +## find optimal mstop using cvrsik() or validateFDboost() +## ... + +## look at interaction effect in one plot +# funplot(mod1$yind, predict(mod1, which=4)) + +} +\references{ +Brockhaus, S., Scheipl, F., Hothorn, T. and Greven, S. (2015): +The functional linear array model. Statistical Modelling, 15(3), 279-300. + +Ruegamer D., Brockhaus, S., Gentsch K., Scherer, K., Greven, S. (2018). +Boosting factor-specific functional historical models for the detection of synchronization in bioelectrical signals. +Journal of the Royal Statistical Society: Series C (Applied Statistics), 67, 621-642. +} +\author{ +Sarah Brockhaus, David Ruegamer +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/hmatrix.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/hmatrix.Rd new file mode 100644 index 0000000..1400a15 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/hmatrix.Rd @@ -0,0 +1,93 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hmatrix.R +\name{hmatrix} +\alias{hmatrix} +\title{A S3 class for univariate functional data on a common grid} +\usage{ +hmatrix( + time, + id, + x, + argvals = seq_len(ncol(x)), + timeLab = "t", + idLab = "wideIndex", + xLab = "x", + argvalsLab = "s" +) +} +\arguments{ +\item{time}{set of argument values of the response in long format, +i.e. at which \code{t} the response curve is observed} + +\item{id}{specify to which curve the point belongs to, id from 1, 2, ..., n.} + +\item{x}{matrix of functional covariate, each trajectory is in one row} + +\item{argvals}{set of argument values, i.e., the common gird at which the functional covariate +is observed, by default \code{seq_len(ncol(x))}} + +\item{timeLab}{name of the time axis, by default \code{t}} + +\item{idLab}{name of the id variable, by default \code{wideIndex}} + +\item{xLab}{name of the functional variable, by default NULL} + +\item{argvalsLab}{name of the argument for the covariate by default \code{s}} +} +\value{ +An matrix object of type \code{"hmatrix"} +} +\description{ +The hmatrix class represents data for a functional historical effect. +The class is basically a matrix containing the time and the id for the observations of the +functional response. The functional covariate is contained as attribute. +} +\details{ +In the hmatrix class the id has to run from i=1, 2, ..., n including all integers from 1 to n. +The rows of the functional covariate x correspond to those observations. +} +\examples{ +## Example for a hmatrix object +t1 <- rep((1:5)/2, each = 3) +id1 <- rep(1:3, 5) +x1 <- matrix(1:15, ncol = 5) +s1 <- (1:5)/2 +myhmatrix <- hmatrix(time = t1, id = id1, x = x1, argvals = s1, + timeLab = "t1", argvalsLab = "s1", xLab = "test") + +# extract with [ keeps attributes +# select observations of subjects 2 and 3 +myhmatrixSub <- myhmatrix[id1 \%in\% c(2, 3), ] +str(myhmatrixSub) +getX(myhmatrixSub) +getX(myhmatrix) + +# get time +myhmatrix[ , 1] # as column matrix as drop = FALSE +getTime(myhmatrix) # as vector + +# get id +myhmatrix[ , 2] # as column matrix as drop = FALSE +getId(myhmatrix) # as vector + +# subset hmatrix on the basis of an index, which is defined on the curve level +reweightData(data = list(hmat = myhmatrix), vars = "hmat", index = c(1, 1, 2)) +# this keeps only the unique x values in attr(,'x') but multiplies the corresponding +# ids and times in the time id matrix +# for bhistx baselearner, there may be an additional id variable for the tensor product +newdat <- reweightData(data = list(hmat = myhmatrix, + repIDx = rep(seq_len(nrow(attr(myhmatrix,'x'))), length(attr(myhmatrix,"argvals")))), + vars = "hmat", index = c(1,1,2), idvars="repIDx") +length(newdat$repIDx) + +## use hmatrix within a data.frame +mydat <- data.frame(I(myhmatrix), z=rnorm(3)[id1]) +str(mydat) +str(mydat[id1 \%in\% c(2, 3), ]) +str(myhmatrix[id1 \%in\% c(2, 3), ]) + +} +\seealso{ +\code{\link{getTime.hmatrix}} to extract attributes, +and ?"[.hmatrix" for the extract method. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/integrationWeights.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/integrationWeights.Rd new file mode 100644 index 0000000..1d6978f --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/integrationWeights.Rd @@ -0,0 +1,84 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/baselearners.R +\name{integrationWeights} +\alias{integrationWeights} +\alias{integrationWeightsLeft} +\title{Functions to compute integration weights} +\usage{ +integrationWeights(X1, xind, id = NULL) + +integrationWeightsLeft(X1, xind, leftWeight = c("first", "mean", "zero")) +} +\arguments{ +\item{X1}{for functional data that is observed on one common grid, +a matrix containing the observations of the functional variable. +For a functional variable that is observed on curve specific grids, a long vector.} + +\item{xind}{evaluation points (index) of functional variable} + +\item{id}{defaults to \code{NULL}. Only necessary for response in long format. +In this case \code{id} specifies which curves belong together.} + +\item{leftWeight}{one of \code{c("mean", "first", "zero")}. With left Riemann sums +different assumptions for the weight of the first observation are possible. +The default is to use the mean over all integration weights, \code{"mean"}. +Alternatively one can use the first integration weight, \code{"first"}, or +use the distance to zero, \code{"zero"}.} +} +\value{ +Matrix with integration +} +\description{ +Computes trapezoidal integration weights (Riemann sums) for a functional variable +\code{X1} that has evaluation points \code{xind}. +} +\details{ +The function \code{integrationWeights()} computes trapezoidal integration weights, +that are symmetric. Per default those weights are used in the \code{\link{bsignal}}-base-learner. +In the special case of evaluation points (\code{xind}) with equal distances, +all integration weights are equal. + +The function \code{integrationWeightsLeft()} computes weights, +that take into account only the distance to the prior observation point. +Thus one has to decide what to do with the first observation. +The left weights are adequate for historical effects like in \code{\link{bhist}}. +} +\examples{ +## Example for trapezoidal integration weights +xind0 <- seq(0,1,l = 5) +xind <- c(0, 0.1, 0.3, 0.7, 1) +X1 <- matrix(xind^2, ncol = length(xind0), nrow = 2) + +# Regualar observation points +integrationWeights(X1, xind0) +# Irregular observation points +integrationWeights(X1, xind) + +# with missing value +X1[1,2] <- NA +integrationWeights(X1, xind0) +integrationWeights(X1, xind) + +## Example for left integration weights +xind0 <- seq(0,1,l = 5) +xind <- c(0, 0.1, 0.3, 0.7, 1) +X1 <- matrix(xind^2, ncol = length(xind0), nrow = 2) + +# Regular observation points +integrationWeightsLeft(X1, xind0, leftWeight = "mean") +integrationWeightsLeft(X1, xind0, leftWeight = "first") +integrationWeightsLeft(X1, xind0, leftWeight = "zero") + +# Irregular observation points +integrationWeightsLeft(X1, xind, leftWeight = "mean") +integrationWeightsLeft(X1, xind, leftWeight = "first") +integrationWeightsLeft(X1, xind, leftWeight = "zero") + +# obervation points that do not start with 0 +xind2 <- xind + 0.5 +integrationWeightsLeft(X1, xind2, leftWeight = "zero") + +} +\seealso{ +\code{\link{bsignal}} and \code{\link{bhist}} for the base-learners. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/is.hmatrix.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/is.hmatrix.Rd new file mode 100644 index 0000000..0348a03 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/is.hmatrix.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hmatrix.R +\name{is.hmatrix} +\alias{is.hmatrix} +\title{Test to class of hmatrix} +\usage{ +is.hmatrix(object) +} +\arguments{ +\item{object}{object of class hmatrix} +} +\value{ +logical value +} +\description{ +is.hmatrix tests if its argument is an object of class hmatrix. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/o_control.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/o_control.Rd new file mode 100644 index 0000000..672425f --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/o_control.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilityFunctions.R +\name{o_control} +\alias{o_control} +\title{Function to control estimation of smooth offset} +\usage{ +o_control(k_min = 20, rule = 2, silent = TRUE, cyclic = FALSE, knots = NULL) +} +\arguments{ +\item{k_min}{maximal number of k in s()} + +\item{rule}{which rule to use in approx() of the response before calculating the +global mean, rule=1 means no extrapolation, rule=2 means to extrapolate the +closest non-missing value, see \code{\link[stats:approxfun]{approx}}} + +\item{silent}{print error messages of model fit?} + +\item{cyclic}{defaults to FALSE, if TRUE cyclic splines are used} + +\item{knots}{arguments knots passed to \code{\link[mgcv]{gam}}} +} +\value{ +a list with controls +} +\description{ +Function to control estimation of smooth offset +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.FDboost.Rd new file mode 100644 index 0000000..a59a6be --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.FDboost.Rd @@ -0,0 +1,102 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods.R, R/utilityFunctions.R +\name{plot.FDboost} +\alias{plot.FDboost} +\alias{plotPredicted} +\alias{plotResiduals} +\title{Plot the fit or the coefficients of a boosted functional regression model} +\usage{ +\method{plot}{FDboost}( + x, + raw = FALSE, + rug = TRUE, + which = NULL, + includeOffset = TRUE, + ask = TRUE, + n1 = 40, + n2 = 40, + n3 = 20, + n4 = 11, + onlySelected = TRUE, + pers = FALSE, + commonRange = FALSE, + ... +) + +plotPredicted( + x, + subset = NULL, + posLegend = "topleft", + lwdObs = 1, + lwdPred = 1, + ... +) + +plotResiduals(x, subset = NULL, posLegend = "topleft", ...) +} +\arguments{ +\item{x}{a fitted \code{FDboost}-object} + +\item{raw}{logical defaults to \code{FALSE}. +If \code{raw = FALSE} for each effect the estimated function/surface is calculated. +If \code{raw = TRUE} the coefficients of the model are returned.} + +\item{rug}{when \code{TRUE} (default) then the covariate to which the plot applies is +displayed as a rug plot at the foot of each plot of a 1-d smooth, +and the locations of the covariates are plotted as points on the contour plot +representing a 2-d smooth.} + +\item{which}{a subset of base-learners to take into account for plotting.} + +\item{includeOffset}{logical, defaults to \code{TRUE}. Should the offset be included in +the plot of the intercept (default) or should it be plotted separately.} + +\item{ask}{logical, defaults to \code{TRUE}, if several effects are plotted the user +has to hit Return to see next plot.} + +\item{n1}{see below} + +\item{n2}{see below} + +\item{n3}{n1, n2, n3 give the number of grid-points for 1-/2-/3-dimensional +smooth terms used in the marginal equidistant grids over the range of the +covariates at which the estimated effects are evaluated.} + +\item{n4}{gives the number of points for the third dimension in a 3-dimensional smooth term} + +\item{onlySelected, }{logical, defaults to \code{TRUE}. Only plot effects that where +selected in at least one boosting iteration.} + +\item{pers}{logical, defaults to \code{FALSE}, +If \code{TRUE}, perspective plots (\code{\link[graphics]{persp}}) for +2- and 3-dimensional effects are drawn. +If \code{FALSE}, image/contour-plots (\code{\link[graphics]{image}}, +\code{\link[graphics]{contour}}) are drawn for 2- and 3-dimensional effects.} + +\item{commonRange}{logical, defaults to \code{FALSE}, +if \code{TRUE} the range over all effects is the same +(does not affect perspecitve or image plots).} + +\item{...}{other arguments, passed to \code{funplot} (only used in plotPredicted)} + +\item{subset}{subset of the observed response curves and their predictions that is plotted. +Per default all observations are plotted.} + +\item{posLegend}{location of the legend, if a legend is drawn automatically +(only used in plotPredicted). The default is "topleft".} + +\item{lwdObs}{lwd of observed curves (only used in plotPredicted)} + +\item{lwdPred}{lwd of predicted curves (only used in plotPredicted)} +} +\value{ +no return value (plot method) +} +\description{ +Takes a fitted \code{FDboost}-object produced by \code{\link{FDboost}()} and +plots the fitted effects or the coefficient-functions/surfaces. +} +\seealso{ +\code{\link{FDboost}} for the model fit and +\code{\link{coef.FDboost}} for the calculation of the coefficient functions. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.bootstrapCI.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.bootstrapCI.Rd new file mode 100644 index 0000000..cdc674b --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.bootstrapCI.Rd @@ -0,0 +1,53 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bootstrapCIs.R +\name{plot.bootstrapCI} +\alias{plot.bootstrapCI} +\alias{print.bootstrapCI} +\title{Methods for objects of class bootstrapCI} +\usage{ +\method{plot}{bootstrapCI}( + x, + which = NULL, + pers = TRUE, + commonRange = TRUE, + showNumbers = FALSE, + showQuantiles = TRUE, + ask = TRUE, + probs = c(0.25, 0.5, 0.75), + ylim = NULL, + ... +) + +\method{print}{bootstrapCI}(x, ...) +} +\arguments{ +\item{x}{an object of class \code{bootstrapCI}.} + +\item{which}{base-learners that are plotted} + +\item{pers}{plot coefficient surfaces as persp-plots? Defaults to \code{TRUE}.} + +\item{commonRange, }{plot predicted coefficients on a common range, defaults to \code{TRUE}.} + +\item{showNumbers}{show number of curve in plot of predicted coefficients, defaults to \code{FALSE}} + +\item{showQuantiles}{plot the 0.05 and the 0.95 Quantile of coefficients in 1-dim effects.} + +\item{ask}{defaults to \code{TRUE}, ask for next plot using \code{par(ask = ask)}?} + +\item{probs}{vector of quantiles to be used in the plotting of 2-dimensional coefficients surfaces, +defaults to \code{probs = c(0.25, 0.5, 0.75)}} + +\item{ylim}{values for limits of y-axis} + +\item{...}{additional arguments passed to callies.} +} +\value{ +No return value (plot method) or \code{x} itself (print method) +} +\description{ +Methods for objects that are fitted to compute bootstrap confidence intervals. +} +\details{ +\code{plot.bootstrapCI} plots the bootstrapped coefficients. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.validateFDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.validateFDboost.Rd new file mode 100644 index 0000000..bff5eb6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/plot.validateFDboost.Rd @@ -0,0 +1,101 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/crossvalidation.R +\name{mstop.validateFDboost} +\alias{mstop.validateFDboost} +\alias{print.validateFDboost} +\alias{plot.validateFDboost} +\alias{plotPredCoef} +\title{Methods for objects of class validateFDboost} +\usage{ +\method{mstop}{validateFDboost}(object, riskopt = c("mean", "median"), ...) + +\method{print}{validateFDboost}(x, ...) + +\method{plot}{validateFDboost}( + x, + riskopt = c("mean", "median"), + ylab = attr(x, "risk"), + xlab = "Number of boosting iterations", + ylim = range(x$oobrisk), + which = 1, + modObject = NULL, + predictNA = FALSE, + names.arg = NULL, + ask = TRUE, + ... +) + +plotPredCoef( + x, + which = NULL, + pers = TRUE, + commonRange = TRUE, + showNumbers = FALSE, + showQuantiles = TRUE, + ask = TRUE, + terms = TRUE, + probs = c(0.25, 0.5, 0.75), + ylim = NULL, + ... +) +} +\arguments{ +\item{object}{object of class \code{validateFDboost}} + +\item{riskopt}{how the risk is minimized to obtain the optimal stopping iteration; +defaults to the mean, can be changed to the median.} + +\item{...}{additional arguments passed to callies.} + +\item{x}{an object of class \code{validateFDboost}.} + +\item{ylab}{label for y-axis} + +\item{xlab}{label for x-axis} + +\item{ylim}{values for limits of y-axis} + +\item{which}{In the case of \code{plotPredCoef()} the subset of base-learners to take into account for plotting. +In the case of \code{plot.validateFDboost()} the diagnostic plots that are given +(1: empirical risk per fold as a funciton of the boosting iterations, +2: empirical risk per fold, 3: MRD per fold, +4: observed and predicted values, 5: residuals; +2-5 for the model with the optimal number of boosting iterations).} + +\item{modObject}{if the original model object of class \code{FDboost} is given +predicted values of the whole model can be compared to the predictions of the cross-validated models} + +\item{predictNA}{should missing values in the response be predicted? Defaults to \code{FALSE}.} + +\item{names.arg}{names of the observed curves} + +\item{ask}{defaults to \code{TRUE}, ask for next plot using \code{par(ask = ask)} ?} + +\item{pers}{plot coefficient surfaces as persp-plots? Defaults to \code{TRUE}.} + +\item{commonRange, }{plot predicted coefficients on a common range, defaults to \code{TRUE}.} + +\item{showNumbers}{show number of curve in plot of predicted coefficients, defaults to \code{FALSE}} + +\item{showQuantiles}{plot the 0.05 and the 0.95 Quantile of coefficients in 1-dim effects.} + +\item{terms}{logical, defaults to \code{TRUE}; plot the added terms (default) or the coefficients?} + +\item{probs}{vector of quantiles to be used in the plotting of 2-dimensional coefficients surfaces, +defaults to \code{probs = c(0.25, 0.5, 0.75)}} +} +\value{ +No return value (plot method) or the object itself (print method) +} +\description{ +Methods for objects that are fitted to determine the optimal mstop and the +prediction error of a model fitted by FDboost. +} +\details{ +The function \code{mstop.validateFDboost} extracts the optimal mstop by minimizing the +mean (or the median) risk. +\code{plot.validateFDboost} plots cross-validated risk, RMSE, MRD, measured and predicted values +and residuals as determined by \code{validateFDboost}. The function \code{plotPredCoef} plots the +coefficients that were estimated in the folds - only possible if the argument getCoefCV is \code{TRUE} in +the call to \code{validateFDboost}. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost.Rd new file mode 100644 index 0000000..53e2d4a --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods.R +\name{predict.FDboost} +\alias{predict.FDboost} +\title{Prediction for boosted functional regression model} +\usage{ +\method{predict}{FDboost}(object, newdata = NULL, which = NULL, toFDboost = TRUE, ...) +} +\arguments{ +\item{object}{a fitted \code{FDboost}-object} + +\item{newdata}{a named list or a data frame containing the values of the model +covariates at which predictions are required. +If this is not provided then predictions corresponding to the original data are returned. +If \code{newdata} is provided then it should contain all the variables needed for +prediction, in the format supplied to \code{FDboost}, i.e., +functional predictors must be supplied as matrices with each row corresponding to +one observed function.} + +\item{which}{a subset of base-learners to take into account for computing predictions +or coefficients. If which is given (as an integer vector corresponding to base-learners) +a list is returned.} + +\item{toFDboost}{logical, defaults to \code{TRUE}. In case of regular response in wide format +(i.e. response is supplied as matrix): should the predictions be returned as matrix, or list +of matrices instead of vectors} + +\item{...}{additional arguments passed on to \code{\link[mboost]{predict.mboost}()}.} +} +\value{ +a matrix or list of predictions depending on values of unlist and which +} +\description{ +Takes a fitted \code{FDboost}-object produced by \code{\link{FDboost}()} and produces + predictions given a new set of values for the model covariates or the original + values used for the model fit. This is a wrapper + function for \code{\link[mboost]{predict.mboost}()} +} +\seealso{ +\code{\link{FDboost}} for the model fit +and \code{\link{plotPredicted}} for a plot of the observed values and their predictions. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost_fac.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost_fac.Rd new file mode 100644 index 0000000..cf757bc --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/predict.FDboost_fac.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/factorize.R +\name{predict.FDboost_fac} +\alias{predict.FDboost_fac} +\alias{plot.FDboost_fac} +\title{Prediction and plotting for factorized FDboost model components} +\usage{ +\method{predict}{FDboost_fac}(object, newdata = NULL, which = NULL, ...) + +\method{plot}{FDboost_fac}(x, which = NULL, main = NULL, ...) +} +\arguments{ +\item{object, x}{a model-factor given as a \code{FDboost_fac} object} + +\item{newdata}{optionally, a data frame or list +in which to look for variables with which to predict. +See \code{\link[mboost]{predict.mboost}}.} + +\item{which}{a subset of base-learner components to take into +account for computing predictions or coefficients. Different +components are never aggregated to a joint prediction, but always +returned as a matrix or list. Select the k-th component +by name in the format \code{bl(x, ...)[k]} or all components of a base-learner +by dropping the index or all base-learners of a variable by using +the variable name.} + +\item{...}{additional arguments passed to underlying methods.} + +\item{main}{the plot title. By default, base-learner names are used with +component numbers \code{[k]}.} +} +\value{ +A matrix of predictions (for predict method) or no +return value (plot method) +} +\description{ +Prediction and plotting for factorized FDboost model components +} +\seealso{ +[factorize(), factorize.FDboost()] +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/residuals.FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/residuals.FDboost.Rd new file mode 100644 index 0000000..f314038 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/residuals.FDboost.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods.R +\name{residuals.FDboost} +\alias{residuals.FDboost} +\title{Residual values of a boosted functional regression model} +\usage{ +\method{residuals}{FDboost}(object, ...) +} +\arguments{ +\item{object}{a fitted \code{FDboost}-object} + +\item{...}{not used} +} +\value{ +matrix of residual values +} +\description{ +Takes a fitted \code{FDboost}-object and computes the residuals, +more precisely the current value of the negative gradient is returned. +} +\details{ +The residual is missing if the corresponding value of the response was missing. +} +\seealso{ +\code{\link{FDboost}} for the model fit. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/reweightData.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/reweightData.Rd new file mode 100644 index 0000000..7c41029 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/reweightData.Rd @@ -0,0 +1,98 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilityFunctions.R +\name{reweightData} +\alias{reweightData} +\title{Function to Reweight Data} +\usage{ +reweightData( + data, + argvals, + vars, + longvars = NULL, + weights, + index, + idvars = NULL, + compress = FALSE +) +} +\arguments{ +\item{data}{a named list or data.frame.} + +\item{argvals}{character (vector); name(s) for entries in data giving +the index for observed grid points; must be supplied if \code{vars} is not supplied.} + +\item{vars}{character (vector); name(s) for entries in data, which +are subsetted according to weights or index. Must be supplied if \code{argvals} is not supplied.} + +\item{longvars}{variables in long format, e.g., a response that is observed at curve specific grids.} + +\item{weights}{vector of weights for observations. Must be supplied if \code{index} is not supplied.} + +\item{index}{vector of indices for observations. Must be supplied if \code{weights} is not supplied.} + +\item{idvars}{character (vector); index, which is needed to expand \code{vars} to be conform +with the \code{hmatrix} structure when using \code{bhistx}-base-learners or to be conform with +variables in long format specified in \code{longvars}.} + +\item{compress}{logical; whether \code{hmatrix} objects are saved in compressed form or not. Default is \code{TRUE}. +Should be set to \code{FALSE} when using \code{reweightData} for nested resampling.} +} +\value{ +A list with the reweighted or subsetted data. +} +\description{ +Function to Reweight Data +} +\details{ +\code{reweightData} indexes the rows of matrices and / or positions of vectors by using +either the \code{index} or the \code{weights}-argument. To prevent the function from indexing +the list entry / entries, which serve as time index for observed grid points of each trajectory of +functional observations, the \code{argvals} argument (vector of character names for these list entries) +can be supplied. If \code{argvals} is not supplied, \code{vars} must be supplied and it is assumed that +\code{argvals} is equal to \code{names(data)[!names(data) \%in\% vars]}. + +When using \code{weights}, a weight vector of length N must be supplied, where N is the number of observations. +When using \code{index}, the vector must contain the index of each row as many times as it shall be included in the +new data set. +} +\examples{ +## load data +data("viscosity", package = "FDboost") +interval <- "101" +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[ , 1:end]) +viscosity$time <- viscosity$timeAll[1:end] + +## what does data look like +str(viscosity) + +## do some reweighting +# correct weights +str(reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", weights = c(0, 32, 32, rep(0, 61)))) + +str(visNew <- reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", weights = c(0, 32, 32, rep(0, 61)))) +# check the result +# visNew$vis[1:5, 1:5] ## image(visNew$vis) + +# incorrect weights +str(reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", weights = sample(1:64, replace = TRUE)), 1) + +# supply meaningful index +str(visNew <- reweightData(viscosity, vars = c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", index = rep(1:32, each = 2))) +# check the result +# visNew$vis[1:5, 1:5] + +# errors +if(FALSE){ + reweightData(viscosity, argvals = "") + reweightData(viscosity, argvals = "covThatDoesntExist", index = rep(1,64)) + } + +} +\author{ +David Ruegamer, Sarah Brockhaus +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/stabsel.FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/stabsel.FDboost.Rd new file mode 100644 index 0000000..6c72514 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/stabsel.FDboost.Rd @@ -0,0 +1,139 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/stabsel.R +\name{stabsel.FDboost} +\alias{stabsel.FDboost} +\title{Stability Selection} +\usage{ +\method{stabsel}{FDboost}( + x, + refitSmoothOffset = TRUE, + cutoff, + q, + PFER, + folds = cvLong(x$id, weights = rep(1, l = length(x$id)), type = "subsampling", B = B), + B = ifelse(sampling.type == "MB", 100, 50), + assumption = c("unimodal", "r-concave", "none"), + sampling.type = c("SS", "MB"), + papply = mclapply, + verbose = TRUE, + eval = TRUE, + ... +) +} +\arguments{ +\item{x}{fitted FDboost-object} + +\item{refitSmoothOffset}{logical, should the offset be refitted in each learning sample? +Defaults to \code{TRUE}.} + +\item{cutoff}{cutoff between 0.5 and 1. Preferably a value between 0.6 and 0.9 should be used.} + +\item{q}{number of (unique) selected variables (or groups of variables depending on the model) +that are selected on each subsample.} + +\item{PFER}{upper bound for the per-family error rate. This specifies the amount of falsely +selected base-learners, which is tolerated. See details of \code{\link[mboost]{stabsel}}.} + +\item{folds}{a weight matrix with number of rows equal to the number of observations, +see \code{{cvLong}}. Usually one should not change the default here as subsampling +with a fraction of 1/2 is needed for the error bounds to hold. One usage scenario where +specifying the folds by hand might be the case when one has dependent data (e.g. clusters) and +thus wants to draw clusters (i.e., multiple rows together) not individuals.} + +\item{B}{number of subsampling replicates. Per default, we use 50 complementary pairs for the error +bounds of Shah & Samworth (2013) and 100 for the error bound derived in Meinshausen & Buehlmann (2010). +As we use \code{B} complementary pairs in the former case this leads to \code{2B} subsamples.} + +\item{assumption}{Defines the type of assumptions on the distributions of the selection probabilities +and simultaneous selection probabilities. Only applicable for \code{sampling.type = "SS"}. +For \code{sampling.type = "MB"} we always use \code{"none"}.} + +\item{sampling.type}{use sampling scheme of of Shah & Samworth (2013), i.e., with complementary pairs +(\code{sampling.type = "SS"}), or the original sampling scheme of Meinshausen & Buehlmann (2010).} + +\item{papply}{(parallel) apply function, defaults to mclapply. Alternatively, parLapply can be used. +In the latter case, usually more setup is needed (see example of cvrisk for some details).} + +\item{verbose}{logical (default: TRUE) that determines wether warnings should be issued.} + +\item{eval}{logical. Determines whether stability selection is evaluated (\code{eval = TRUE}; default) +or if only the parameter combination is returned.} + +\item{...}{additional arguments to \code{\link[mboost]{cvrisk}} or \code{\link{validateFDboost}}.} +} +\value{ +An object of class \code{stabsel} with a special print method. +For the elements of the object, see \code{\link[mboost]{stabsel}} +} +\description{ +Function for stability selection with functional response. Per default the sampling is done +on the level of curves and if the model contains a smooth functional intercept, this intercept +is refittedn in each sampling fold. +} +\details{ +The number of boosting iterations is an important hyper-parameter of the boosting algorithms +and can be chosen using the functions \code{cvrisk.FDboost} and \code{validateFDboost} as they compute +honest, i.e. out-of-bag, estimates of the empirical risk for different numbers of boosting iterations. +The weights (zero weights correspond to test cases) are defined via the folds matrix, +see \code{\link[mboost]{cvrisk}} in package mboost. +See Hofner et al. (2015) for the combination of stability selection and component-wise boosting. +} +\examples{ +######## Example for function-on-scalar-regression +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## fit a model cotaining all main effects +modAll <- FDboost(vis ~ 1 + + bolsc(T_C, df=1) \%A0\% bbs(time, df=5) + + bolsc(T_A, df=1) \%A0\% bbs(time, df=5) + + bolsc(T_B, df=1) \%A0\% bbs(time, df=5) + + bolsc(rspeed, df=1) \%A0\% bbs(time, df=5) + + bolsc(mflow, df=1) \%A0\% bbs(time, df=5), + timeformula = ~bbs(time, df=5), + numInt = "Riemann", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 10), + data = viscosity, + control = boost_control(mstop = 100, nu = 0.2)) + + +## create folds for stability selection +## only 5 folds for a fast example, usually use 50 folds +set.seed(1911) +folds <- cvLong(modAll$id, weights = rep(1, l = length(modAll$id)), + type = "subsampling", B = 5) + +\donttest{ +## stability selection with refit of the smooth intercept +stabsel_parameters(q = 3, PFER = 1, p = 6, sampling.type = "SS") +sel1 <- stabsel(modAll, q = 3, PFER = 1, folds = folds, grid = 1:200, sampling.type = "SS") +sel1 + +## stability selection without refit of the smooth intercept +sel2 <- stabsel(modAll, refitSmoothOffset = FALSE, q = 3, PFER = 1, + folds = folds, grid = 1:200, sampling.type = "SS") +sel2 +} + +} +\references{ +B. Hofner, L. Boccuto and M. Goeker (2015), Controlling false discoveries in +high-dimensional situations: boosting with stability selection. +BMC Bioinformatics, 16, 1-17. + +N. Meinshausen and P. Buehlmann (2010), Stability selection. +Journal of the Royal Statistical Society, Series B, 72, 417-473. + +R.D. Shah and R.J. Samworth (2013), Variable selection with error control: +another look at stability selection. Journal of the Royal Statistical Society, Series B, 75, 55-80. +} +\seealso{ +\code{\link[mboost]{stabsel}} to perform stability selection for a mboost-object. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/sub-.hmatrix.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/sub-.hmatrix.Rd new file mode 100644 index 0000000..9e53123 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/sub-.hmatrix.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hmatrix.R +\name{[.hmatrix} +\alias{[.hmatrix} +\title{Extract or replace parts of a hmatrix-object} +\usage{ +\method{[}{hmatrix}(x, i, j, ..., drop = FALSE) +} +\arguments{ +\item{x}{object from which to extract element(s) or in which to replace element(s).} + +\item{i, j}{indices specifying elements to extract or replace. Indices are numeric +vectors or empty (missing) or NULL. Numeric values are coerced to integer as by as.integer +(and hence truncated towards zero).} + +\item{...}{not used} + +\item{drop}{If \code{TRUE} the result is coerced to the lowest possible dimension +(or just a matrix). This only works for extracting elements, not for the +replacement, defaults to \code{FALSE}.} +} +\value{ +a \code{"hmatrix"} object +} +\description{ +Operator acting on hmatrix preserving the attributes when rows are extracted. +} +\details{ +If used on columns or rows/columns a matrix is returned. +If used on rows only, i.e. x[i,] an object of class hmatrix is returned. +The id is changed so that it runs from 1, ..., nNew, where nNew is the number of different +id values in the new hmatrix-object. +From the functional covariate \code{x} rows are selected accordingly. +} +\seealso{ +?"[" +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/subset_hmatrix.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/subset_hmatrix.Rd new file mode 100644 index 0000000..7cba3cd --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/subset_hmatrix.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hmatrix.R +\name{subset_hmatrix} +\alias{subset_hmatrix} +\title{Subsets hmatrix according to an index} +\usage{ +subset_hmatrix(x, index, compress = TRUE) +} +\arguments{ +\item{x}{hmatix object that should be subsetted} + +\item{index}{integer vector with (possibly duplicated) indices +for each curve to select} + +\item{compress}{logical, defaults to \code{TRUE}. Only used to force a meaningful +behaviour of \code{applyFolds} with hmatrix objects when using nested resampling.} +} +\value{ +a \code{hmatrix} object +} +\description{ +Subsets hmatrix according to an index +} +\details{ +This methods is primary useful when subsetting repeatedly. +} +\examples{ +t1 <- rep((1:5)/2, each = 3) +id1 <- rep(1:3, 5) +x1 <- matrix(1:15, ncol = 5) +s1 <- (1:5)/2 +hmat <- hmatrix(time = t1, id = id1, x = x1, argvals = s1, timeLab = "t1", + argvalsLab = "s1", xLab = "test") + +index1 <- c(1, 1, 3) +index2 <- c(2, 3, 3) +resMat <- subset_hmatrix(hmat, index = index1) +try(resMat2 <- subset_hmatrix(resMat, index = index2)) +resMat <- subset_hmatrix(hmat, index = index1, compress = FALSE) +try(resMat2 <- subset_hmatrix(resMat, index = index2)) + +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/summary.FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/summary.FDboost.Rd new file mode 100644 index 0000000..39e4b40 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/summary.FDboost.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods.R +\name{summary.FDboost} +\alias{summary.FDboost} +\alias{print.FDboost} +\title{Print and summary of a boosted functional regression model} +\usage{ +\method{summary}{FDboost}(object, ...) + +\method{print}{FDboost}(x, ...) +} +\arguments{ +\item{object}{a fitted \code{FDboost}-object} + +\item{...}{currently not used} + +\item{x}{a fitted \code{FDboost}-object} +} +\value{ +a list with information on the model / a list with summary information +} +\description{ +Takes a fitted \code{FDboost}-object and produces a print +to the console or a summary. +} +\seealso{ +\code{\link{FDboost}} for the model fit. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/truncateTime.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/truncateTime.Rd new file mode 100644 index 0000000..0534c05 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/truncateTime.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilityFunctions.R +\name{truncateTime} +\alias{truncateTime} +\title{Function to truncate time in functional data} +\usage{ +truncateTime(funVar, time, newtime, data) +} +\arguments{ +\item{funVar}{names of functional variables that should be truncated} + +\item{time}{name of time variable} + +\item{newtime}{new time vector that should be used. Must be part of the old time-line.} + +\item{data}{list containing all the data} +} +\value{ +A list with the data containing all variables of the original dataset +with the variables of \code{funVar} truncated according to \code{newtime}. +} +\description{ +Function to truncate time in functional data +} +\note{ +All variables that are not part if \code{funVar}, or \code{time} +are simply copied into the new data list +} +\examples{ +if(require(fda)){ + dat <- fda::growth + dat$hgtm <- t(dat$hgtm[,1:10]) + dat$hgtf <- t(dat$hgtf[,1:10]) + + ## only use time-points 1:16 of variable age + datTr <- truncateTime(funVar=c("hgtm","hgtf"), time="age", newtime=1:16, data=dat) + + \donttest{ + oldpar <- par(mfrow=c(1,2)) + with(dat, funplot(age, hgtm, main="Original data")) + with(datTr, funplot(age, hgtm, main="Yearly data")) + par(mfrow=c(1,1)) + par(oldpar) + } +} +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/update.FDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/update.FDboost.Rd new file mode 100644 index 0000000..8398494 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/update.FDboost.Rd @@ -0,0 +1,58 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods.R +\name{update.FDboost} +\alias{update.FDboost} +\title{Function to update FDboost objects} +\usage{ +\method{update}{FDboost}( + object, + weights = NULL, + oobweights = NULL, + risk = NULL, + trace = NULL, + ..., + evaluate = TRUE +) +} +\arguments{ +\item{object}{fitted FDboost-object} + +\item{weights, oobweights, risk, trace}{see \code{?FDboost}} + +\item{...}{Additional arguments to the call, or arguments with changed values.} + +\item{evaluate}{If true evaluate the new call else return the call.} +} +\value{ +Returns the call of (\code{evaluate = FALSE}) or the updated (\code{evaluate = TRUE}) FDboost model +} +\description{ +Function to update FDboost objects +} +\examples{ +######## Example from \code{?FDboost} +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df = 2) + bolsc(T_A, df = 2), + timeformula = ~ bbs(time, df = 4), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 10, nu = 0.4)) + +# update nu +mod2 <- update(mod1, control=boost_control(nu = 1)) # mstop will stay the same +# update mstop +mod3 <- update(mod2, control=boost_control(mstop = 100)) # nu=1 does not get changed +mod4 <- update(mod1, formula = vis ~ 1 + bolsc(T_C, df = 2)) # drop one term +} +\author{ +David Ruegamer +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/validateFDboost.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/validateFDboost.Rd new file mode 100644 index 0000000..2eaa37f --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/validateFDboost.Rd @@ -0,0 +1,165 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/crossvalidation.R +\name{validateFDboost} +\alias{validateFDboost} +\title{Cross-Validation and Bootstrapping over Curves} +\usage{ +validateFDboost( + object, + response = NULL, + folds = cv(rep(1, length(unique(object$id))), type = "bootstrap"), + grid = 1:mstop(object), + fun = NULL, + getCoefCV = TRUE, + riskopt = c("mean", "median"), + mrdDelete = 0, + refitSmoothOffset = TRUE, + showProgress = TRUE, + ... +) +} +\arguments{ +\item{object}{fitted FDboost-object} + +\item{response}{optional, specify a response vector for the computation of the prediction errors. +Defaults to \code{NULL} which means that the response of the fitted model is used.} + +\item{folds}{a weight matrix with number of rows equal to the number of observed trajectories.} + +\item{grid}{the grid over which the optimal number of boosting iterations (mstop) is searched.} + +\item{fun}{if \code{fun} is \code{NULL}, the out-of-bag risk is returned. +\code{fun}, as a function of \code{object}, +may extract any other characteristic of the cross-validated models. These are returned as is.} + +\item{getCoefCV}{logical, defaults to \code{TRUE}. Should the coefficients and predictions +be computed for all the models on the sampled data?} + +\item{riskopt}{how is the optimal stopping iteration determined. Defaults to the mean, +but median is possible as well.} + +\item{mrdDelete}{Delete values that are \code{mrdDelete} percent smaller than the mean +of the response. Defaults to 0 which means that only response values being 0 +are not used in the calculation of the MRD (= mean relative deviation).} + +\item{refitSmoothOffset}{logical, should the offset be refitted in each learning sample? +Defaults to \code{TRUE}. In \code{\link[mboost]{cvrisk}} the offset of the original model fit in +\code{object} is used in all folds.} + +\item{showProgress}{logical, defaults to \code{TRUE}.} + +\item{...}{further arguments passed to \code{\link{mclapply}}} +} +\value{ +The function \code{validateFDboost} returns a \code{validateFDboost}-object, +which is a named list containing: +\item{response}{the response} +\item{yind}{the observation points of the response} +\item{id}{the id variable of the response} +\item{folds}{folds that were used} +\item{grid}{grid of possible numbers of boosting iterations} +\item{coefCV}{if \code{getCoefCV} is \code{TRUE} the estimated coefficient functions in the folds} +\item{predCV}{if \code{getCoefCV} is \code{TRUE} the out-of-bag predicted values of the response} +\item{oobpreds}{if the type of folds is curves the out-of-bag predictions for each trajectory} +\item{oobrisk}{the out-of-bag risk} +\item{oobriskMean}{the out-of-bag risk at the minimal mean risk} +\item{oobmse}{the out-of-bag mean squared error (MSE)} +\item{oobrelMSE}{the out-of-bag relative mean squared error (relMSE)} +\item{oobmrd}{the out-of-bag mean relative deviation (MRD)} +\item{oobrisk0}{the out-of-bag risk without consideration of integration weights} +\item{oobmse0}{the out-of-bag mean squared error (MSE) without consideration of integration weights} +\item{oobmrd0}{the out-of-bag mean relative deviation (MRD) without consideration of integration weights} +\item{format}{one of "FDboostLong" or "FDboost" depending on the class of the object} +\item{fun_ret}{list of what fun returns if fun was specified} +} +\description{ +DEPRECATED! +The function \code{validateFDboost()} is deprecated, +use \code{\link{applyFolds}} and \code{\link{bootstrapCI}} instead. +} +\details{ +The number of boosting iterations is an important hyper-parameter of boosting +and can be chosen using the function \code{validateFDboost} as they compute +honest, i.e., out-of-bag, estimates of the empirical risk for different numbers of boosting iterations. + +The function \code{validateFDboost} is especially suited to models with functional response. +Using the option \code{refitSmoothOffset} the offset is refitted on each fold. +Note, that the function \code{validateFDboost} expects folds that give weights +per curve without considering integration weights. The integration weights of +\code{object} are used to compute the empirical risk as integral. The argument \code{response} +can be useful in simulation studies where the true value of the response is known but for +the model fit the response is used with noise. +} +\examples{ +\donttest{ +if(require(fda)){ + ## load the data + data("CanadianWeather", package = "fda") + + ## use data on a daily basis + canada <- with(CanadianWeather, + list(temp = t(dailyAv[ , , "Temperature.C"]), + l10precip = t(dailyAv[ , , "log10precip"]), + l10precip_mean = log(colMeans(dailyAv[ , , "Precipitation.mm"]), base = 10), + lat = coordinates[ , "N.latitude"], + lon = coordinates[ , "W.longitude"], + region = factor(region), + place = factor(place), + day = 1:365, ## corresponds to t: evaluation points of the fun. response + day_s = 1:365)) ## corresponds to s: evaluation points of the fun. covariate + +## center temperature curves per day +canada$tempRaw <- canada$temp +canada$temp <- scale(canada$temp, scale = FALSE) +rownames(canada$temp) <- NULL ## delete row-names + +## fit the model +mod <- FDboost(l10precip ~ 1 + bolsc(region, df = 4) + + bsignal(temp, s = day_s, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), + timeformula = ~ bbs(day, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), + data = canada) +mod <- mod[75] + + #### create folds for 3-fold bootstrap: one weight for each curve + set.seed(124) + folds_bs <- cv(weights = rep(1, mod$ydim[1]), type = "bootstrap", B = 3) + + ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations + cvr <- applyFolds(mod, folds = folds_bs, grid = 1:75) + + ## compute out-of-bag risk and coefficient estimates on folds + cvr2 <- validateFDboost(mod, folds = folds_bs, grid = 1:75) + + ## weights per observation point + folds_bs_long <- folds_bs[rep(seq_len(nrow(folds_bs)), times = mod$ydim[2]), ] + attr(folds_bs_long, "type") <- "3-fold bootstrap" + ## compute out-of-bag risk on the 3 folds for 1 to 75 boosting iterations + cvr3 <- cvrisk(mod, folds = folds_bs_long, grid = 1:75) + + ## plot the out-of-bag risk + oldpar <- par(mfrow = c(1,3)) + plot(cvr); legend("topright", lty=2, paste(mstop(cvr))) + plot(cvr2) + plot(cvr3); legend("topright", lty=2, paste(mstop(cvr3))) + + ## plot the estimated coefficients per fold + ## more meaningful for higher number of folds, e.g., B = 100 + par(mfrow = c(2,2)) + plotPredCoef(cvr2, terms = FALSE, which = 1) + plotPredCoef(cvr2, terms = FALSE, which = 3) + + ## compute out-of-bag risk and predictions for leaving-one-curve-out cross-validation + cvr_jackknife <- validateFDboost(mod, folds = cvLong(unique(mod$id), + type = "curves"), grid = 1:75) + plot(cvr_jackknife) + ## plot oob predictions per fold for 3rd effect + plotPredCoef(cvr_jackknife, which = 3) + ## plot coefficients per fold for 2nd effect + plotPredCoef(cvr_jackknife, which = 2, terms = FALSE) + + par(oldpar) + +} +} + +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/viscosity.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/viscosity.Rd new file mode 100644 index 0000000..2fe32ba --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/viscosity.Rd @@ -0,0 +1,61 @@ +\name{viscosity} +\alias{viscosity} +\docType{data} +\title{ Viscosity of resin over time} +\description{ + + In an experimental setting the viscosity of resin was measured over time + to asses the curing process depending on 5 binary factors (low-high). + +} +\usage{data("viscosity")} +\format{ + A data list with 64 observations on the following 7 variables. + \describe{ + \item{\code{visAll}}{viscosity measures over all available time points} + \item{\code{timeAll}}{time points of viscosity measures} + \item{\code{T_C}}{ temperature of tools} + \item{\code{T_A}}{temperature of resin} + \item{\code{T_B}}{temperature of curing agent} + \item{\code{rspeed}}{rotational speed} + \item{\code{mflow}}{mass flow} + } +} +\details{ +The aim is to determine factors that affect the curing process in the mold. +The desired viscosity-curve has low values in the beginning followed +by a sharp increase. +Due to technical reasons the measuring method of the rheometer has to be +changed in a certain range of viscosity. The first observations are measured +by rotation of a blade giving observations every two seconds, +the later observations are measured through oscillation of a blade giving +observations every ten seconds. In the later observations the resin is quite +hard so the measurements should be interpreted as a qualitative measure of hardening. +} +\source{ + Wolfgang Raffelt, Technical University of Munich, Institute for Carbon Composites +} +\examples{ + + data("viscosity", package = "FDboost") + ## set time-interval that should be modeled + interval <- "101" + + ## model time until "interval" and take log() of viscosity + end <- which(viscosity$timeAll==as.numeric(interval)) + viscosity$vis <- log(viscosity$visAll[,1:end]) + viscosity$time <- viscosity$timeAll[1:end] + + ## fit median regression model with 100 boosting iterations, + ## step-length 0.4 and smooth time-specific offset + ## the factors are in effect coding -1, 1 for the levels + mod <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept=FALSE) + + bols(T_A, contrasts.arg = "contr.sum", intercept=FALSE), + timeformula=~bbs(time, lambda=100), + numInt="equal", family=QuantReg(), + offset=NULL, offset_control = o_control(k_min = 9), + data=viscosity, control=boost_control(mstop = 100, nu = 0.4)) + summary(mod) + +} +\keyword{datasets} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/man/wide2long.Rd b/FDboost.Rcheck/00_pkg_src/FDboost/man/wide2long.Rd new file mode 100644 index 0000000..9f8b26f --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/man/wide2long.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hmatrix.R +\name{wide2long} +\alias{wide2long} +\title{Transform id and time of wide format into long format} +\usage{ +wide2long(time, id) +} +\arguments{ +\item{time}{the observation points} + +\item{id}{the id for the curve} +} +\value{ +a list with \code{time} and \code{id} +} +\description{ +Transform id and time from wide format into long format, i.e., time and id are +repeated accordingly so that two vectors of the same length are returned. +} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_irregular.R b/FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_irregular.R new file mode 100644 index 0000000..2d9e089 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_irregular.R @@ -0,0 +1,177 @@ +library(FDboost) + +# generate irregular toy data ------------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time & id +set.seed(90384) +t <- runif(n = n*m, -pi,pi) +id <- sample(1:n, size = n*m, replace = TRUE) + +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) + +mu1 <- d[1] * fx[[1]][id] * ft[[1]] +mu2 <- d[2] * fx[[2]][id] * ft[[2]] +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] + +mu3 <- d[3] * fx[[3]][id] * ft[[3]] + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]], id = id) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), + id = ~ id, + offset = 0, #numInt = "Riemann", + control = boost_control(nu = 1), + data = dat) +MU <- split(mu, id) +PRED <- split(predict(m), id) +Ti <- split(t, id) +t0 <- seq(-pi, pi, length.out = 40) +MU <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + MU, Ti)) +PRED <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PRED, Ti)) + +opar <- par(mfrow = c(2,2)) +image(t0, x, MU) +contour(t0, x, MU, add = TRUE) +image(t0, x, PRED) +contour(t0, x, PRED, add = TRUE) +persp(t0, x, MU, zlim = range(c(MU, PRED), na.rm = TRUE)) +persp(t0, x, PRED, zlim = range(c(MU, PRED), na.rm = TRUE)) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, sort(vi$reduction, decreasing = TRUE)[1:3]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in seq_along(wch)) { + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose predictions +preds <- lapply(fac, predict) +predf <- rowSums(preds$resp * preds$cov[id, ]) +PREDf <- split(predf, id) +PREDf <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PREDf, Ti)) +opar <- par(mfrow = c(1,2)) +image(t0,x, PRED, main = "original prediction") +contour(t0,x, PRED, add = TRUE) +image(t0,x,PREDf, main = "recomposed") +contour(t0,x, PREDf, add = TRUE) +par(opar) + +stopifnot(all.equal(PRED, PREDf)) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + + +# check factorization on a new dataset ------------------------------------ + +t_grid <- seq(-pi,pi,len = 30) +x_grid <- seq(0,2,len = 30) +x_lin_grid <- seq(min(dat$x_lin), max(dat$x_lin), len = 30) + +# use grid data for factorization +griddata <- expand.grid( + # time + t = t_grid, + # covariates + x = x_grid, + x_lin = 0 +) + +griddata_lin <- expand.grid( + t = seq(-pi, pi, len = 30), + x = 0, + x_lin = x_lin_grid +) + +griddata <- rbind(griddata, griddata_lin) + +griddata$id <- as.numeric(factor(paste(griddata$x, griddata$x_lin, sep = ":"))) + +fac2 <- factorize(m, newdata = griddata) + +ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, which = 1))) + +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in seq_along(wch)) { + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + + lines(sort(griddata$t), + ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], + col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + this_x <- fac2$cov$model.frame(which = wch[w])[[1]][[1]] + lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], + col = cols[w], lty = 1) +} +par(opar) + +# check predictions +p <- predict(fac2$resp, which = 1) diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_regular.R b/FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_regular.R new file mode 100644 index 0000000..a7bf644 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/tests/factorize_test_regular.R @@ -0,0 +1,111 @@ +library(FDboost) + +# generate regular toy data -------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time +t <- seq(-pi,pi,len = m) +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) +mu1 <- d[1] * fx[[1]] %*% t(ft[[1]]) +mu2 <- d[2] * fx[[2]] %*% t(ft[[2]]) +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] +mu3 <- d[3] * fx[[3]] %*% t(ft[[3]]) + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]]) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), offset = 0, + control = boost_control(nu = 1), + data = dat) + +opar <- par(mfrow = c(1,2)) +image(t, x, t(mu)) +contour(t, x, t(mu), add = TRUE) +image(t, x, t(predict(m))) +contour(t, x, t(predict(m)), add = TRUE) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, vi$reduction[c(1:2, 10)]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in seq_along(wch)) { + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose prediction +preds <- lapply(fac, predict) +PREDSf <- array(0, dim = c(nrow(preds$resp),nrow(preds$cov))) +for(i in seq_len(ncol(preds$resp))) + PREDSf <- PREDSf + preds$resp[,i] %*% t(preds$cov[,i]) + +opar <- par(mfrow = c(1,2)) +image(t,x, t(predict(m)), main = "original prediction") +contour(t,x, t(predict(m)), add = TRUE) +image(t,x,PREDSf, main = "recomposed") +contour(t,x, PREDSf, add = TRUE) +par(opar) +# => matches +stopifnot(all.equal(as.numeric(t(predict(m))), as.numeric(PREDSf))) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/tests/general_tests.R b/FDboost.Rcheck/00_pkg_src/FDboost/tests/general_tests.R new file mode 100644 index 0000000..50d5fe6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/tests/general_tests.R @@ -0,0 +1,216 @@ + + +library(FDboost) +library(gamboostLSS) + +# print(sessionInfo()) + +# simulated data ---------------------------------------------------------- + + +if(require(refund)){ + + old_mc_cores <- getOption("mc.cores") + options(mc.cores = 1L) + on.exit(options(mc.cores = old_mc_cores), add = TRUE) + + ## simulate a small data set + print("simulate data") + set.seed(230) + pffr_data <- suppressWarnings(pffrSim(n = 25, nxgrid = 21, nygrid = 19)) + pffr_data$X1 <- scale(pffr_data$X1, scale = FALSE) + + dat <- as.list(pffr_data) + dat$tvals <- attr(pffr_data, "yindex") + dat$svals <- attr(pffr_data, "xindex") + + dat$Y_scalar <- dat$Y[ , 10] + + dat$Y_long <- c(dat$Y) + dat$tvals_long <- rep(dat$tvals, each = nrow(dat$Y)) + dat$id_long <- rep(seq_len(nrow(dat$Y)), ncol(dat$Y)) + + # second functional covariate + dat$s2 <- seq(0, 1, l = 15) + dat$X2 <- I(matrix(rnorm(25 * 15), nrow = 25)) + dat$X2 <- scale(dat$X2, scale = FALSE) + + + # model fit --------------------------------------------------------------- + + print("model fit") + + ## response matrix for response observed on one common grid + m <- FDboost(Y ~ 1 + bhist(X1, svals, tvals, knots = 10, df = 6) + + bsignal(X1, svals, knots = 6, df = 3) + + bbsc(xsmoo, knots = 6, df = 3) + + bolsc(xte1, df = 3) + + brandomc(xte2, df = 3), + timeformula = ~ bbs(tvals, knots = 9, df = 2, differences = 1), + control = boost_control(mstop = 10), data = dat) + + ## response in long format + ml <- FDboost(Y_long ~ 1 + bhist(X1, svals, tvals_long, knots = 6, df = 12) + + bsignal(X1, svals, knots = 6, df = 4) + + bbsc(xsmoo, knots = 6, df = 4) + + bolsc(xte1, df = 4) + + brandomc(xte2, df = 4), + timeformula = ~ bbs(tvals_long, knots = 8, df = 3, differences = 1), + id = ~ id_long, + offset_control = o_control(k_min = 10), + control = boost_control(mstop = 10), data = dat) + + ## scalar response + ms <- FDboost(Y_scalar ~ 1 + bsignal(X1, svals, knots = 6, df = 2) + + bbs(xsmoo, knots = 6, df = 2, differences = 1) + + bols(xte1, df = 2) + + bols(xte2, df = 2) + + bols(xfactor, df = 2), + timeformula = NULL, + control = boost_control(mstop = 50), data = dat) + + ## scalar response and interaction effect between two functional variables + ms_funint <- FDboost(Y_scalar ~ 1 + + bsignal(X1, svals, knots = 9, df = 3) %X% bsignal(X2, s2, knots = 9, df = 3), + timeformula = NULL, + control = boost_control(mstop = 50), data = dat) + + ## GAMLSS with functional response + mlss <- FDboostLSS(Y ~ 1 + bsignal(X1, svals, knots = 6, df = 3) + + bbsc(xsmoo, knots = 6, df = 3) + + bolsc(xte1, df = 3), + timeformula = ~ bbs(tvals, knots = 9, df = 3, differences = 1), + control = boost_control(mstop = 20), data = dat, + method = "noncyclic") + + ## GAMLSS with scalar response + mslss <- FDboostLSS(Y_scalar ~ 1 + bsignal(X1, svals, knots = 6, df = 3) + + bbs(xsmoo, knots = 6, df = 3, differences = 1), + timeformula = NULL, + control = boost_control(mstop = 50), data = dat, + method = "noncyclic") + + ## response matrix with factor + continuous time variable + + # linear array model implemented only for matrices + # => tvals and factor for dimensions have to be flattened + dat2D <- with(dat, expand.grid( + tvals = tvals, + xfactor = factor(2:3) + )) + dat2D <- as.list(dat2D[order(dat2D$xfactor), ]) + dat2D$Y <- cbind( + dat$Y[dat$xfactor == "2", ], + dat$Y[dat$xfactor == "3", ] + ) + dat2D$xsmoo <- dat$xsmoo[dat$xfactor == "2"] + + m2D <- FDboost(Y ~ bbsc(xsmoo), + timeformula = ~ bols(xfactor) %X% bbs(tvals), + control = boost_control(mstop = 20), + data = dat2D) + + + # test some methods and utility functions -------------------------------- + + ## test plot() + print("plot effects") + par(mfrow = c(1,1)) + plot(m, ask = FALSE) + plot(ml, ask = FALSE) + plot(ms, ask = FALSE) + plot(mlss$mu, ask = FALSE) + plot(mlss$sigma, ask = FALSE) + + ## test applyFolds() + print("run applyFolds") + set.seed(123) + applyFolds(m, folds = cv(rep(1, length(unique(m$id))), B = 2), grid = 0:5) + #applyFolds(ml, folds = cv(rep(1, length(unique(ml$id))), B = 2), grid = 0:5) + #applyFolds(ms, folds = cv(rep(1, length(unique(ms$id))), B = 2), grid = 0:5) + + ## test cvrisk() + print("run cvrisk") + set.seed(123) + cvrisk(m, folds = cvLong(id = m$id, weights = model.weights(m), B = 2), grid = 0:5) + cvrisk(ml, folds = cvLong(id = ml$id, weights = model.weights(ml), B = 2), grid = 0:5) + cvrisk(ms, folds = cvLong(id = ms$id, weights = model.weights(ms), B = 2), grid = 0:5) + cvrisk(ms_funint, folds = cvLong(id = ms$id, weights = model.weights(ms), B = 2), grid = 0:5) + + cvrisk(mlss, folds = cv(model.weights(mlss[[1]]), B = 2), + grid = 1:5, trace = FALSE) + cvrisk(mslss, folds = cv(model.weights(mslss[[1]]), B = 2), + grid = 1:5, trace = FALSE) + + cvrisk(m2D, folds = cv(model.weights(m2D), B = 2), + grid = 1:5) + + ## test stabsel (use very small number of folds, B = 10, to speed up testing) + print("run stabsel") + stabsel(m, cutoff=0.8, PFER = 0.1*length(m$baselearner), sampling.type = "SS", eval = TRUE, B = 3) + stabsel(m, cutoff=0.8, PFER = 0.1*length(m$baselearner), sampling.type = "SS", eval = TRUE, B = 3, + refitSmoothOffset = FALSE) + + ## FIXME: this stabsel() should also work with refitSmoothOffset = TRUE + stabsel(ml, cutoff=0.8, PFER = 0.1*length(ml$baselearner), sampling.type = "SS", eval = TRUE, B = 3, + refitSmoothOffset = FALSE) + stabsel(ms, cutoff=0.8, PFER = 0.1*length(ms$baselearner), sampling.type = "SS", eval = TRUE, B = 3) + ## FIXME: this is broken again + ## fixed in gamboostLSS package on github with commit 4989474 + ##stabsel(mlss, cutoff=0.8, PFER = 0.1*length(mlss$mu$baselearner), sampling.type = "SS", eval = TRUE, B = 3) + ##stabsel(mslss, cutoff=0.8, PFER = 0.1*length(mslss$mu$baselearner), sampling.type = "SS", eval = TRUE, B = 3) + + + ## test predict with newdata + print("predict with new data") + pred <- predict(m, newdata = dat) + ## for this predict() with newdata, you need a data.frame where the irregular time of y fits with X + ## pred <- predict(ml, newdata = dat) + pred <- predict(ms, newdata = dat) + pred <- predict(ms_funint, newdata = dat) + pred <- predict(mlss, newdata = dat) + pred <- predict(mslss, newdata = dat) + +} + + + +# sof: fuel data ---------------------------------------------------------- + +print("run checks with fuel data") + +## prediction with functional variable as numeric matrix, see Issue #17 +data(fuelSubset) +fuel <- fuelSubset[c('heatan', 'h2o', 'UVVIS', 'uvvis.lambda')] +str(fuel$UVVIS) # numeric matrix + +sof <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 20, df = 4) + + bbs(h2o, df = 4), + timeformula = ~bols(1), data = fuel) + +# Predict with newdata +pred <- predict(sof, newdata = fuel) + +# with interaction term +sof_int <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 9, df = 9) + + bsignal(NIR, nir.lambda, knots = 9, df = 9) + + bsignal(UVVIS, uvvis.lambda, knots = 9, df = 3) %X% bsignal(NIR, nir.lambda, knots = 9, df = 3), + timeformula = ~bols(1), data = fuelSubset) + +# Predict with newdata +pred <- predict(sof_int, newdata = fuelSubset) + + + +# fof: fuel data ----------------------------------------------------------- + +## model does not make sense, but is good for checking + +# function-on-function with bsignal +fof <- FDboost(UVVIS ~ bsignal(NIR, nir.lambda, knots = 9, df = 9), + timeformula = ~ bbs(uvvis.lambda), data = fuelSubset) + +pred <- predict(fof, newdata = fuelSubset) + + + diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_canada.Rnw b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_canada.Rnw new file mode 100644 index 0000000..f16d563 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_canada.Rnw @@ -0,0 +1,346 @@ + +\documentclass{article} +\usepackage{amstext} +\usepackage{amsfonts} +\usepackage{hyperref} +\usepackage[round]{natbib} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{rotating} +\usepackage{authblk} +\usepackage[left=25mm, right=25mm, top=20mm, bottom=20mm]{geometry} +%\usepackage[nolists]{endfloat} + +%\VignetteEngine{knitr::knitr} +%\VignetteDepends{FDboost, fda, fields, maps, mapdata} +%\VignetteIndexEntry{FDboost FLAM Canada} + +\newcommand{\Rpackage}[1]{{\normalfont\fontseries{b}\selectfont #1}} +\newcommand{\Robject}[1]{\texttt{#1}} +\newcommand{\Rclass}[1]{\textit{#1}} +\newcommand{\Rcmd}[1]{\texttt{#1}} +\newcommand{\Roperator}[1]{\texttt{#1}} +\newcommand{\Rarg}[1]{\texttt{#1}} +\newcommand{\Rlevel}[1]{\texttt{#1}} + +\newcommand{\RR}{\textsf{R}} +\renewcommand{\S}{\textsf{S}} +\newcommand{\df}{\mbox{df}} + +\RequirePackage[T1]{fontenc} +\RequirePackage{graphicx,ae,fancyvrb} +\IfFileExists{upquote.sty}{\RequirePackage{upquote}}{} +\usepackage{relsize} + +\renewcommand{\baselinestretch}{1} +\setlength\parindent{0pt} + + +\hypersetup{% + pdftitle = {FLAM canada}, + pdfsubject = {package vignette}, + pdfauthor = {Sarah Brockhaus}, +%% change colorlinks to false for pretty printing + colorlinks = {true}, + linkcolor = {blue}, + citecolor = {blue}, + urlcolor = {red}, + hyperindex = {true}, + linktocpage = {true}, +} + +\begin{document} + +\setkeys{Gin}{width=\textwidth} + +\title{Canadian climate: function-on-function regression} +\author{Sarah Brockhaus +\thanks{E-mail: sarah.brockhaus@stat.uni-muenchen.de}} +\affil{\textit{Institut f\"ur Statistik, \\ +Ludwig-Maximilians-Universit\"at M\"unchen, \\ +Ludwigstra{\ss}e 33, D-80539 M\"unchen, Germany.}} +\date{} +\maketitle + +% \noindent$^1$ +% \newline + +\noindent The analysis is based on the analysis in the online appendix of Scheipl et al. (2015). +The results of this vigentte can be found in the web appendix of Brockhaus et al. (2015). + +\section{Load and plot data} + + +<>= +# Load FDboost package +library(FDboost) +@ + +Load data and choose the time-interval. +<>= +library(fda) +data("CanadianWeather", package = "fda") + +### use data on a monthly basis (c.f. Scheipl et. al. online supplement) +dataM <- with(CanadianWeather, + list( temp = t(monthlyTemp), + l10precip = t(log10(monthlyPrecip)), + lat = coordinates[,"N.latitude"], + lon = coordinates[,"W.longitude"], + region = factor(region), + place = factor(place) + )) +# correct Prince George location (wrong at least until fda_2.2.7): +dataM$lon["Pr. George"] <- 122.75 +dataM$lat["Pr. George"] <- 53.9 + +# center temperature curves: +dataM$tempRaw <- dataM$temp +dataM$temp <- sweep(dataM$temp, 2, colMeans(dataM$temp)) + +# define function indices +dataM$month.t <- 1:12 +dataM$month.s <- 1:12 +@ + +Plot the data + +<>= + +par(mfrow=c(1,2)) + +# plot precipitation +with(dataM, { + matplot(t(l10precip), type = "l", lty = as.numeric(region), + col = as.numeric(region), + xlab = "", ylab = "", + ylim = c(-1.2, 1))#, cex.axis = 1, cex.lab = 1) + legend("bottom", col = 1:4, lty = 1:4, legend = levels(region), + cex = 1, bty = "n") +}) +mtext("time [month]", 1, line = 2)#, cex = 1.5) +mtext("log(precipitation) [mm]", 2, line = 2)#, cex = 1.5) + +# plot temperature +with(dataM, { + matplot(t(tempRaw), type = "l", lty = as.numeric(region), + col = as.numeric(region), + xlab = "", ylab = "")#, +# cex.axis = 1, cex.lab = 1) +}) +mtext("time [month]", 1, line = 2)#, cex = 1.5) +mtext("temperature [C]", 2, line = 2)#, cex = 1.5) +@ + +\clearpage + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Model for log-precipitation} + +We consider the following linear regression model: +\[ + E(Y_i(t)|x_i )= I(\mbox{rg}_i=k) \beta_k(t) + \int{\mbox{temp}}_i(s)\beta(s,t)ds + e_i(t), +\] +where $Y_i(t)$ is the log-precipitation over month $t=1, \ldots, 12$, $I(\cdot)$ is the indicator function, $\mbox{rg}_i$ is the region of the $i^{th}$ station, $\beta_k(t)$ are the smooth effects per region, $\mbox{temp}_i (s)$ is the temperature over the month $s=1, \ldots, 12$, $\beta(s,t)$ is the coefficient surface and $e_i(t)$ are smooth spatially correlated residual curves. +\\\\ +Set up design matrix and penalty-matrix for spatially correlated residual curves. +<>= +locations <- cbind(dataM$lon, dataM$lat) +### fix location names s.t. they correspond to levels in places +rownames(locations) <- as.character(dataM$place) + +library(fields) + ### get great circle distances between locations: + dist <- rdist.earth(locations, miles = FALSE, R = 6371) + + ### construct Matern correlation matrices as + ### marginal penalty for a GRF over the locations: + ### find ranges for nu = .5, 1 and 10 + ### where the correlation drops to .2 at a distance of 500/1500/3000 km + ### (about the 10%/40%/70% quantiles of distances here) + r.5 <- Matern.cor.to.range(500, nu = 0.5, cor.target = .2) + r1 <- Matern.cor.to.range(1500, nu = 1.0, cor.target = .2) + r10 <- Matern.cor.to.range(3000, nu = 10.0, cor.target = .2) + ### compute correlation matrices + corr_nu.5 <- apply(dist, 1, Matern, nu = .5, range = r.5) + corr_nu1 <- apply(dist, 1, Matern, nu = 1, range = r1) + corr_nu10 <- apply(dist, 1, Matern, nu = 10, range = r10) + ### invert to get precisions + P_nu.5 <- solve(corr_nu.5) + P_nu1 <- solve(corr_nu1) + #P_nu10 <- solve(corr_nu10) + +if(FALSE){ + curve(Matern(x, nu = .5, range = r.5), 0, 5000, ylab = "Correlation(d)", + xlab = "d [km]", lty = 2) + curve(Matern(x, nu = 1, range = r1), 0, 5000, add = TRUE, lty = 3) + curve(Matern(x, nu = 10, range = r10), 0, 5000, add = TRUE, lty = 4) + legend("topright", inset = 0.2, lty = c(2, NA, 3, NA, 4), + legend = c(".5", "", "1", "", "10"), + title = expression(nu), cex = .8, bty = "n") +} + + +## for uncorrelated residuals +# P_nu.5 <- diag(35) +# print("Residuals are uncorrelated!") + +@ + +Fit the model. +<>= +# use bolsc() base-learner with precision matrix as penalty matrix +set.seed(210114) +mod3 <- FDboost(l10precip ~ bols(region, df = 2.5, contrasts.arg = "contr.dummy") + + bsignal(temp, month.s, knots = 11, cyclic = TRUE, + df = 2.5, boundary.knots = c(0.5, 12.5), check.ident = FALSE) + + bolsc(place, df = 2.5, K = P_nu.5, contrasts.arg = "contr.dummy"), + timeformula = ~ bbs(month.t, knots = 11, cyclic = TRUE, + df=3, boundary.knots = c(0.5, 12.5)), + offset="scalar", offset_control = o_control(k_min = 5), + data=dataM) +@ + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Get optimal stopping iteration by 25-fold bootstrap over curves. + +<>= +mod3 <- mod3[47] +@ + +Do now run bootstrapping (better use multiple cores). +<>= +set.seed(2303) +folds <- cvMa(ydim = mod3$ydim, type = "bootstrap", B = 25) +cvMod3 <- cvrisk(mod3, grid = seq(1, 1000, by=1), folds = folds, mc.cores = 1) +mod3 <- mod3[mstop(cvMod3)] # 47 +# summary(mod3) +@ + + +Base-learner for smooth residuals is not selected into the model. Look at effects of region and temperature. + +<>= + +par(mfrow=c(1,2))#, mar = c(7,4,7,1))#, cex = 1.5, cex.main = 0.9) +predRegion <- predict(mod3, which = 1, + newdata = list(region = factor(c("Arctic", "Atlantic", + "Continental", "Pacific")), + month.t = seq(1, 12, l=20))) + mod3$offset +matplot(seq(1, 12, l = 20), t(predRegion), col = 1:4, + type = "l", lwd = 2, lty = 1:4, + main = "region", ylab = "", xlab = "") +mtext("t, time [month]", 1, line = 2)#, cex = 1.5) + +legend("bottom", lty = 1:4, legend = levels(dataM$region), col = 1:4, bty = "n", lwd = 2) + +## plot the effect of temperature +# par(mar = c(4,4,7,1)) +plot(mod3, which = 2, pers = TRUE, main = "temperature", zlab = "", + xlab = "s, time [month]", ylab = "t, time [month]") +@ + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Compute optimal stopping iteration by leaving-one-curve-out cross-validation. + +<>= +mod3 <- mod3[750] +@ + +We suggest to use multiple cores. +<>= +set.seed(143) +folds <- cvMa(ydim = mod3$ydim, type = "curves") +cvMod3curves <- cvrisk(mod3, grid = seq(1, 1000, by = 1), folds = folds, mc.cores = 1) + +## optimal stopping iteration in terms of mean +mstop(cvMod3curves) +## optimal stopping iteration in terms of median +(mStop <- which.min(apply(cvMod3curves, 2, median)) ) +mod3 <- mod3[mStop] +@ + +Plot the coefficient functions for the effects of temperature and region. +<>= +par(mfrow=c(1,2)) +predRegion <- predict(mod3, which=1, + newdata = list(region = factor(c("Arctic", "Atlantic", + "Continental", "Pacific")), + month.t=seq(1, 12, l = 20))) + mod3$offset +matplot(seq(1, 12, l=20), t(predRegion), col = 1:4, + type = "l", lwd = 2, lty = 1:4, + main = "region", ylab = "", xlab = "") +mtext("t, time [month]", 1, line = 2)#, cex = 1.5) +#plot(mod, which=1, lwd=2, lty=1, col=c(2,3,4,1)) +legend("bottom", lty = 1:4, legend = levels(dataM$region), col = 1:4, bty = "n", lwd = 2) + +## plot the effect of temperature +plot(mod3, which = 2, pers = TRUE, main = "temperature", zlab = "", + xlab = "s, time [month]", ylab = "t, time [month]") +@ + + +Prepare data for plot of smooth residual curves. The stations a roughly ordered. +<>= +ord <- c("Dawson", "Whitehorse", "Yellowknife", "Uranium City", "Churchill", + "Edmonton", "Pr. Albert", "The Pas", "Calgary", "Regina", "Winnipeg", + "Thunder Bay", + "Pr. George", "Pr. Rupert", "Kamloops", "Vancouver", "Victoria", + "Scheffervll", "Bagottville", "Arvida", "St. Johns", "Quebec", + "Fredericton", "Sydney", "Ottawa", "Montreal", "Sherbrooke", "Halifax", + "Yarmouth", "Toronto", "London", "Charlottvl", + "Inuvik", "Resolute", "Iqaluit" ) +ind <- sapply(1:35, function(s){ which(dataM$place == ord[s]) }) +smoothRes <- predict(mod3, which=3) +if( is.null(dim(smoothRes)) ) smoothRes <- matrix(0, ncol = 12, nrow = 35) +smoothRes <- (smoothRes )[ind, ] +# smoothRes <- ( predict(mod4, which=3) )[ind, ] +regionOrd <- dataM$region[ind] + +fit3 <- (predict(mod3))[ind, ] +response <- dataM$l10precip[ind, ] +@ + +Plot the smooth residual curves. +<>= +par(mar = c(2.55, 2.05, 2.05, 1.05), oma=c(0, 0, 0, 0)) +layout(rbind(matrix(1:36, 6, 6), rep(37, 6), rep(37, 6))) +for(i in 1:35) { + plot(1:12, smoothRes[i, ], col = as.numeric(regionOrd[i]), type = "l", + ylim = range(smoothRes, response-fit3), + main = paste(ord[i], " (", i, ")", sep = ""), + cex = 1.2, cex.axis = .8, ylab = "", xlab = "") + abline(h = 0, col = 8) + lines(1:12, smoothRes[i, ], col = as.numeric(regionOrd[i])) + points(1:12, response[i, ] - fit3[i, ], cex = 0.8) +} +plot(0, 0, col = "white", xaxt = "n", yaxt = "n", bty = "n") + +if(require(maps) & require(mapdata)){ + mapcanada <- map(database="world", regions="can", plot=FALSE) + plot(mapcanada, type = "l", xaxt = "n", yaxt = "n", ylab = "", xlab = "", bty = "n", + xlim = c(-141, -50), ylim=c(43, 74), + col = "grey", mar = c(0, 0, 0, 0)) + for(i in 1:35) { + text(-dataM$lon[ind[i]], dataM$lat[ind[i]], col = as.numeric(regionOrd[i]), + labels = as.character(i), cex = 0.8) + } +} +@ + + +\section*{References} +\begin{itemize} +\item[] Brockhaus S, Scheipl, F., Hothor, T., and Greven, S. (2015), The functional linear array model, + \textit{Statistical Modelling}, 15(3), 279--300. +\item[] Scheipl, F., Staicu, A.-M., and Greven, S. (2015), Functional Additive Mixed Models, + \textit{Journal of Computational and Graphical Statistics}, 24(2), 477--501. +\end{itemize} + + + +\end{document} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_fuel.Rnw b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_fuel.Rnw new file mode 100644 index 0000000..550b61e --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_fuel.Rnw @@ -0,0 +1,234 @@ + +\documentclass{article} +\usepackage{amstext} +\usepackage{amsfonts} +\usepackage{hyperref} +\usepackage[round]{natbib} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{rotating} +\usepackage{authblk} +\usepackage[left=25mm, right=25mm, top=20mm, bottom=20mm]{geometry} +%\usepackage[nolists]{endfloat} + +%\VignetteEngine{knitr::knitr} +%\VignetteDepends{FDboost, fda, fields, maps, mapdata} +%\VignetteIndexEntry{FDboost FLAM fuel} + +\newcommand{\Rpackage}[1]{{\normalfont\fontseries{b}\selectfont #1}} +\newcommand{\Robject}[1]{\texttt{#1}} +\newcommand{\Rclass}[1]{\textit{#1}} +\newcommand{\Rcmd}[1]{\texttt{#1}} +\newcommand{\Roperator}[1]{\texttt{#1}} +\newcommand{\Rarg}[1]{\texttt{#1}} +\newcommand{\Rlevel}[1]{\texttt{#1}} + +\newcommand{\RR}{\textsf{R}} +\renewcommand{\S}{\textsf{S}} +\newcommand{\df}{\mbox{df}} + +\RequirePackage[T1]{fontenc} +\RequirePackage{graphicx,ae,fancyvrb} +\IfFileExists{upquote.sty}{\RequirePackage{upquote}}{} +\usepackage{relsize} + +\renewcommand{\baselinestretch}{1} +\setlength\parindent{0pt} + + +\hypersetup{% + pdftitle = {FLAM canada}, + pdfsubject = {package vignette}, + pdfauthor = {Sarah Brockhaus}, +%% change colorlinks to false for pretty printing + colorlinks = {true}, + linkcolor = {blue}, + citecolor = {blue}, + urlcolor = {red}, + hyperindex = {true}, + linktocpage = {true}, +} + +\begin{document} + +\setkeys{Gin}{width=\textwidth} + +\title{Canadian climate: function-on-function regression} +\author{Sarah Brockhaus +\thanks{E-mail: sarah.brockhaus@stat.uni-muenchen.de}} +\affil{\textit{Institut f\"ur Statistik, \\ +Ludwig-Maximilians-Universit\"at M\"unchen, \\ +Ludwigstra{\ss}e 33, D-80539 M\"unchen, Germany.}} +\date{} +\maketitle + +The dataset was originally analyzed by Fuchs et al. (2015). +The results of this vignette together with more explanations can be found in Brockhaus et al. (2015). + +<>= +knitr::opts_chunk$set(comment=NA, warning=FALSE, message=FALSE) +@ + + +\section{Load and plot data} +Load FDboost package. +<>= +library(FDboost) +@ + +Load data and compute the first derivative. +<>= +data(fuelSubset) +fuel <- fuelSubset +str(fuel) + +# # normalize the wavelength to 0-1 +# fuel$nir.lambda0 <- (fuel$nir.lambda - min(fuel$nir.lambda)) / +# (max(fuel$nir.lambda) - min(fuel$nir.lambda)) +# fuel$uvvis.lambda0 <- (fuel$uvvis.lambda - min(fuel$uvvis.lambda)) / +# (max(fuel$uvvis.lambda) - min(fuel$uvvis.lambda)) + +# compute first derivatives as first order differences +fuel$dUVVIS <- t(apply(fuel$UVVIS, 1, diff)) +fuel$dNIR <- t(apply(fuel$NIR, 1, diff)) + +# get the wavelength for the derivatives +fuel$duvvis.lambda <- fuel$uvvis.lambda[-1] +fuel$dnir.lambda <- fuel$nir.lambda[-1] +# fuel$duvvis.lambda0 <- fuel$uvvis.lambda0[-1] +# fuel$dnir.lambda0 <- fuel$nir.lambda0[-1] +@ + +Compute the model to predict humidity. +The predicted humidity is contained already in the dataset \emph{fuel}. + +\section{Model to predict humidity} + +We consider the following regression model to predict the humidity. +\[ +E(Y_i) = \int \mbox{NIR}_i(s_1)\beta_1(s_1)ds_1 + \int \mbox{UVVIS}_i(s_2)\beta_2(s_2)ds_2 + + \int \mbox{dNIR}_i(s_3)\beta_1(s_3)ds_3 + \int \mbox{dUVVIS}_i(s_4)\beta_2(s_4)ds_4, +\] +with $Y_i$ being the humidity and NIR, UVVIS are the spectra and dNIR, dUVVIS the respective derivatives, measured over $s_1,\ldots, s_4$ respectively. +The optimal stopping iteration is determined by 10-fold bootstrap (better use multiple cores). + +<>= +modH2O <- FDboost(h2o ~ bsignal(UVVIS, uvvis.lambda, knots=40, df=4) + + bsignal(NIR, nir.lambda, knots=40, df=4) + + bsignal(dUVVIS, duvvis.lambda, knots=40, df=4) + + bsignal(dNIR, dnir.lambda, knots=40, df=4), + timeformula=~bols(1), data=fuel) + +set.seed(212) +cvmH2O <- suppressWarnings(cvrisk(modH2O, grid=seq(100, 5000, by=100), + folds=cv( model.weights(modH2O), + type = "bootstrap", B = 10), mc.cores = 1)) + +par(mfrow=c(1,2)) +plot(cvmH2O) + +modH2O[mstop(cvmH2O)] +#modH2O[2400] + +#### create new variable of predicted h2o +h2o.fit <- modH2O$fitted() + +plot(fuel$h2o, h2o.fit) +abline(0,1) +@ + + +%' \section{Plot of data} +%' <>= +%' # pdf("NIR_UVVIS.pdf", width=7, height=7) +%' jpeg("NIR_UVVIS.jpg", width=1500, height=1500) +%' par(mfrow=c(2,2), mar=c(4, 4, 1, 1), cex=1.5) +%' +%' # generate colors depending on heat value for equidistant cuts +%' quants <- seq(from=min(fuel$heatan), to=max(fuel$heatan), l=11) +%' cats <- cut(fuel$heatan, quants, include.lowest = TRUE) +%' pall <- heat.colors(12, alpha = 0.5)[1:10] +%' cols <- pall[cats] +%' +%' ## plot heatan +%' with(fuel, hist(heatan, breaks=quants, col=pall, +%' xlab="heat value [MJ]", main="")) +%' +%' ## plot heat values versus predicted humidity +%' with(fuel, plot(heatan~h2o, col=cols, pch=20, lwd=2, +%' xlab="predicted humidity [%]", ylab="heat value [MJ]")) +%' with(fuel, points(heatan~h2o, col=1)) +%' +%' ## plot the two spectra +%' with(fuel, matplot(uvvis.lambda, t(UVVIS), col=cols, +%' lwd=1, lty=1, ylab="UV-VIS", xlab="wavelength [nm]", type="l")) +%' with(fuel, matplot(nir.lambda, t(NIR), col=cols, +%' lwd=1, lty=1, ylab="NIR", xlab="wavelength [nm]", type="l")) +%' dev.off() +%' @ +%' +%' \begin{figure}[h] +%' \begin{center} +%' \includegraphics[width=1\textwidth]{NIR_UVVIS} +%' \caption{The coloring of all plots is according to the heat value in mega Joule (mJ), with red meaning low heat value and yellow meaning high heat value. The histogram at the top left can be used as a legend. The scatter plot at the top right shows the heat value depending on the predicted humidity. The lower panel shows the UVVIS and the NIR spectra. } +%' \end{center} +%' \end{figure} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Model to predict heat value} + +We consider the following regression model to predict the heat values. +\[ +E(Y_i) = \int \mbox{NIR}_i(s_1)\beta_1(s_1)ds_1 + \int \mbox{UVVIS}_i(s_2)\beta_2(s_2)ds_2, +\] +with $Y_i$ being the heat value and NIR and UVVIS are the spectra, measured over $s_1$ and $s_2$ respectively. + +<>= +formula <- formula(heatan ~ bsignal(UVVIS, uvvis.lambda, knots=40, df=4.41) + + bsignal(NIR, nir.lambda, knots=40, df=4.41)) + +## do a model fit: +mod <- FDboost(formula, timeformula=~bols(1), data=fuel) +mod <- mod[198] +@ + +The optimal stopping iteration is determined by 50-fold bootstrap. We compute in each bootstrap-sample the coefficient functions to get an idea of the variability of the estimates (better use multiple cores). +<>= +## get optimal mstop and do bootstrapping for coefficient estimates +set.seed(2703) +val <- validateFDboost(mod, + folds=cv(model.weights(mod), type = "bootstrap", B = 50), + grid = 10:500, mc.cores = 1) + +mopt <- val$grid[which.min(colMeans(val$oobrisk))] +print(mopt) + +## use optimal mstop +mod <- mod[mopt] # 198 +@ + +Plot the coefficient functions. + +<>= +par(mfrow=c(1,2)) +plot(mod, which=1, lwd=2, lty=5, rug=FALSE, + ylab="", xlab="wavelength [nm]") + +plot(mod, which=2, lwd=2, lty=5, rug=FALSE, + ylab="", xlab="wavelength [nm]") +@ + +% The gray lines show the estimates in the 50 bootstrap folds, the black line gives the mean estimated coefficient function over the bootstrap folds, the dashed red lines point-wise 5\% and 95\% values, the dotdashed blue lines give the estimated coefficients for the model on the whole dataset. + +\section*{References} +\begin{itemize} +\item[] Brockhaus S, Scheipl, F., Hothor, T., and Greven, S. (2015), The functional linear array model, + \textit{Statistical Modelling}, 15(3), 279--300. +\item[] Fuchs, K., Scheipl, F., and Greven, S. (2015), + Penalized scalar-on-functions regression with interaction term, + \textit{Computational Statistics and Data Analysis}, 81, 38--51. +\end{itemize} + + +\end{document} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_viscosity.Rnw b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_viscosity.Rnw new file mode 100644 index 0000000..0a6aaf0 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/FLAM_viscosity.Rnw @@ -0,0 +1,351 @@ + +\documentclass{article} +\usepackage{amstext} +\usepackage{amsfonts} +\usepackage{hyperref} +\usepackage[round]{natbib} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{rotating} +\usepackage{authblk} +\usepackage[left=25mm, right=25mm, top=20mm, bottom=20mm]{geometry} +%\usepackage[nolists]{endfloat} + +%\VignetteEngine{knitr::knitr} +%\VignetteDepends{FDboost, fda, fields, maps, mapdata} +%\VignetteIndexEntry{FDboost FLAM viscosity} + +\newcommand{\Rpackage}[1]{{\normalfont\fontseries{b}\selectfont #1}} +\newcommand{\Robject}[1]{\texttt{#1}} +\newcommand{\Rclass}[1]{\textit{#1}} +\newcommand{\Rcmd}[1]{\texttt{#1}} +\newcommand{\Roperator}[1]{\texttt{#1}} +\newcommand{\Rarg}[1]{\texttt{#1}} +\newcommand{\Rlevel}[1]{\texttt{#1}} + +\newcommand{\RR}{\textsf{R}} +\renewcommand{\S}{\textsf{S}} +\newcommand{\df}{\mbox{df}} + +\RequirePackage[T1]{fontenc} +\RequirePackage{graphicx,ae,fancyvrb} +\IfFileExists{upquote.sty}{\RequirePackage{upquote}}{} +\usepackage{relsize} + +\renewcommand{\baselinestretch}{1} +\setlength\parindent{0pt} + + +\hypersetup{% + pdftitle = {FLAM canada}, + pdfsubject = {package vignette}, + pdfauthor = {Sarah Brockhaus}, +%% change colorlinks to false for pretty printing + colorlinks = {true}, + linkcolor = {blue}, + citecolor = {blue}, + urlcolor = {red}, + hyperindex = {true}, + linktocpage = {true}, +} + +\begin{document} + +\setkeys{Gin}{width=\textwidth} + +\title{Canadian climate: function-on-function regression} +\author{Sarah Brockhaus +\thanks{E-mail: sarah.brockhaus@stat.uni-muenchen.de}} +\affil{\textit{Institut f\"ur Statistik, \\ +Ludwig-Maximilians-Universit\"at M\"unchen, \\ +Ludwigstra{\ss}e 33, D-80539 M\"unchen, Germany.}} +\date{} +\maketitle + +The results of this vignette together with more explanations can be found in Brockhaus et al. (2015). + +<>= +knitr::opts_chunk$set(comment=NA, warning=FALSE, message=FALSE) +@ + +\section{Descriptive analysis} + +Load FDboost package and write useful functions for plotting. +<>= +library(FDboost) + +## function based on funplot() to plot values on logscale with nice labels +## for viscosity data +funplotLogscale <- function(x, y, ylim = NULL, col=1, add=FALSE, ...){ + + dots <- list(...) + if(!add){ + if(is.null(ylim)) ylim <- range(y, na.rm=TRUE) + + plot(x, rep(1, length(x)), col = "white", ylim = ylim, yaxt = "n", + ylab = "", xlab = "",...) + + mtext("time [s]", 1, line=2)#, cex=1.5) + mtext("viscosity [mPas]", 2, line=2)#, cex=1.5) + + abline(h = log(1*10^(0:9)), col="gray") + axis(2, at = log(1*10^(0:9)), labels=1*10^(0:9)) + + #axis(4, at=log(0.001*10^(0:9)), labels=FALSE) + + axis(2, at=log(2*10^(0:9)), labels=FALSE) + axis(2, at=log(3*10^(0:9)), labels=FALSE) + axis(2, at=log(4*10^(0:9)), labels=FALSE) + axis(2, at=log(5*10^(0:9)), labels=FALSE) + axis(2, at=log(6*10^(0:9)), labels=FALSE) + axis(2, at=log(7*10^(0:9)), labels=FALSE) + axis(2, at=log(8*10^(0:9)), labels=FALSE) + axis(2, at=log(9*10^(0:9)), labels=FALSE) + + #axis(4, at=seq(0, 30, by=5)) + if(diff(ylim) > 5) axis(4, at=seq(-20, 20, by=2)) + if(diff(ylim) > 2 & diff(ylim) < 5) axis(4, at=seq(-10, 10, by=1)) + if(diff(ylim) > 1 & diff(ylim) < 2) axis(4, at=seq(-10, 10, by=0.5)) + if(diff(ylim) < 1) axis(4, at=seq(-10, 10, by=0.25)) + } + + funplot(x, y, add=TRUE, col=col, type="l", ...) + +} + +# function to color-code according to a factor +getCol2 <- function(x, cols = rainbow(18)[1:length(table(x))]){ + ret <- c() + for(i in 1:length(cols)){ + ret[x==names(table(x))[i]] <- cols[i] + } + return(ret) +} +@ + +Load data and choose the time-interval. +<>= +# load("viscosity.RData") +data(viscosity) +str(viscosity) + +## set time-interval that should be modeled +interval <- "509" + +## model time until "interval" +end <- which(viscosity$timeAll==as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] + +## set up interactions by hand +vars <- c("T_C", "T_A", "T_B", "rspeed", "mflow") +for(v in 1:length(vars)){ + for(w in v:length(vars)) + viscosity[[paste(vars[v], vars[w], sep="_")]] <- factor( + (viscosity[[vars[v]]]:viscosity[[vars[w]]]=="high:high")*1) +} + +#str(viscosity) +names(viscosity) +@ + +Plot the data + +<>= +par(mfrow=c(1,1), mar=c(3, 3, 1, 2))#, cex=1.5) +mycol <- gray(seq(0, 0.8, l=4), alpha=0.8)[c(1,3,2,4)] +int_T_CA <- with(viscosity, paste(T_C,"-", T_A, sep="")) +with(viscosity, funplotLogscale(time, vis, + col=getCol2(int_T_CA, cols=mycol[4:1]))) +legend("bottomright", fill=mycol, + legend=c("T_C low, T_A low", "T_C low, T_A high", + "T_C high, T_A low", "T_C high, T_A high"), cex = 0.8) +@ + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage + +\section{Model with all main effects and interactions of first order} + +Fit model with all main effects and interactions. + +<>= +set.seed(1911) +modAll <- FDboost(vis ~ 1 + + bols(T_C) # main effects + + bols(T_A) + + bols(T_B) + + bols(rspeed) + + bols(mflow) + + bols(T_C_T_A) # interactions T_WZ + + bols(T_C_T_B) + + bols(T_C_rspeed) + + bols(T_C_mflow) + + bols(T_A_T_B) # interactions T_A + + bols(T_A_rspeed) + + bols(T_A_mflow) + + bols(T_B_rspeed) # interactions T_B + + bols(T_B_mflow) + + bols(rspeed_mflow), # interactions rspeed + timeformula=~bbs(time, lambda=100), + numInt="Riemann", family=QuantReg(), + offset=NULL, offset_control = o_control(k_min = 10), + data=viscosity, check0=FALSE, + control=boost_control(mstop = 100, nu = 0.2)) +@ + +Get optimal stopping iteration using bootstrap over curves (better use multiple cores). +<>= +set.seed(1911) +folds <- cv(weights=rep(1, modAll$ydim[1]), type="bootstrap", B=10) +cvmAll <- suppressWarnings(validateFDboost(modAll, folds = folds, + getCoefCV=FALSE, + grid=seq(10, 500, by=10), mc.cores = 1)) +mstop(cvmAll) # 180 +# modAll <- modAll[mstop(cvmAll)] +# summary(modAll) +# cvmAll +@ + +% \begin{figure} +% \begin{center} +% <>= +% par(mfrow=c(1,2)) +% plot(cvmAll) +%@ +% \end{center} +% \caption{Optimal stopping iteration for model with all main effects and interactions of first order.} +% \end{figure} + + +Do model selection using stability selection (better use multiple cores). +<>= +set.seed(1911) +folds <- cvMa(ydim=modAll$ydim, weights=model.weights(modAll), + type = "subsampling", B = 50) + +stabsel_parameters(q=5, PFER=2, p=16, sampling.type = "SS") +sel1 <- stabsel(modAll, q=5, PFER=2, folds=folds, grid=1:100, + sampling.type="SS", mc.cores = 1) +sel1 +# selects effects T_C, T_A, T_C_T_A +@ +The effects $T_A$, $T_C$ and their interaction are selected into the model. + + +% <>= +% set.seed(1911) +% folds <- cvMa(ydim=modAll$ydim, weights=model.weights(modAll), +% type = "subsampling", B = 50) +% +% stabsel_parameters(q=3, PFER=1, p=16, sampling.type = "SS") +% sel2 <- stabsel(modAll, q=3, PFER=1, folds=folds, grid=1:100, +% sampling.type="SS", mc.cores=10) +% sel2 +% # selects effects of T_C, T_A +% @ + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage + +\section{Model with selected effects} + +Estimate the model containig only the selected effects $T_C$, $T_A$, and their interaction. +<>= +set.seed(1911) +mod1 <- FDboost(vis ~ 1 + bols(T_C) + bols(T_A) + bols(T_C_T_A), + timeformula = ~bbs(time, lambda = 100), + numInt = "Riemann", family = QuantReg(), check0 = FALSE, + offset = NULL, offset_control = o_control(k_min = 10), + data = viscosity, control = boost_control(mstop = 200, nu = 0.2)) +@ + +<>= +mod1 <- mod1[430] +@ + +Find the optimal stopping iteration (better use multiple cores). +<>= +set.seed(1911) +folds <- cv(weights = rep(1, mod1$ydim[1]), type = "bootstrap", B = 10) +cvm1 <- validateFDboost(mod1, folds = folds, getCoefCV = FALSE, + grid = seq(10, 500, by = 10), mc.cores = 1) +mstop(cvm1) # 430 +mod1 <- mod1[mstop(cvm1)] +# summary(mod1) +@ + +% \begin{figure} +% \begin{center} +% <>= +% par(mfrow=c(1,2)) +% plot(cvm1) +% @ +% \end{center} +% \caption{Optimal stopping iteration for model with selected effects.} +% \end{figure} + + +Center all coefficient functions at each timepoint, yielding the following model: +\[\mbox{median} \{ \log( \mbox{vis}_i(t)) | x_i \} = \beta_0(t) + T_{Ai} \beta_A(t) + T_{Ci} \beta_C(t) + T_{ACi} \beta_{AC}(t), \] +where $\mbox{vis}_i(t)$ is the viscosity of observation $i$ at time $t$, $T_{Ai}$ and $T_{Ci}$ are the temperatures of resin and of tools, respectively, each coded as -1 for the lower and 1 for the higher temperature. The interaction $T_{ACi}$ is 1 if both temperatures are in the higher category and -1 otherwise. +<>= +# set up dataframe containing systematically all variable combinations +newdata <- list(T_C=factor(c(1,1,2,2), levels=1:2, labels=c("low","high")) , + T_A=factor(c(1, 2, 1, 2), levels=1:2, labels=c("low","high")), + T_C_T_A=factor(c(1, 1, 1, 2)), time=mod1$yind) +intercept <- 0 + +## effect of T_C +pred2 <- predict(mod1, which=2, newdata=newdata) +intercept <- intercept + colMeans(pred2) +pred2 <- t(t(pred2)-intercept) + +## effect of T_A +pred3 <- predict(mod1, which=3, newdata=newdata) +intercept <- intercept + colMeans(pred3) +pred3 <- t(t(pred3)-colMeans(pred3)) + +## interaction effect T_C_T_A +pred4 <- predict(mod1, which=4, newdata=newdata) +intercept <- intercept + colMeans(pred4[3:4,]) +pred4 <- t(t(pred4)-colMeans(pred4[3:4,])) + +# offset+intercept +smoothIntercept <- mod1$predictOffset(newdata$time) + intercept +@ + +Plot the centered coefficient functions. +<>= +par(mfrow=c(1,2), mar=c(3, 3, 1, 2))#, cex=1.5) + +mycol <- gray(seq(0, 0.8, l=4), alpha=0.8)[c(1,3,2,4)] +int_T_CA <- with(viscosity, paste(T_C,"-", T_A, sep="")) +with(viscosity, funplotLogscale(time, vis, + col=getCol2(int_T_CA, cols=mycol[4:1]))) +legend("bottomright", fill=mycol, + legend=c("T_C low, T_A low", "T_C low, T_A high", + "T_C high, T_A low", "T_C high, T_A high")) + +mycol <- gray(seq(0, 0.5, l=3), alpha=0.8) +funplotLogscale(mod1$yind, pred2[3:4,], col=mycol[1], ylim=c(-0.5,6), lty=2, lwd=2) +lines(mod1$yind, pred3[2,], col=mycol[2], lty=3, lwd=2) +lines(mod1$yind, pred4[4,], col=mycol[3], lty=4, lwd=2) +legend("topright", lty=2:4, lwd=2, col=mycol, + legend=c("effect T_C high", "effect T_A high", "effect T_C, T_A high")) + +@ + +\section*{References} +\begin{itemize} +\item[] Brockhaus S, Scheipl, F., Hothor, T., and Greven, S. (2015), The functional linear array model, + \textit{Statistical Modelling}, 15(3), 279--300. +\end{itemize} + + +\end{document} diff --git a/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/density-on-scalar_birth.Rnw b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/density-on-scalar_birth.Rnw new file mode 100644 index 0000000..1bbacb6 --- /dev/null +++ b/FDboost.Rcheck/00_pkg_src/FDboost/vignettes/density-on-scalar_birth.Rnw @@ -0,0 +1,312 @@ +\documentclass{article} +\usepackage{amstext} +\usepackage{amsfonts} +\usepackage{amsmath} +\usepackage{hyperref} +\usepackage[round]{natbib} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{rotating} +\usepackage{authblk} +\usepackage[left=25mm, right=25mm, top=20mm, bottom=20mm]{geometry} +%\usepackage[nolists]{endfloat} +%\usepackage{mathspec} +\usepackage{dsfont} +\usepackage{bbm} + +%\VignetteEngine{knitr::knitr} +%\VignetteDepends{FDboost, fda, fields, maps, mapdata} +%\VignetteIndexEntry{FDboost density-on-scalar births} + +\newcommand{\Rpackage}[1]{{\normalfont\fontseries{b}\selectfont #1}} +\newcommand{\Robject}[1]{\texttt{#1}} +\newcommand{\Rclass}[1]{\textit{#1}} +\newcommand{\Rcmd}[1]{\texttt{#1}} +\newcommand{\Roperator}[1]{\texttt{#1}} +\newcommand{\Rarg}[1]{\texttt{#1}} +\newcommand{\Rlevel}[1]{\texttt{#1}} + +\newcommand{\RR}{\textsf{R}} +\renewcommand{\S}{\textsf{S}} +\newcommand{\df}{\mbox{df}} +\DeclareMathOperator{\clr}{clr} +\newcommand{\ddelta}{\, \mathrm{d}\delta} + +\RequirePackage[T1]{fontenc} +\RequirePackage{graphicx,ae,fancyvrb} +\IfFileExists{upquote.sty}{\RequirePackage{upquote}}{} +\usepackage{relsize} + +\renewcommand{\baselinestretch}{1} +\setlength\parindent{0pt} + + +\hypersetup{% + pdftitle = {density-on-scalar births}, + pdfsubject = {package vignette}, + pdfauthor = {Eva-Maria Maier}, +%% change colorlinks to false for pretty printing + colorlinks = {true}, + linkcolor = {blue}, + citecolor = {blue}, + urlcolor = {red}, + hyperindex = {true}, + linktocpage = {true}, +} + +\begin{document} + +\setkeys{Gin}{width=\textwidth} + +\title{Live births in Germany: density-on-scalar regression} +\author{Eva-Maria Maier +\thanks{E-mail: eva-maria.maier@hu-berlin.de}} +\affil{\textit{Wirtschaftswissenschaftliche Fakult\"at, \\ +Humboldt-Universit\"at zu Berlin, \\ +Unter den Linden 6, D-10099 Berlin, Germany.}} +% Spandauer Stra{\ss}e 1, D-10178 Berlin, Germany.}} +\date{} +\maketitle + +% Inline code evaluation with \Sexpr{}, e.g., \Sexpr{length(1:10)} + +% \noindent$^1$ +% \newline + +% To Do: Referenzen, wenn mein Paper auf Arxiv + +\noindent +This vignette illustrates how to use \Rpackage{FDboost}, which was designed for functional regression (Brockhaus et al., 2015), +for density-on-scalar regression. +Despite being a special case of function-on-scalar regression (at least for densities defined on a nontrivial interval with respect to the Lebesgue measure, which we refer to as \emph{continuous case}), it has to be treated differently due to the special properties of probability density functions, namely nonnegativity and integration to one. +Our vignette is based on the approach by Maier et al. (2021). + +\section{Load and plot data} + +We use the data set \texttt{birthDistribution} from the package \Rpackage{FDboost}, containing densities of live births in Germany over the months per year (1950-2019) and sex (male and female), resulting in 140 densities. +It is a list with the following elements: +\begin{itemize} +\item +\texttt{birth\_densities}: +A 140 x 12 matrix containing the birth densities in its rows. The first 70 rows correspond to male newborns, the second 70 rows to female ones. Within both of these, the years are ordered increasingly (1950-2019). +\item +\texttt{birth\_densities\_clr}: +A 140 x 12 matrix containing the clr transformed densities in its rows. Same structure as \texttt{birth\_densities}. +\item +\texttt{sex}: +A factor vector of length 140 with levels \texttt{"m"} (male) and \texttt{"f"} (female), corresponding to the sex of the newborns for the rows of \texttt{birth\_densities} and \texttt{birth\_densities\_clr}. The first 70 elements are \texttt{"m"}, the second 70 \texttt{"f"}. +\item +\texttt{year}: +A vector of length 140 containing the integers $1950, \ldots, 2019, 1950, \ldots, 2019$, corresponding to the years for the rows of \texttt{birth\_densities} and \texttt{birth\_densities\_clr}. +\item +\texttt{month}: +A vector containing the integers from 1 to 12, corresponding to the months for the columns of \texttt{birth\_densities} and \texttt{birth\_densities\_clr} (domain $\mathcal{T}$ of the (clr-)densities). +\end{itemize} +This list already is in the format needed to pass it to \Roperator{FDboost}. +Note that to compensate for the different lengths of the months, the average number of births per day for each month (by sex and year) was used to compute the birth shares from the absolute birth counts. +The 12 shares corresponding to one year and sex form one density in the Bayes Hilbert space $B^2(\delta) = B^2\left( \mathcal{T}, \mathcal{A}, \delta\right)$, where $\mathcal{T} = \{1, \ldots, 12\}$ corresponds to the set of the 12 months, $\mathcal{A} := \mathcal{P}(\mathcal{T})$ corresponds to the power set of $\mathcal{T}$, and the reference measure $\delta := \sum_{t = 1}^{12} \delta_t$ corresponds to the sum of dirac measures at $t \in \mathcal{T}$. +Thus, our analysis is an example for the discrete case and the integral of a density is simply the sum of all 12 share values. +We indicate how to proceed in the continuous case, whenever it is distinct from the discrete one over the course of this vignette. +We denote the density contained in the $i$-th row of \texttt{birth\_densities} with $f_i = f_{sex_i, year_i}$, where $sex_i$ and $year_i$ denote the $i$-th elements of \texttt{sex} and \texttt{year}, respectively, $i = 1, \ldots, 140$. +We load the package and the data and plot the densities: +<>= +# load FDboost package +library(FDboost) +# load birth_densities +data("birthDistribution", package = "FDboost") + +# function to plot a matrix or vector containing functions in B^2(delta) or L^2_0(delta); +# Is used for densities, effects, predictions (also clr transformed) +plot_function <- function(plot_matrix, ...) { + funplot(1:12, plot_matrix, xlab = "month", xaxp = c(1, 12, 11), pch = 20, ...) + abline( h = 0, col = "grey", lwd = 0.5) +} + +# function to create two plots (by sex) from a matrix containing densities or predictions +# (also clr transformed) for males in first half of rows and females in second half +plot_birth_densities <- function(birth_matrix, ylim = range(birth_matrix), ...) { + par(mfrow = c(1, 2)) + for (k in 1:2) { + n_obs <- nrow(birth_matrix) / 2 + obs <- 1:n_obs + (k - 1) * n_obs + plot_function(birth_matrix[obs, ], main = c("Male", "Female")[k], + ylim = ylim, col = rainbow(n_obs, start = 0.5, end = 1), + lty = c(1, 2, 4, 5), ...) + } +} + +# Plot densities +plot_birth_densities(birthDistribution$birth_densities, ylab = "densities") +@ + +<>= +# legend (also for later plots) +year_col <- rainbow(70, start = 0.5, end = 1) +year_lty <- c(1, 2, 4, 5) +par(mar = c(0, 0, 0, 0) + 0.1) +plot(NULL, xaxt = "n", yaxt = "n", bty = "n", ylab = "", xlab = "", xlim = 0:1, ylim = 0:1) +legend("top", xpd = TRUE, legend = 1950:2019, lty = year_lty, ncol = 10, bty = "n", + text.col = year_col, col = year_col, cex = 0.7) +@ + +\pagebreak +Overall, the range of the density values is quite small (from \Sexpr{round(min(birthDistribution$birth_densities), 3)} to \Sexpr{round(max(birthDistribution$birth_densities), 3)}). +While there is hardly a visible difference between the two sexes, we see a trend over the years: +In the early months of the years the density values tend to decrease, in the later ones it is vice versa. + +%\clearpage + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Model equation and clr transformation} + +We consider the model +\begin{align} +f_i = &\beta_0 \oplus I(sex_i = sex) \odot \beta_{sex} \oplus g(year_i) \oplus \varepsilon_i, && i= 1, \ldots , 140, \label{model_bayes} +\intertext{with a group-specific intercept $\beta_{sex}$ for $sex \in \{ \text{male, female} \}$, a flexible effect $g(year)$ for $year \in [1950, 2019]$, and functional error terms $\varepsilon_i \in B^2(\delta)$ with $\mathbb{E}(\varepsilon_i) = 0$ the additive neutral element of $B^2(\delta)$, corresponding to a constant density. +Equivalently, we can consider the centered log-ratio (clr) transformed model} +\clr \left[ f_i \right] += &\clr \left[ \beta_0 \right] + I(sex_i = sex) \cdot \clr \left[ \beta_{sex} \right] + \clr \left[ g(year_i)\right] + \clr \left[ \varepsilon_i \right] && i= 1, \ldots , 140, \label{model_clr} +\end{align} +for estimation, which is part of $L_0^2(\delta) = L_0^2\left( \mathcal{T}, \mathcal{A}, \delta\right) = \left\{ f \in L^2\left( \delta \right) ~|~ \int_{\mathcal{T}} f \, \mathrm{d}\delta = 0 \right\}$, a closed subspace of $L^2(\delta) = L^2\left( \mathcal{T}, \mathcal{A}, \delta\right)$. +\Rpackage{FDboost} was desiged for functions in $L^2(\mathbb{R}, \mathfrak{B}, \lambda)$, where $\mathfrak{B}$ denotes the Borel $\sigma$-algebra and $\lambda$ the Legesgue measure. +However, with some unfamiliar specifications, \Rpackage{FDboost} can be used to estimate model \eqref{model_clr}. +% Estimating a density-on-scalar model in the continuous case works similarly. +Thus, our first step towards estimation is to apply the clr transformation on our densities, which is given by +\begin{align} +\clr \left[ f \right] +:= \log f - \frac1{\delta(\mathcal{T})} \int_{\mathcal{T}} \log f \ddelta += \log f_ - \frac1{12} \sum_{t = 1}^{12} \log f(t). \label{definition_clr} %, i = 1, \ldots, 140 +\end{align} +We call the resulting clr transformed densities \emph{clr-densities} in the following. +The data set \texttt{birthDistribution} already contains the clr-densities. +Whenever that's not the case, one can use the function \Roperator{clr()} to compute the clr-densities, which we include here for the sake of completeness. +Note that the choice of appropriate integration weights \texttt{w} for the corresponding Bayes Hilbert space is crucial to get a reasonable result. +In our discrete case, equal weights \texttt{w = 1} are appropriate. +In the continuous case, the choice of the weights depends on the grid on which the function was evaluated. +The weight for each function value must correspond to the length of the subinterval it represents. +E.g., for a function defined on $\mathcal{T} = [a, b]$ evaluated on a grid with equidistant distance $d$, where the boundary grid values are $a + \frac{d}{2}$ and $b - \frac{d}{2}$ (i.e., the grid points are centers of subintervals of size $d$), equal weights $d$ should be chosen for \texttt{w}. + +<>= +# The function clr() can be used to compute the clr-densities; Our reference measure delta +# corresponds to equal integration weights w = 1 for all density values +birth_densities_clr_test <- t(apply(birthDistribution$birth_densities, 1, clr, w = 1)) +# Compare with clr-densities contained in data set +sum(birth_densities_clr_test != birthDistribution$birth_densities_clr) +# Plot clr-densities +plot_birth_densities(birthDistribution$birth_densities_clr, ylab = "clr-densities") +@ + +\pagebreak +Due to the small range of the density values in this example, their shape is very similar to the original densities, see Figure \ref{fig:plot-data}. +In general, this is not the case. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Estimation} + +When fitting model \eqref{model_clr} with the function \texttt{FDboost}, the specification of the \texttt{timeformula} needs some special attention. +First, we must respect the integrate-to-zero constraint of $L_0^2(\delta)$. +This is achieved by using the constrained base-learner \texttt{bbsc} in the \texttt{timeformula} (instead of the unconstrained \texttt{bbs} as usual), which transforms the basis such that it fulfills the sum-to-zero constraint. +In our discrete case, this corresponds to the integrate-to-zero constraint directly. +In the continuous case, the sum is proportional to the integral numerically, if the grid points where the function is evaluated are selected appropriately (e.g., centers of equal sized subintervals). +Thus, using \texttt{bbsc} is suitable in this case, as well. +Second, we must specify the B-spline basis in \texttt{bbsc} appropriately. +The continuous case is straightforward, e.g., by using cubic B-splines. +In our discrete case, a suitable (unconstrained) basis is $(\mathds{1}_{\{1\}}, \ldots, \mathds{1}_{\{12\}}) \in L^2 ( \delta)^{12}$, where $\mathds{1}_{A}$ denotes the indicator function of $A \in \mathcal{A}$. +This results in the identity matrix as design matrix. +In \texttt{bbs()} (or \texttt{bbsc()}, which yields the corresponding constrained basis), this can be achieved using \texttt{degree = 1} with knots equal to $\mathcal{T}$. + +<>= +model <- FDboost(birth_densities_clr ~ 1 + bolsc(sex, df = 1) + + bbsc(year, df = 1, differences = 1), + # use bbsc() in timeformula to ensure integrate-to-zero constraint + timeformula = ~bbsc(month, df = 4, + # December is followed by January of subsequent year + cyclic = TRUE, + # knots = {1, ..., 12} with additional boundary knot + # 0 (coinciding with 12) due to cyclic = TRUE + knots = 1:11, boundary.knots = c(0, 12), + # degree = 1 with these knots yields identity matrix + # as design matrix + degree = 1), + data = birthDistribution, offset = 0, + control = boost_control(mstop = 1000)) +@ + +To determine the optimal stopping iteration we perform a $10$-fold bootstrap. +This is rather time-consuming (especially in the continuous case, when the response densities are evaluated at many grid-values) and preferably should be executed parallelized on multiple cores. In order to avoid long compilation times for the vignette, the following code is commented out, but it should be possible to obtain the same stopping iteration within a few minutes. +<>= +# set.seed(1708) +# folds <- applyFolds(model, folds = cv(rep(1, model$ydim[1]), type = "bootstrap", B = 10)) +# ms <- mstop(folds) # = 999 +ms <- 999 +model <- model[ms] +@ + +Our final object \texttt{model} contains the fit of model~\eqref{model_clr}, i.e., on clr-level. +<>= +# Plotting 'model' yields the clr-transformed effects +par(mfrow = c(1, 3)) +plot(model, n1 = 12, n2 = 12) +@ + +Since model~\eqref{model_clr} is equivalent to model~\eqref{model_bayes} via the clr transformation, we have to use the inverse clr transformation to get densities of interest (like estimated effects or predictions) for model~\eqref{model_bayes} in the Bayes Hilbert space, after extracting them from \texttt{model}. +The inverse clr transformation is given by +\[ +\clr^{-1} (\tilde{f}) +:= \frac{\exp\tilde{f}}{\int_{\mathcal{T}} \exp\tilde{f} \ddelta} += \frac{\exp\tilde{f}}{\sum_{t=1}^{12} \exp\tilde{f}(t)}. +\] +for $\tilde{f} \in L_0^2(\delta)$ and can be computed using \texttt{clr(..., inverse = TRUE)}, again specifying appropriate integration weights \texttt{w}. +Note that in contrast to Maier et al. (2021), the definition above includes normalization to obtain the probability density function (which is the representative of the equivalence class of proportional functions in $B^2(\delta)$). +<>= +# Get estimated clr transformed effects; we use predict(), which returns a matrix of the +# same dimension as the response (140 x 12), i.e., we have to extract the respective rows; +# Alternatively, one could use coef(), but has to specify n1 = 12, n2 = 12 to get the den- +# sities at 1, ..., 12, which also only yields the year effect on a grid of 12 years + +# all rows contain intercept +intercept_clr <- predict(model, which = 1)[1, ] +# first 70 rows contain effect for sex = male, second 70 rows for sex = female +sex_clr <- predict(model, which = 2)[c(1, 71), ] +# first 70 rows contain effect for years from 1950 to 2019, second 70 rows are repetition +year_clr <- predict(model, which = 3)[1:70, ] + +sex_col <- c("blue", "red") +par(mfrow = c(1, 3), mar = c(5, 5, 4, 2) + 0.1) + +# Retransform to Bayes Hilbert space using clr(..., inverse = TRUE); Our reference measure +# delta corresponds to equal integration weights w = 1 for all function values +intercept <- clr(intercept_clr, w = 1, inverse = TRUE) +sex <- t(apply(sex_clr, 1, clr, w = 1, inverse = TRUE)) +year <- t(apply(year_clr, 1, clr, w = 1, inverse = TRUE)) + +# Plot retransformed effects +plot_function(intercept, main = "Intercept", ylab = expression(hat(beta)[0]), + id = rep(1, 12)) # id is passed to funplot since intercept is a vector +plot_function(sex, main = "Effect of sex", col = sex_col, + ylab = expression(hat(beta)["sex"])) +legend("topleft", legend = c("sex = male", "sex = female"), text.col = sex_col, bty = "n") +plot_function(year, main = "Effect of year", col = year_col, + ylab = expression(hat(g)("year")), lty = year_lty) +@ + +While all effects get selected by the algorithm, the effects of sex are very small. +We plot the predictions using the same range as in Figure \ref{fig:plot-data} for better comparison: +<>= +predictions_clr <- predict(model) +predictions <- t(apply(predictions_clr, 1, clr, inverse = TRUE)) +plot_birth_densities(predictions, ylim = range(birthDistribution$birth_densities), + ylab = "predictions") +@ +\section*{References} +\begin{itemize} +\item[] Brockhaus, S., Scheipl, F., Hothorn, T., and Greven, S. (2015). The functional linear array model. + \textit{Statistical Modelling} 15(3), 279--300. +\item[] Maier, E.-M., St\"ocker, A., Fitzenberger, B., Greven, S. (2021). Additive Density-on-Scalar Regression in Bayes Hilbert Spaces with an Application to Gender Economics. \textit{arXiv preprint arXiv:2110.11771.} +\end{itemize} + + + +\end{document} \ No newline at end of file diff --git a/FDboost.Rcheck/00check.log b/FDboost.Rcheck/00check.log new file mode 100644 index 0000000..3ed68dc --- /dev/null +++ b/FDboost.Rcheck/00check.log @@ -0,0 +1,79 @@ +* using log directory ‘/home/david/projects/FDboost/FDboost.Rcheck’ +* using R version 4.5.0 (2025-04-11) +* using platform: x86_64-pc-linux-gnu +* R was compiled by + gcc (Ubuntu 14.2.0-4ubuntu2) 14.2.0 + GNU Fortran (Ubuntu 14.2.0-4ubuntu2) 14.2.0 +* running under: Ubuntu 24.10 +* using session charset: UTF-8 +* checking for file ‘FDboost/DESCRIPTION’ ... OK +* checking extension type ... Package +* this is package ‘FDboost’ version ‘1.1-4’ +* package encoding: UTF-8 +* checking package namespace information ... OK +* checking package dependencies ... INFO +Package suggested but not available for checking: ‘mapdata’ +* checking if this is a source package ... OK +* checking if there is a namespace ... OK +* checking for executable files ... OK +* checking for hidden files and directories ... NOTE +Found the following hidden files and directories: + .codex +These were most likely included in error. See section ‘Package +structure’ in the ‘Writing R Extensions’ manual. +* checking for portable file names ... OK +* checking for sufficient/correct file permissions ... OK +* checking whether package ‘FDboost’ can be installed ... OK +* checking installed package size ... OK +* checking package directory ... OK +* checking ‘build’ directory ... OK +* checking DESCRIPTION meta-information ... OK +* checking top-level files ... OK +* checking for left-over files ... OK +* checking index information ... OK +* checking package subdirectories ... OK +* checking code files for non-ASCII characters ... OK +* checking R files for syntax errors ... OK +* checking whether the package can be loaded ... OK +* checking whether the package can be loaded with stated dependencies ... OK +* checking whether the package can be unloaded cleanly ... OK +* checking whether the namespace can be loaded with stated dependencies ... OK +* checking whether the namespace can be unloaded cleanly ... OK +* checking loading without being on the library search path ... OK +* checking whether startup messages can be suppressed ... OK +* checking dependencies in R code ... OK +* checking S3 generic/method consistency ... OK +* checking replacement functions ... OK +* checking foreign function calls ... OK +* checking R code for possible problems ... OK +* checking Rd files ... OK +* checking Rd metadata ... OK +* checking Rd cross-references ... OK +* checking for missing documentation entries ... OK +* checking for code/documentation mismatches ... OK +* checking Rd \usage sections ... OK +* checking Rd contents ... OK +* checking for unstated dependencies in examples ... OK +* checking contents of ‘data’ directory ... OK +* checking data for non-ASCII characters ... OK +* checking data for ASCII and uncompressed saves ... OK +* checking installed files from ‘inst/doc’ ... OK +* checking files in ‘vignettes’ ... OK +* checking examples ... OK +* checking for unstated dependencies in ‘tests’ ... OK +* checking tests ... OK + Running ‘factorize_test_irregular.R’ + Running ‘factorize_test_regular.R’ + Running ‘general_tests.R’ +* checking for unstated dependencies in vignettes ... OK +* checking package vignettes ... OK +* checking re-building of vignette outputs ... NOTE +Note: skipping ‘density-on-scalar_birth.Rnw’ due to unavailable dependencies: + 'mapdata' +Note: skipping ‘FLAM_canada.Rnw’ due to unavailable dependencies: 'mapdata' +Note: skipping ‘FLAM_fuel.Rnw’ due to unavailable dependencies: 'mapdata' +Note: skipping ‘FLAM_viscosity.Rnw’ due to unavailable dependencies: + 'mapdata' +* checking PDF version of manual ... OK +* DONE +Status: 2 NOTEs diff --git a/FDboost.Rcheck/00install.out b/FDboost.Rcheck/00install.out new file mode 100644 index 0000000..9331c45 --- /dev/null +++ b/FDboost.Rcheck/00install.out @@ -0,0 +1,15 @@ +* installing *source* package ‘FDboost’ ... +** this is package ‘FDboost’ version ‘1.1-4’ +** using staged installation +** R +** data +** inst +** byte-compile and prepare package for lazy loading +** help +*** installing help indices +** building package indices +** installing vignettes +** testing if installed package can be loaded from temporary location +** testing if installed package can be loaded from final location +** testing if installed package keeps a record of temporary installation path +* DONE (FDboost) diff --git a/FDboost.Rcheck/FDboost-Ex.R b/FDboost.Rcheck/FDboost-Ex.R new file mode 100644 index 0000000..873453d --- /dev/null +++ b/FDboost.Rcheck/FDboost-Ex.R @@ -0,0 +1,1522 @@ +pkgname <- "FDboost" +source(file.path(R.home("share"), "R", "examples-header.R")) +options(warn = 1) +library('FDboost') + +base::assign(".oldSearch", base::search(), pos = 'CheckExEnv') +base::assign(".old_wd", base::getwd(), pos = 'CheckExEnv') +cleanEx() +nameEx("FDboost") +### * FDboost + +flush(stderr()); flush(stdout()) + +### Name: FDboost +### Title: Model-based Gradient Boosting for Functional Response +### Aliases: FDboost +### Keywords: models nonlinear regression smooth + +### ** Examples + +######## Example for function-on-scalar-regression +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## fit median regression model with 100 boosting iterations, +## step-length 0.4 and smooth time-specific offset +## the factors are coded such that the effects are zero for each timepoint t +## no integration weights are used! +mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df = 2) + bolsc(T_A, df = 2), + timeformula = ~ bbs(time, df = 4), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) + + +######## Example for scalar-on-function-regression +data("fuelSubset", package = "FDboost") + +## center the functional covariates per observed wavelength +fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) +fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) + +## to make mboost:::df2lambda() happy (all design matrix entries < 10) +## reduce range of argvals to [0,1] to get smaller integration weights +fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / + (max(uvvis.lambda) - min(uvvis.lambda) )) +fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / + (max(nir.lambda) - min(nir.lambda) )) + +## model fit with scalar response +## include no intercept as all base-learners are centered around 0 +mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE), + timeformula = NULL, data = fuelSubset, control = boost_control(mstop = 200)) + +## additionally include a non-linear effect of the scalar variable h2o +mod2s <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE) + + bbs(h2o, df = 4), + timeformula = NULL, data = fuelSubset, control = boost_control(mstop = 200)) + +## alternative model fit as FLAM model with scalar response; as timeformula = ~ bols(1) +## adds a penalty over the index of the response, i.e., here a ridge penalty +## thus, mod2f and mod2 have different penalties +mod2f <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df = 4, check.ident = FALSE), + timeformula = ~ bols(1), data = fuelSubset, control = boost_control(mstop = 200)) + + +## Example for function-on-function-regression +if(require(fda)){ + + data("CanadianWeather", package = "fda") + CanadianWeather$l10precip <- t(log(CanadianWeather$monthlyPrecip)) + CanadianWeather$temp <- t(CanadianWeather$monthlyTemp) + CanadianWeather$region <- factor(CanadianWeather$region) + CanadianWeather$month.s <- CanadianWeather$month.t <- 1:12 + + ## center the temperature curves per time-point + CanadianWeather$temp <- scale(CanadianWeather$temp, scale = FALSE) + rownames(CanadianWeather$temp) <- NULL ## delete row-names + + ## fit model with cyclic splines over the year + mod3 <- FDboost(l10precip ~ bols(region, df = 2.5, contrasts.arg = "contr.dummy") + + bsignal(temp, month.s, knots = 11, cyclic = TRUE, + df = 2.5, boundary.knots = c(0.5,12.5), check.ident = FALSE), + timeformula = ~ bbs(month.t, knots = 11, cyclic = TRUE, + df = 3, boundary.knots = c(0.5, 12.5)), + offset = "scalar", offset_control = o_control(k_min = 5), + control = boost_control(mstop = 60), + data = CanadianWeather) + +} + +######## Example for functional response observed on irregular grid +######## Delete part of observations in viscosity data-set +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## only keep one eighth of the observation points +set.seed(123) +selectObs <- sort(sample(x = 1:(64*46), size = 64*46/4, replace = FALSE)) +dataIrregular <- with(viscosity, list(vis = c(vis)[selectObs], + T_A = T_A, T_C = T_C, + time = rep(time, each = 64)[selectObs], + id = rep(1:64, 46)[selectObs])) + +## fit median regression model with 50 boosting iterations, +## step-length 0.4 and smooth time-specific offset +## the factors are in effect coding -1, 1 for the levels +## no integration weights are used! +mod4 <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept = FALSE) + + bols(T_A, contrasts.arg = "contr.sum", intercept=FALSE), + timeformula = ~ bbs(time, lambda = 100), id = ~id, + numInt = "Riemann", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = dataIrregular, control = boost_control(mstop = 50, nu = 0.4)) +## summary(mod4) +## plot(mod4) +## plotPredicted(mod4, lwdPred = 2) + + +## Be careful if you want to predict newdata with irregular response, +## as the argument index is not considered in the prediction of newdata. +## Thus, all covariates have to be repeated according to the number of observations +## in each response trajectroy. +## Predict four response curves with full time-observations +## for the four combinations of T_A and T_C. +newd <- list(T_A = factor(c(1,1,2,2), levels = 1:2, + labels = c("low", "high"))[rep(1:4, length(viscosity$time))], + T_C = factor(c(1,2,1,2), levels = 1:2, + labels = c("low", "high"))[rep(1:4, length(viscosity$time))], + time = rep(viscosity$time, 4)) + +pred <- predict(mod4, newdata = newd) +## funplot(x = rep(viscosity$time, 4), y = pred, id = rep(1:4, length(viscosity$time))) + + + + + +cleanEx() +nameEx("FDboostLSS") +### * FDboostLSS + +flush(stderr()); flush(stdout()) + +### Name: FDboostLSS +### Title: Model-based Gradient Boosting for Functional GAMLSS +### Aliases: FDboostLSS +### Keywords: models nonlinear regression smooth + +### ** Examples + +########### simulate Gaussian scalar-on-function data +n <- 500 ## number of observations +G <- 120 ## number of observations per functional covariate +set.seed(123) ## ensure reproducibility +z <- runif(n) ## scalar covariate +z <- z - mean(z) +s <- seq(0, 1, l=G) ## index of functional covariate +## generate functional covariate +if(require(splines)){ + x <- t(replicate(n, drop(bs(s, df = 5, int = TRUE) %*% runif(5, min = -1, max = 1)))) +}else{ + x <- matrix(rnorm(n*G), ncol = G, nrow = n) +} +x <- scale(x, center = TRUE, scale = FALSE) ## center x per observation point + +mu <- 2 + 0.5*z + (1/G*x) %*% sin(s*pi)*5 ## true functions for expectation +sigma <- exp(0.5*z - (1/G*x) %*% cos(s*pi)*2) ## for standard deviation + +y <- rnorm(mean = mu, sd = sigma, n = n) ## draw respone y_i ~ N(mu_i, sigma_i) + +## save data as list containing s as well +dat_list <- list(y = y, z = z, x = I(x), s = s) + +## model fit with noncyclic algorithm assuming Gaussian location scale model +m_boost <- FDboostLSS(list(mu = y ~ bols(z, df = 2) + bsignal(x, s, df = 2, knots = 16), + sigma = y ~ bols(z, df = 2) + bsignal(x, s, df = 2, knots = 16)), + timeformula = NULL, data = dat_list, method = "noncyclic") +summary(m_boost) + + + + +cleanEx() +nameEx("anisotropic_Kronecker") +### * anisotropic_Kronecker + +flush(stderr()); flush(stdout()) + +### Name: anisotropic_Kronecker +### Title: Kronecker product or row tensor product of two base-learners +### with anisotropic penalty +### Aliases: anisotropic_Kronecker %A% %A0% %Xa0% + +### ** Examples + + +######## Example for anisotropic penalty +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## isotropic penalty, as timeformula is kroneckered to each effect using %O% +## only for the smooth intercept %A0% is used, as 1-direction should not be penalized +mod1 <- FDboost(vis ~ 1 + + bolsc(T_C, df = 1) + + bolsc(T_A, df = 1) + + bols(T_C, df = 1) %Xc% bols(T_A, df = 1), + timeformula = ~ bbs(time, df = 3), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +## cf. the formula that is passed to mboost +mod1$formulaMboost + +## anisotropic effects using %A0%, as lambda1 = 0 for all base-learners +## in this case using %A% gives the same model, but three lambdas are computed explicitly +mod1a <- FDboost(vis ~ 1 + + bolsc(T_C, df = 1) %A0% bbs(time, df = 3) + + bolsc(T_A, df = 1) %A0% bbs(time, df = 3) + + bols(T_C, df = 1) %Xc% bols(T_A, df = 1) %A0% bbs(time, df = 3), + timeformula = ~ bbs(time, df = 3), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +## cf. the formula that is passed to mboost +mod1a$formulaMboost + +## alternative model specification by using a 0-matrix as penalty +## only works for bolsc() as in bols() one cannot specify K +## -> model without interaction term +K0 <- matrix(0, ncol = 2, nrow = 2) +mod1k0 <- FDboost(vis ~ 1 + + bolsc(T_C, df = 1, K = K0) + + bolsc(T_A, df = 1, K = K0), + timeformula = ~ bbs(time, df = 3), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) +## cf. the formula that is passed to mboost +mod1k0$formulaMboost + +## optimize mstop for mod1, mod1a and mod1k0 +## ... + +## compare estimated coefficients + + + + +cleanEx() +nameEx("applyFolds") +### * applyFolds + +flush(stderr()); flush(stdout()) + +### Name: applyFolds +### Title: Cross-Validation and Bootstrapping over Curves +### Aliases: applyFolds cvMa cvLong cvrisk.FDboost + +### ** Examples + +Ytest <- matrix(rnorm(15), ncol = 3) # 5 trajectories, each with 3 observations +Ylong <- as.vector(Ytest) +## 4-folds for bootstrap for the response in long format without integration weights +cvMa(ydim = c(5,3), type = "bootstrap", B = 4) +cvLong(id = rep(1:5, times = 3), type = "bootstrap", B = 4) + +if(require(fda)){ + ## load the data + data("CanadianWeather", package = "fda") + + ## use data on a daily basis + canada <- with(CanadianWeather, + list(temp = t(dailyAv[ , , "Temperature.C"]), + l10precip = t(dailyAv[ , , "log10precip"]), + l10precip_mean = log(colMeans(dailyAv[ , , "Precipitation.mm"]), base = 10), + lat = coordinates[ , "N.latitude"], + lon = coordinates[ , "W.longitude"], + region = factor(region), + place = factor(place), + day = 1:365, ## corresponds to t: evaluation points of the fun. response + day_s = 1:365)) ## corresponds to s: evaluation points of the fun. covariate + +## center temperature curves per day +canada$tempRaw <- canada$temp +canada$temp <- scale(canada$temp, scale = FALSE) +rownames(canada$temp) <- NULL ## delete row-names + +## fit the model +mod <- FDboost(l10precip ~ 1 + bolsc(region, df = 4) + + bsignal(temp, s = day_s, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), + timeformula = ~ bbs(day, cyclic = TRUE, boundary.knots = c(0.5, 365.5)), + data = canada) +mod <- mod[75] + + + +} + + + + +cleanEx() +nameEx("bbsc") +### * bbsc + +flush(stderr()); flush(stdout()) + +### Name: bbsc +### Title: Constrained Base-learners for Scalar Covariates +### Aliases: bbsc brandomc bolsc +### Keywords: models + +### ** Examples + +#### simulate data with functional response and scalar covariate (functional ANOVA) +n <- 60 ## number of cases +Gy <- 27 ## number of observation poionts per response curve +dat <- list() +dat$t <- (1:Gy-1)^2/(Gy-1)^2 +set.seed(123) +dat$z1 <- rep(c(-1, 1), length = n) +dat$z1_fac <- factor(dat$z1, levels = c(-1, 1), labels = c("1", "2")) +# dat$z1 <- runif(n) +# dat$z1 <- dat$z1 - mean(dat$z1) + +# mean and standard deviation for the functional response +mut <- matrix(2*sin(pi*dat$t), ncol = Gy, nrow = n, byrow = TRUE) + + outer(dat$z1, dat$t, function(z1, t) z1*cos(pi*t) ) # true linear predictor +sigma <- 0.1 + +# draw respone y_i(t) ~ N(mu_i(t), sigma) +dat$y <- apply(mut, 2, function(x) rnorm(mean = x, sd = sigma, n = n)) + +## fit function-on-scalar model with a linear effect of z1 +m1 <- FDboost(y ~ 1 + bolsc(z1_fac, df = 1), timeformula = ~ bbs(t, df = 6), data = dat) + +# look for optimal mSTOP using cvrisk() or validateFDboost() +m1[200] # use 200 boosting iterations + +# plot true and estimated coefficients +plot(dat$t, 2*sin(pi*dat$t), col = 2, type = "l", main = "intercept") +plot(m1, which = 1, lty = 2, add = TRUE) + +plot(dat$t, 1*cos(pi*dat$t), col = 2, type = "l", main = "effect of z1") +lines(dat$t, -1*cos(pi*dat$t), col = 2, type = "l") +plot(m1, which = 2, lty = 2, col = 1, add = TRUE) + + + + + +cleanEx() +nameEx("bhistx") +### * bhistx + +flush(stderr()); flush(stdout()) + +### Name: bhistx +### Title: Base-learners for Functional Covariates +### Aliases: bhistx +### Keywords: models + +### ** Examples + +if(require(refund)){ +## simulate some data from a historical model +## the interaction effect is in this case not necessary +n <- 100 +nygrid <- 35 +data1 <- suppressWarnings(pffrSim(scenario = c("int", "ff"), limits = function(s,t){ s <= t }, + n = n, nygrid = nygrid)) +data1$X1 <- scale(data1$X1, scale = FALSE) ## center functional covariate +dataList <- as.list(data1) +dataList$tvals <- attr(data1, "yindex") + +## create the hmatrix-object +X1h <- with(dataList, hmatrix(time = rep(tvals, each = n), id = rep(1:n, nygrid), + x = X1, argvals = attr(data1, "xindex"), + timeLab = "tvals", idLab = "wideIndex", + xLab = "myX", argvalsLab = "svals")) +dataList$X1h <- I(X1h) +dataList$svals <- attr(data1, "xindex") +## add a factor variable +dataList$zlong <- factor(gl(n = 2, k = n/2, length = n*nygrid), levels = 1:2) +dataList$z <- factor(gl(n = 2, k = n/2, length = n), levels = 1:2) + +## do the model fit with main effect of bhistx() and interaction of bhistx() and bolsc() +mod <- FDboost(Y ~ 1 + bhistx(x = X1h, df = 5, knots = 5) + + bhistx(x = X1h, df = 5, knots = 5) %X% bolsc(zlong), + timeformula = ~ bbs(tvals, knots = 10), data = dataList) + +## alternative parameterization: interaction of bhistx() and bols() +mod <- FDboost(Y ~ 1 + bhistx(x = X1h, df = 5, knots = 5) %X% bols(zlong), + timeformula = ~ bbs(tvals, knots = 10), data = dataList) + +} + + + + +cleanEx() +nameEx("birthDistribution") +### * birthDistribution + +flush(stderr()); flush(stdout()) + +### Name: birthDistribution +### Title: Densities of live births in Germany +### Aliases: birthDistribution +### Keywords: datasets + +### ** Examples + +data("birthDistribution", package = "FDboost") + +# Plot densities +year_col <- rainbow(70, start = 0.5, end = 1) +year_lty <- c(1, 2, 4, 5) +oldpar <- par(mfrow = c(1, 2)) +funplot(1:12, birthDistribution$birth_densities[1:70, ], ylab = "densities", xlab = "month", + xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") +funplot(1:12, birthDistribution$birth_densities[71:140, ], ylab = "densities", xlab = "month", + xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Female") +par(mfrow = c(1, 1)) + +# fit density-on-scalar model with effects for sex and year +model <- FDboost(birth_densities_clr ~ 1 + bolsc(sex, df = 1) + + bbsc(year, df = 1, differences = 1), + # use bbsc() in timeformula to ensure integrate-to-zero constraint + timeformula = ~bbsc(month, df = 4, + # December is followed by January of subsequent year + cyclic = TRUE, + # knots = {1, ..., 12} with additional boundary knot + # 0 (coinciding with 12) due to cyclic = TRUE + knots = 1:11, boundary.knots = c(0, 12), + # degree = 1 with these knots yields identity matrix + # as design matrix + degree = 1), + data = birthDistribution, offset = 0, + control = boost_control(mstop = 1000)) + +# Plotting 'model' yields the clr-transformed effects +par(mfrow = c(1, 3)) +plot(model, n1 = 12, n2 = 12) + +# Use inverse clr transformation to get effects in Bayes Hilbert space, e.g. for intercept +intercept_clr <- predict(model, which = 1)[1, ] +intercept <- clr(intercept_clr, w = 1, inverse = TRUE) +funplot(1:12, intercept, xlab = "month", xaxp = c(1, 12, 11), pch = 20, + main = "Intercept", ylab = expression(hat(beta)[0]), id = rep(1, 12)) + +# Same with predictions +predictions_clr <- predict(model) +predictions <- t(apply(predictions_clr, 1, clr, inverse = TRUE)) +pred_ylim <- range(birthDistribution$birth_densities) +par(mfrow = c(1, 2)) +funplot(1:12, predictions[1:70, ], ylab = "predictions", xlab = "month", ylim = pred_ylim, + xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Male") +funplot(1:12, predictions[71:140, ], ylab = "predictions", xlab = "month", ylim = pred_ylim, + xaxp = c(1, 12, 11), pch = 20, col = year_col, lty = year_lty, main = "Female") +par(oldpar) + + + +graphics::par(get("par.postscript", pos = 'CheckExEnv')) +cleanEx() +nameEx("bootstrapCI") +### * bootstrapCI + +flush(stderr()); flush(stdout()) + +### Name: bootstrapCI +### Title: Function to compute bootstrap confidence intervals +### Aliases: bootstrapCI + +### ** Examples + +if(require(refund)){ +######### +# model with linear functional effect, use bsignal() +# Y(t) = f(t) + \int X1(s)\beta(s,t)ds + eps +set.seed(2121) +data1 <- suppressWarnings(pffrSim(scenario = "ff", n = 40)) +data1$X1 <- scale(data1$X1, scale = FALSE) +dat_list <- as.list(data1) +dat_list$t <- attr(data1, "yindex") +dat_list$s <- attr(data1, "xindex") + +## model fit by FDboost +m1 <- FDboost(Y ~ 1 + bsignal(x = X1, s = s, knots = 8, df = 3), + timeformula = ~ bbs(t, knots = 8), data = dat_list) + +} + + +my_inner_fun <- function(object){ +cvrisk(object, folds = cvLong(id = object$id, weights = +model.weights(object), B = 2) # 10-fold for inner resampling +) +} + + +## We can also use the ... argument to parallelize the applyFolds +## function in the outer resampling + + +## Now let's parallelize the outer resampling and use +## crossvalidation instead of bootstrap for the inner resampling + +my_inner_fun <- function(object){ +cvrisk(object, folds = cvLong(id = object$id, weights = +model.weights(object), type = "kfold", # use CV +B = 5, # 5-fold for inner resampling +)) # use five cores +} + +# use applyFolds for outer function to avoid messing up weights +my_outer_fun <- function(object, fun){ +applyFolds(object = object, +folds = cv(rep(1, length(unique(object$id))), +type = "bootstrap", B = 10), fun = fun) # parallelize on 10 cores +} + + +######## Example for scalar-on-function-regression with bsignal() +data("fuelSubset", package = "FDboost") + +## center the functional covariates per observed wavelength +fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) +fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) + +## to make mboost:::df2lambda() happy (all design matrix entries < 10) +## reduce range of argvals to [0,1] to get smaller integration weights +fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / +(max(uvvis.lambda) - min(uvvis.lambda) )) +fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / +(max(nir.lambda) - min(nir.lambda) )) + +## model fit with scalar response and two functional linear effects +## include no intercept as all base-learners are centered around 0 + +mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df=4, check.ident = FALSE), + timeformula = NULL, data = fuelSubset) + + + + + + + +cleanEx() +nameEx("bsignal") +### * bsignal + +flush(stderr()); flush(stdout()) + +### Name: bsignal +### Title: Base-learners for Functional Covariates +### Aliases: bsignal bconcurrent bhist bfpc +### Keywords: models + +### ** Examples + +######## Example for scalar-on-function-regression with bsignal() +data("fuelSubset", package = "FDboost") + +## center the functional covariates per observed wavelength +fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) +fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) + +## to make mboost:::df2lambda() happy (all design matrix entries < 10) +## reduce range of argvals to [0,1] to get smaller integration weights +fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / + (max(uvvis.lambda) - min(uvvis.lambda) )) +fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / + (max(nir.lambda) - min(nir.lambda) )) + +## model fit with scalar response and two functional linear effects +## include no intercept +## as all base-learners are centered around 0 +mod2 <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots = 40, df = 4, check.ident = FALSE) + + bsignal(NIR, nir.lambda, knots = 40, df=4, check.ident = FALSE), + timeformula = NULL, data = fuelSubset) +summary(mod2) + + +############################################### +### data simulation like in manual of pffr::ff + +if(require(refund)){ + +######### +# model with linear functional effect, use bsignal() +# Y(t) = f(t) + \int X1(s)\beta(s,t)ds + eps +set.seed(2121) +data1 <- suppressWarnings(pffrSim(scenario = "ff", n = 40)) +data1$X1 <- scale(data1$X1, scale = FALSE) +dat_list <- as.list(data1) +dat_list$t <- attr(data1, "yindex") +dat_list$s <- attr(data1, "xindex") + +## model fit by FDboost +m1 <- FDboost(Y ~ 1 + bsignal(x = X1, s = s, knots = 5), + timeformula = ~ bbs(t, knots = 5), data = dat_list, + control = boost_control(mstop = 21)) + +## search optimal mSTOP + +## model fit by pffr +t <- attr(data1, "yindex") +s <- attr(data1, "xindex") +m1_pffr <- pffr(Y ~ ff(X1, xind = s), yind = t, data = data1) + + + +############################################ +# model with functional historical effect, use bhist() +# Y(t) = f(t) + \int_0^t X1(s)\beta(s,t)ds + eps +set.seed(2121) +mylimits <- function(s, t){ + (s < t) | (s == t) +} +data2 <- suppressWarnings(pffrSim(scenario = "ff", n = 40, limits = mylimits)) +data2$X1 <- scale(data2$X1, scale = FALSE) +dat2_list <- as.list(data2) +dat2_list$t <- attr(data2, "yindex") +dat2_list$s <- attr(data2, "xindex") + +## model fit by FDboost +m2 <- FDboost(Y ~ 1 + bhist(x = X1, s = s, time = t, knots = 5), + timeformula = ~ bbs(t, knots = 5), data = dat2_list, + control = boost_control(mstop = 40)) + +## search optimal mSTOP + + +## model fit by pffr +t <- attr(data2, "yindex") +s <- attr(data2, "xindex") +m2_pffr <- pffr(Y ~ ff(X1, xind = s, limits = "s<=t"), yind = t, data = data2) + + + +} + + + + + +cleanEx() +nameEx("clr") +### * clr + +flush(stderr()); flush(stdout()) + +### Name: clr +### Title: Clr and inverse clr transformation +### Aliases: clr + +### ** Examples + +### Continuous case (T = [0, 1] with Lebesgue measure): +# evaluate density of a Beta distribution on an equidistant grid +g <- seq(from = 0.005, to = 0.995, by = 0.01) +f <- dbeta(g, 2, 5) +# compute clr transformation with distance of two grid points as integration weight +f_clr <- clr(f, w = 0.01) +# visualize result +plot(g, f_clr , type = "l") +abline(h = 0, col = "grey") +# compute inverse clr transformation (w as above) +f_clr_inv <- clr(f_clr, w = 0.01, inverse = TRUE) +# visualize result +plot(g, f, type = "l") +lines(g, f_clr_inv, lty = 2, col = "red") + +### Discrete case (T = {1, ..., 12} with sum of dirac measures at t in T): +data("birthDistribution", package = "FDboost") +# fit density-on-scalar model with effects for sex and year +model <- FDboost(birth_densities_clr ~ 1 + bolsc(sex, df = 1) + + bbsc(year, df = 1, differences = 1), + # use bbsc() in timeformula to ensure integrate-to-zero constraint + timeformula = ~bbsc(month, df = 4, + # December is followed by January of subsequent year + cyclic = TRUE, + # knots = {1, ..., 12} with additional boundary knot + # 0 (coinciding with 12) due to cyclic = TRUE + knots = 1:11, boundary.knots = c(0, 12), + # degree = 1 with these knots yields identity matrix + # as design matrix + degree = 1), + data = birthDistribution, offset = 0, + control = boost_control(mstop = 1000)) +# Extract predictions (clr-transformed!) and transform them to Bayes Hilbert space +predictions_clr <- predict(model) +predictions <- t(apply(predictions_clr, 1, clr, inverse = TRUE)) + + + + +cleanEx() +nameEx("emotion") +### * emotion + +flush(stderr()); flush(stdout()) + +### Name: emotion +### Title: EEG and EMG recordings in a computerised gambling study +### Aliases: emotion +### Keywords: datasets + +### ** Examples + +data("emotion", package = "FDboost") + +# fit function-on-scalar model with random effect and power effect +fos_random_power <- FDboost(EMG ~ 1 + brandomc(subject, df = 2) + + bolsc(power, df = 2), + timeformula = ~ bbs(t, df = 3), + data = emotion) +## Not run: +##D +##D # fit function-on-function model with intercept and historical EEG effect +##D # where limits specifies the used lag between EMG and EEG signal +##D fof_historical <- FDboost(EMG ~ 1 + bhist(EEG, s = s, time = t, +##D limits = function(s,t) s < t - 3), +##D timeformula = ~ bbs(t, df = 3), data = emotion, +##D control = boost_control(mstop = 200)) +## End(Not run) + + + +cleanEx() +nameEx("factorize") +### * factorize + +flush(stderr()); flush(stdout()) + +### Name: factorize +### Title: Factorize tensor product model +### Aliases: factorize factorise factorize.FDboost + +### ** Examples + +library(FDboost) + +# generate irregular toy data ------------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time & id +set.seed(90384) +t <- runif(n = n*m, -pi,pi) +id <- sample(1:n, size = n*m, replace = TRUE) + +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) + +mu1 <- d[1] * fx[[1]][id] * ft[[1]] +mu2 <- d[2] * fx[[2]][id] * ft[[2]] +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] + +mu3 <- d[3] * fx[[3]][id] * ft[[3]] + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]], id = id) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), + id = ~ id, + offset = 0, #numInt = "Riemann", + control = boost_control(nu = 1), + data = dat) +MU <- split(mu, id) +PRED <- split(predict(m), id) +Ti <- split(t, id) +t0 <- seq(-pi, pi, length.out = 40) +MU <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + MU, Ti)) +PRED <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PRED, Ti)) + +opar <- par(mfrow = c(2,2)) +image(t0, x, MU) +contour(t0, x, MU, add = TRUE) +image(t0, x, PRED) +contour(t0, x, PRED, add = TRUE) +persp(t0, x, MU, zlim = range(c(MU, PRED), na.rm = TRUE)) +persp(t0, x, PRED, zlim = range(c(MU, PRED), na.rm = TRUE)) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, sort(vi$reduction, decreasing = TRUE)[1:3]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in seq_along(wch)) { + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(sort(t), ft[[w]][order(t)]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose predictions +preds <- lapply(fac, predict) +predf <- rowSums(preds$resp * preds$cov[id, ]) +PREDf <- split(predf, id) +PREDf <- do.call(cbind, Map(function(mu, t) approx(t, mu, t0)$y, + PREDf, Ti)) +opar <- par(mfrow = c(1,2)) +image(t0,x, PRED, main = "original prediction") +contour(t0,x, PRED, add = TRUE) +image(t0,x,PREDf, main = "recomposed") +contour(t0,x, PREDf, add = TRUE) +par(opar) + +stopifnot(all.equal(PRED, PREDf)) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + + +# check factorization on a new dataset ------------------------------------ + +t_grid <- seq(-pi,pi,len = 30) +x_grid <- seq(0,2,len = 30) +x_lin_grid <- seq(min(dat$x_lin), max(dat$x_lin), len = 30) + +# use grid data for factorization +griddata <- expand.grid( + # time + t = t_grid, + # covariates + x = x_grid, + x_lin = 0 +) + +griddata_lin <- expand.grid( + t = seq(-pi, pi, len = 30), + x = 0, + x_lin = x_lin_grid +) + +griddata <- rbind(griddata, griddata_lin) + +griddata$id <- as.numeric(factor(paste(griddata$x, griddata$x_lin, sep = ":"))) + +fac2 <- factorize(m, newdata = griddata) + +ratio <- -max(abs(predict(fac$resp, which = 1))) / max(abs(predict(fac2$resp, which = 1))) + +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in seq_along(wch)) { + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + + lines(sort(griddata$t), + ratio*predict(fac2$resp, which = wch[w])[order(griddata$t)], + col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + this_x <- fac2$cov$model.frame(which = wch[w])[[1]][[1]] + lines(sort(this_x), 1/ratio*predict(fac2$cov, which = wch[w])[order(this_x)], + col = cols[w], lty = 1) +} +par(opar) + +# check predictions +p <- predict(fac2$resp, which = 1) +library(FDboost) + +# generate regular toy data -------------------------------------------------- + +n <- 100 +m <- 40 +# covariates +x <- seq(0,2,len = n) +# time +t <- seq(-pi,pi,len = m) +# generate components +fx <- ft <- list() +fx[[1]] <- exp(x) +d <- numeric(2) +d[1] <- sqrt(c(crossprod(fx[[1]]))) +fx[[1]] <- fx[[1]] / d[1] +fx[[2]] <- -5*x^2 +fx[[2]] <- fx[[2]] - fx[[1]] * c(crossprod(fx[[1]], fx[[2]])) # orthogonalize fx[[2]] +d[2] <- sqrt(c(crossprod(fx[[2]]))) +fx[[2]] <- fx[[2]] / d[2] +ft[[1]] <- sin(t) +ft[[2]] <- cos(t) +ft[[1]] <- ft[[1]] / sqrt(sum(ft[[1]]^2)) +ft[[2]] <- ft[[2]] / sqrt(sum(ft[[2]]^2)) +mu1 <- d[1] * fx[[1]] %*% t(ft[[1]]) +mu2 <- d[2] * fx[[2]] %*% t(ft[[2]]) +# add linear covariate +ft[[3]] <- t^2 * sin(4*t) +ft[[3]] <- ft[[3]] - ft[[1]] * c(crossprod(ft[[1]], ft[[3]])) +ft[[3]] <- ft[[3]] - ft[[2]] * c(crossprod(ft[[2]], ft[[3]])) +ft[[3]] <- ft[[3]] / sqrt(sum(ft[[3]]^2)) +set.seed(9234) +fx[[3]] <- runif(0,3, n = length(x)) +fx[[3]] <- fx[[3]] - fx[[1]] * c(crossprod(fx[[1]], fx[[3]])) +fx[[3]] <- fx[[3]] - fx[[2]] * c(crossprod(fx[[2]], fx[[3]])) +d[3] <- sqrt(sum(fx[[3]]^2)) +fx[[3]] <- fx[[3]] / d[3] +mu3 <- d[3] * fx[[3]] %*% t(ft[[3]]) + +mu <- mu1 + mu2 + mu3 +# add some noise +y <- mu + rnorm(length(mu), 0, .01) +# and noise covariate +z <- rnorm(n) + +# fit FDboost model ------------------------------------------------------- + +dat <- list(y = y, x = x, t = t, x_lin = fx[[3]]) +m <- FDboost(y ~ bbs(x, knots = 5, df = 2, differences = 0) + + # bbs(z, knots = 2, df = 2, differences = 0) + + bols(x_lin, intercept = FALSE, df = 2) + , ~ bbs(t), offset = 0, + control = boost_control(nu = 1), + data = dat) + +opar <- par(mfrow = c(1,2)) +image(t, x, t(mu)) +contour(t, x, t(mu), add = TRUE) +image(t, x, t(predict(m))) +contour(t, x, t(predict(m)), add = TRUE) +par(opar) + +# factorize model --------------------------------------------------------- + +fac <- factorize(m) + +vi <- as.data.frame(varimp(fac$cov)) +# if(require(lattice)) +# barchart(variable ~ reduction, group = blearner, vi, stack = TRUE) + +cbind(d^2, vi$reduction[c(1:2, 10)]) + + +x_plot <- list(x, x, fx[[3]]) + +cols <- c("cornflowerblue", "darkseagreen", "darkred") +opar <- par(mfrow = c(3,2)) +wch <- c(1,2,10) +for(w in seq_along(wch)) { + plot.mboost(fac$resp, which = wch[w], col = "darkgrey", ask = FALSE, + main = names(fac$resp$baselearner[wch[w]])) + lines(t, ft[[w]]*max(d), col = cols[w], lty = 2) + plot(fac$cov, which = wch[w], + main = names(fac$cov$baselearner[wch[w]])) + points(x_plot[[w]], d[w] * fx[[w]] / max(d), col = cols[w], pch = 3) +} +par(opar) + +# re-compose prediction +preds <- lapply(fac, predict) +PREDSf <- array(0, dim = c(nrow(preds$resp),nrow(preds$cov))) +for(i in seq_len(ncol(preds$resp))) + PREDSf <- PREDSf + preds$resp[,i] %*% t(preds$cov[,i]) + +opar <- par(mfrow = c(1,2)) +image(t,x, t(predict(m)), main = "original prediction") +contour(t,x, t(predict(m)), add = TRUE) +image(t,x,PREDSf, main = "recomposed") +contour(t,x, PREDSf, add = TRUE) +par(opar) +# => matches +stopifnot(all.equal(as.numeric(t(predict(m))), as.numeric(PREDSf))) + +# check out other methods +set.seed(8399) +newdata_resp <- list(t = sort(runif(60, min(t), max(t)))) +a <- predict(fac$resp, newdata = newdata_resp, which = 1:5) +plot(newdata_resp$t, a[, 1]) +# coef method +cf <- coef(fac$resp, which = 1) + + + + +graphics::par(get("par.postscript", pos = 'CheckExEnv')) +cleanEx() +nameEx("fuelSubset") +### * fuelSubset + +flush(stderr()); flush(stdout()) + +### Name: fuelSubset +### Title: Spectral data of fossil fuels +### Aliases: fuelSubset +### Keywords: datasets + +### ** Examples + + + data("fuelSubset", package = "FDboost") + + ## center the functional covariates per observed wavelength + fuelSubset$UVVIS <- scale(fuelSubset$UVVIS, scale = FALSE) + fuelSubset$NIR <- scale(fuelSubset$NIR, scale = FALSE) + + ## to make mboost::df2lambda() happy (all design matrix entries < 10) + ## reduce range of argvals to [0,1] to get smaller integration weights + fuelSubset$uvvis.lambda <- with(fuelSubset, (uvvis.lambda - min(uvvis.lambda)) / + (max(uvvis.lambda) - min(uvvis.lambda) )) + fuelSubset$nir.lambda <- with(fuelSubset, (nir.lambda - min(nir.lambda)) / + (max(nir.lambda) - min(nir.lambda) )) + + + ### fit mean regression model with 100 boosting iterations, + ### step-length 0.1 and + mod <- FDboost(heatan ~ bsignal(UVVIS, uvvis.lambda, knots=40, df=4, check.ident=FALSE) + + bsignal(NIR, nir.lambda, knots=40, df=4, check.ident=FALSE), + timeformula = NULL, data = fuelSubset) + summary(mod) + ## plot(mod) + + + +cleanEx() +nameEx("funplot") +### * funplot + +flush(stderr()); flush(stdout()) + +### Name: funplot +### Title: Plot functional data with linear interpolation of missing values +### Aliases: funplot + +### ** Examples + + + + +cleanEx() +nameEx("grapes-Xc-grapes") +### * grapes-Xc-grapes + +flush(stderr()); flush(stdout()) + +### Name: %Xc% +### Title: Constrained row tensor product +### Aliases: %Xc% + +### ** Examples + + +######## Example for function-on-scalar-regression with interaction effect of two scalar covariates +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## fit model with interaction that is centered around the intercept +## and the two main effects +mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df=1) + bolsc(T_A, df=1) + + bols(T_C, df=1) %Xc% bols(T_A, df=1), + timeformula = ~bbs(time, df=6), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 100, nu = 0.4)) + +## check centering around intercept +colMeans(predict(mod1, which = 4)) + +## check centering around main effects +colMeans(predict(mod1, which = 4)[viscosity$T_A == "low", ]) +colMeans(predict(mod1, which = 4)[viscosity$T_A == "high", ]) +colMeans(predict(mod1, which = 4)[viscosity$T_C == "low", ]) +colMeans(predict(mod1, which = 4)[viscosity$T_C == "low", ]) + +## find optimal mstop using cvrsik() or validateFDboost() +## ... + +## look at interaction effect in one plot +# funplot(mod1$yind, predict(mod1, which=4)) + + + + +cleanEx() +nameEx("hmatrix") +### * hmatrix + +flush(stderr()); flush(stdout()) + +### Name: hmatrix +### Title: A S3 class for univariate functional data on a common grid +### Aliases: hmatrix + +### ** Examples + +## Example for a hmatrix object +t1 <- rep((1:5)/2, each = 3) +id1 <- rep(1:3, 5) +x1 <- matrix(1:15, ncol = 5) +s1 <- (1:5)/2 +myhmatrix <- hmatrix(time = t1, id = id1, x = x1, argvals = s1, + timeLab = "t1", argvalsLab = "s1", xLab = "test") + +# extract with [ keeps attributes +# select observations of subjects 2 and 3 +myhmatrixSub <- myhmatrix[id1 %in% c(2, 3), ] +str(myhmatrixSub) +getX(myhmatrixSub) +getX(myhmatrix) + +# get time +myhmatrix[ , 1] # as column matrix as drop = FALSE +getTime(myhmatrix) # as vector + +# get id +myhmatrix[ , 2] # as column matrix as drop = FALSE +getId(myhmatrix) # as vector + +# subset hmatrix on the basis of an index, which is defined on the curve level +reweightData(data = list(hmat = myhmatrix), vars = "hmat", index = c(1, 1, 2)) +# this keeps only the unique x values in attr(,'x') but multiplies the corresponding +# ids and times in the time id matrix +# for bhistx baselearner, there may be an additional id variable for the tensor product +newdat <- reweightData(data = list(hmat = myhmatrix, + repIDx = rep(seq_len(nrow(attr(myhmatrix,'x'))), length(attr(myhmatrix,"argvals")))), + vars = "hmat", index = c(1,1,2), idvars="repIDx") +length(newdat$repIDx) + +## use hmatrix within a data.frame +mydat <- data.frame(I(myhmatrix), z=rnorm(3)[id1]) +str(mydat) +str(mydat[id1 %in% c(2, 3), ]) +str(myhmatrix[id1 %in% c(2, 3), ]) + + + + +cleanEx() +nameEx("integrationWeights") +### * integrationWeights + +flush(stderr()); flush(stdout()) + +### Name: integrationWeights +### Title: Functions to compute integration weights +### Aliases: integrationWeights integrationWeightsLeft + +### ** Examples + +## Example for trapezoidal integration weights +xind0 <- seq(0,1,l = 5) +xind <- c(0, 0.1, 0.3, 0.7, 1) +X1 <- matrix(xind^2, ncol = length(xind0), nrow = 2) + +# Regualar observation points +integrationWeights(X1, xind0) +# Irregular observation points +integrationWeights(X1, xind) + +# with missing value +X1[1,2] <- NA +integrationWeights(X1, xind0) +integrationWeights(X1, xind) + +## Example for left integration weights +xind0 <- seq(0,1,l = 5) +xind <- c(0, 0.1, 0.3, 0.7, 1) +X1 <- matrix(xind^2, ncol = length(xind0), nrow = 2) + +# Regular observation points +integrationWeightsLeft(X1, xind0, leftWeight = "mean") +integrationWeightsLeft(X1, xind0, leftWeight = "first") +integrationWeightsLeft(X1, xind0, leftWeight = "zero") + +# Irregular observation points +integrationWeightsLeft(X1, xind, leftWeight = "mean") +integrationWeightsLeft(X1, xind, leftWeight = "first") +integrationWeightsLeft(X1, xind, leftWeight = "zero") + +# obervation points that do not start with 0 +xind2 <- xind + 0.5 +integrationWeightsLeft(X1, xind2, leftWeight = "zero") + + + + +cleanEx() +nameEx("reweightData") +### * reweightData + +flush(stderr()); flush(stdout()) + +### Name: reweightData +### Title: Function to Reweight Data +### Aliases: reweightData + +### ** Examples + +## load data +data("viscosity", package = "FDboost") +interval <- "101" +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[ , 1:end]) +viscosity$time <- viscosity$timeAll[1:end] + +## what does data look like +str(viscosity) + +## do some reweighting +# correct weights +str(reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", weights = c(0, 32, 32, rep(0, 61)))) + +str(visNew <- reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", weights = c(0, 32, 32, rep(0, 61)))) +# check the result +# visNew$vis[1:5, 1:5] ## image(visNew$vis) + +# incorrect weights +str(reweightData(viscosity, vars=c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", weights = sample(1:64, replace = TRUE)), 1) + +# supply meaningful index +str(visNew <- reweightData(viscosity, vars = c("vis", "T_C", "T_A", "rspeed", "mflow"), + argvals = "time", index = rep(1:32, each = 2))) +# check the result +# visNew$vis[1:5, 1:5] + +# errors +if(FALSE){ + reweightData(viscosity, argvals = "") + reweightData(viscosity, argvals = "covThatDoesntExist", index = rep(1,64)) + } + + + + +cleanEx() +nameEx("stabsel.FDboost") +### * stabsel.FDboost + +flush(stderr()); flush(stdout()) + +### Name: stabsel.FDboost +### Title: Stability Selection +### Aliases: stabsel.FDboost + +### ** Examples + +######## Example for function-on-scalar-regression +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +## fit a model cotaining all main effects +modAll <- FDboost(vis ~ 1 + + bolsc(T_C, df=1) %A0% bbs(time, df=5) + + bolsc(T_A, df=1) %A0% bbs(time, df=5) + + bolsc(T_B, df=1) %A0% bbs(time, df=5) + + bolsc(rspeed, df=1) %A0% bbs(time, df=5) + + bolsc(mflow, df=1) %A0% bbs(time, df=5), + timeformula = ~bbs(time, df=5), + numInt = "Riemann", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 10), + data = viscosity, + control = boost_control(mstop = 100, nu = 0.2)) + + +## create folds for stability selection +## only 5 folds for a fast example, usually use 50 folds +set.seed(1911) +folds <- cvLong(modAll$id, weights = rep(1, l = length(modAll$id)), + type = "subsampling", B = 5) + + + + + +cleanEx() +nameEx("subset_hmatrix") +### * subset_hmatrix + +flush(stderr()); flush(stdout()) + +### Name: subset_hmatrix +### Title: Subsets hmatrix according to an index +### Aliases: subset_hmatrix + +### ** Examples + +t1 <- rep((1:5)/2, each = 3) +id1 <- rep(1:3, 5) +x1 <- matrix(1:15, ncol = 5) +s1 <- (1:5)/2 +hmat <- hmatrix(time = t1, id = id1, x = x1, argvals = s1, timeLab = "t1", + argvalsLab = "s1", xLab = "test") + +index1 <- c(1, 1, 3) +index2 <- c(2, 3, 3) +resMat <- subset_hmatrix(hmat, index = index1) +try(resMat2 <- subset_hmatrix(resMat, index = index2)) +resMat <- subset_hmatrix(hmat, index = index1, compress = FALSE) +try(resMat2 <- subset_hmatrix(resMat, index = index2)) + + + + +cleanEx() +nameEx("truncateTime") +### * truncateTime + +flush(stderr()); flush(stdout()) + +### Name: truncateTime +### Title: Function to truncate time in functional data +### Aliases: truncateTime + +### ** Examples + +if(require(fda)){ + dat <- fda::growth + dat$hgtm <- t(dat$hgtm[,1:10]) + dat$hgtf <- t(dat$hgtf[,1:10]) + + ## only use time-points 1:16 of variable age + datTr <- truncateTime(funVar=c("hgtm","hgtf"), time="age", newtime=1:16, data=dat) + +} + + + +cleanEx() +nameEx("update.FDboost") +### * update.FDboost + +flush(stderr()); flush(stdout()) + +### Name: update.FDboost +### Title: Function to update FDboost objects +### Aliases: update.FDboost + +### ** Examples + +######## Example from \code{?FDboost} +data("viscosity", package = "FDboost") +## set time-interval that should be modeled +interval <- "101" + +## model time until "interval" and take log() of viscosity +end <- which(viscosity$timeAll == as.numeric(interval)) +viscosity$vis <- log(viscosity$visAll[,1:end]) +viscosity$time <- viscosity$timeAll[1:end] +# with(viscosity, funplot(time, vis, pch = 16, cex = 0.2)) + +mod1 <- FDboost(vis ~ 1 + bolsc(T_C, df = 2) + bolsc(T_A, df = 2), + timeformula = ~ bbs(time, df = 4), + numInt = "equal", family = QuantReg(), + offset = NULL, offset_control = o_control(k_min = 9), + data = viscosity, control=boost_control(mstop = 10, nu = 0.4)) + +# update nu +mod2 <- update(mod1, control=boost_control(nu = 1)) # mstop will stay the same +# update mstop +mod3 <- update(mod2, control=boost_control(mstop = 100)) # nu=1 does not get changed +mod4 <- update(mod1, formula = vis ~ 1 + bolsc(T_C, df = 2)) # drop one term + + + +cleanEx() +nameEx("validateFDboost") +### * validateFDboost + +flush(stderr()); flush(stdout()) + +### Name: validateFDboost +### Title: Cross-Validation and Bootstrapping over Curves +### Aliases: validateFDboost + +### ** Examples + + + + + +cleanEx() +nameEx("viscosity") +### * viscosity + +flush(stderr()); flush(stdout()) + +### Name: viscosity +### Title: Viscosity of resin over time +### Aliases: viscosity +### Keywords: datasets + +### ** Examples + + + data("viscosity", package = "FDboost") + ## set time-interval that should be modeled + interval <- "101" + + ## model time until "interval" and take log() of viscosity + end <- which(viscosity$timeAll==as.numeric(interval)) + viscosity$vis <- log(viscosity$visAll[,1:end]) + viscosity$time <- viscosity$timeAll[1:end] + + ## fit median regression model with 100 boosting iterations, + ## step-length 0.4 and smooth time-specific offset + ## the factors are in effect coding -1, 1 for the levels + mod <- FDboost(vis ~ 1 + bols(T_C, contrasts.arg = "contr.sum", intercept=FALSE) + + bols(T_A, contrasts.arg = "contr.sum", intercept=FALSE), + timeformula=~bbs(time, lambda=100), + numInt="equal", family=QuantReg(), + offset=NULL, offset_control = o_control(k_min = 9), + data=viscosity, control=boost_control(mstop = 100, nu = 0.4)) + summary(mod) + + + + +### *

VJ2|Qhg*9`M!+t^z19Vh_v=N#-NxACRMvDhUi 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⁣0C4 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