From aab749b8104d7de448217e3c0697cbc8d0835e14 Mon Sep 17 00:00:00 2001 From: Benjamin Hofner Date: Thu, 4 Aug 2016 16:35:44 +0200 Subject: [PATCH 01/49] Moved pkg/ to parent folder --- patch/.Rbuildignore => .Rbuildignore | 0 patch/.RbuildignoreCRAN => .RbuildignoreCRAN | 0 patch/.gitattributes => .gitattributes | 0 patch/ChangeLog => ChangeLog | 0 pkg/DESCRIPTION => DESCRIPTION | 0 pkg/NAMESPACE => NAMESPACE | 0 {patch/R => R}/AAA.R | 0 {patch/R => R}/as.families.R | 0 {patch/R => R}/cvrisk.R | 0 {pkg/R => R}/cvrisk.nc_mboostLSS.R | 0 {patch/R => R}/families.R | 0 {patch/R => R}/gamboostLSS_intern.R | 0 {patch/R => R}/helpers.R | 0 {pkg/R => R}/mboostLSS.R | 0 {pkg/R => R}/methods.R | 0 {patch/data => data}/india.RData | Bin {patch/data => data}/india.bnd.RData | Bin {patch/inst => inst}/CITATION | 0 {pkg/inst => inst}/NEWS.Rd | 0 {patch/man => man}/as.families.Rd | 0 {pkg/man => man}/cvrisk.Rd | 0 {pkg/man => man}/families.Rd | 0 {pkg/man => man}/gamboostLSS-package.Rd | 0 {patch/man => man}/gamboostLSS_intern.Rd | 0 {patch/man => man}/india.Rd | 0 {pkg/man => man}/mboostLSS.Rd | 0 {pkg/man => man}/methods.Rd | 0 {pkg/man => man}/stabsel.mboostLSS.Rd | 0 {patch/man => man}/weighted_median.Rd | 0 patch/DESCRIPTION | 17 - patch/NAMESPACE | 67 - patch/R/mboostLSS.R | 304 -- patch/R/methods.R | 368 -- patch/inst/NEWS.Rd | 219 - patch/man/cvrisk.Rd | 237 -- patch/man/families.Rd | 327 -- patch/man/gamboostLSS-package.Rd | 122 - patch/man/mboostLSS.Rd | 235 -- patch/man/methods.Rd | 373 -- patch/tests/bugfixes.R | 49 - pkg/.Rbuildignore | 4 - pkg/.RbuildignoreCRAN | 7 - pkg/.gitattributes | 4 - pkg/ChangeLog | 891 ---- pkg/R/AAA.R | 5 - pkg/R/as.families.R | 505 --- pkg/R/cvrisk.R | 369 -- pkg/R/families.R | 882 ---- pkg/R/gamboostLSS_intern.R | 5 - pkg/R/helpers.R | 184 - pkg/data/india.RData | Bin 84671 -> 0 bytes pkg/data/india.bnd.RData | Bin 52200 -> 0 bytes pkg/inst/CITATION | 62 - pkg/man/as.families.Rd | 163 - pkg/man/gamboostLSS_intern.Rd | 19 - pkg/man/india.Rd | 67 - pkg/man/weighted_median.Rd | 66 - pkg/tests/Examples/gamboostLSS-Ex.Rout.save | 3613 ----------------- pkg/tests/bugfixes.Rout.save | 109 - pkg/tests/regtest-families.R | 193 - pkg/tests/regtest-families.Rout.save | 509 --- pkg/tests/regtest-gamboostLSS.R | 41 - pkg/tests/regtest-gamboostLSS.Rout.save | 232 -- pkg/tests/regtest-glmboostLSS.R | 135 - pkg/tests/regtest-glmboostLSS.Rout.save | 324 -- pkg/tests/regtest-mstop.R | 152 - pkg/tests/regtest-mstop.Rout.save | 403 -- pkg/tests/regtest-stabilization.R | 148 - pkg/tests/regtest-stabilization.Rout.save | 330 -- pkg/vignettes/bib.bib | 495 --- pkg/vignettes/cvrisk/cvr_india.Rda | Bin 6155676 -> 0 bytes pkg/vignettes/gamboostLSS_Tutorial.Rnw | 1635 -------- .../Examples/gamboostLSS-Ex.Rout.save | 0 {pkg/tests => tests}/bugfixes.R | 0 {patch/tests => tests}/bugfixes.Rout.save | 0 {patch/tests => tests}/regtest-families.R | 0 .../regtest-families.Rout.save | 0 {patch/tests => tests}/regtest-gamboostLSS.R | 0 .../regtest-gamboostLSS.Rout.save | 0 {patch/tests => tests}/regtest-glmboostLSS.R | 0 .../regtest-glmboostLSS.Rout.save | 0 {patch/tests => tests}/regtest-mstop.R | 0 .../tests => tests}/regtest-mstop.Rout.save | 0 .../regtest-noncyclic_fitting.R | 0 .../tests => tests}/regtest-stabilization.R | 0 .../regtest-stabilization.Rout.save | 0 {patch/vignettes => vignettes}/bib.bib | 0 .../cvrisk/cvr_india.Rda | Bin .../gamboostLSS_Tutorial.Rnw | 0 www/index.php | 51 - 90 files changed, 13921 deletions(-) rename patch/.Rbuildignore => .Rbuildignore (100%) rename patch/.RbuildignoreCRAN => .RbuildignoreCRAN (100%) rename patch/.gitattributes => .gitattributes (100%) rename patch/ChangeLog => ChangeLog (100%) rename pkg/DESCRIPTION => DESCRIPTION (100%) rename pkg/NAMESPACE => NAMESPACE (100%) rename {patch/R => R}/AAA.R (100%) rename {patch/R => R}/as.families.R (100%) rename {patch/R => R}/cvrisk.R (100%) rename {pkg/R => R}/cvrisk.nc_mboostLSS.R (100%) rename {patch/R => R}/families.R (100%) rename {patch/R => R}/gamboostLSS_intern.R (100%) rename {patch/R => R}/helpers.R (100%) rename {pkg/R => R}/mboostLSS.R (100%) rename {pkg/R => R}/methods.R (100%) rename {patch/data => data}/india.RData (100%) rename {patch/data => data}/india.bnd.RData (100%) rename {patch/inst => inst}/CITATION (100%) rename {pkg/inst => inst}/NEWS.Rd (100%) rename {patch/man => man}/as.families.Rd (100%) rename {pkg/man => man}/cvrisk.Rd (100%) rename {pkg/man => man}/families.Rd (100%) rename {pkg/man => man}/gamboostLSS-package.Rd (100%) rename {patch/man => man}/gamboostLSS_intern.Rd (100%) rename {patch/man => man}/india.Rd (100%) rename {pkg/man => man}/mboostLSS.Rd (100%) rename {pkg/man => man}/methods.Rd (100%) rename {pkg/man => man}/stabsel.mboostLSS.Rd (100%) rename {patch/man => man}/weighted_median.Rd (100%) delete mode 100644 patch/DESCRIPTION delete mode 100644 patch/NAMESPACE delete mode 100644 patch/R/mboostLSS.R delete mode 100644 patch/R/methods.R delete mode 100644 patch/inst/NEWS.Rd delete mode 100644 patch/man/cvrisk.Rd delete mode 100644 patch/man/families.Rd delete mode 100644 patch/man/gamboostLSS-package.Rd delete mode 100644 patch/man/mboostLSS.Rd delete mode 100644 patch/man/methods.Rd delete mode 100644 patch/tests/bugfixes.R delete mode 100644 pkg/.Rbuildignore delete mode 100644 pkg/.RbuildignoreCRAN delete mode 100644 pkg/.gitattributes delete mode 100644 pkg/ChangeLog delete mode 100644 pkg/R/AAA.R delete mode 100755 pkg/R/as.families.R delete mode 100644 pkg/R/cvrisk.R delete mode 100644 pkg/R/families.R delete mode 100644 pkg/R/gamboostLSS_intern.R delete mode 100644 pkg/R/helpers.R delete mode 100644 pkg/data/india.RData delete mode 100644 pkg/data/india.bnd.RData delete mode 100644 pkg/inst/CITATION delete mode 100644 pkg/man/as.families.Rd delete mode 100644 pkg/man/gamboostLSS_intern.Rd delete mode 100644 pkg/man/india.Rd delete mode 100644 pkg/man/weighted_median.Rd delete mode 100644 pkg/tests/Examples/gamboostLSS-Ex.Rout.save delete mode 100644 pkg/tests/bugfixes.Rout.save delete mode 100644 pkg/tests/regtest-families.R delete mode 100644 pkg/tests/regtest-families.Rout.save delete mode 100644 pkg/tests/regtest-gamboostLSS.R delete mode 100644 pkg/tests/regtest-gamboostLSS.Rout.save delete mode 100644 pkg/tests/regtest-glmboostLSS.R delete mode 100644 pkg/tests/regtest-glmboostLSS.Rout.save delete mode 100644 pkg/tests/regtest-mstop.R delete mode 100644 pkg/tests/regtest-mstop.Rout.save delete mode 100644 pkg/tests/regtest-stabilization.R delete mode 100644 pkg/tests/regtest-stabilization.Rout.save delete mode 100755 pkg/vignettes/bib.bib delete mode 100644 pkg/vignettes/cvrisk/cvr_india.Rda delete mode 100644 pkg/vignettes/gamboostLSS_Tutorial.Rnw rename {patch/tests => tests}/Examples/gamboostLSS-Ex.Rout.save (100%) rename {pkg/tests => tests}/bugfixes.R (100%) rename {patch/tests => tests}/bugfixes.Rout.save (100%) rename {patch/tests => tests}/regtest-families.R (100%) rename {patch/tests => tests}/regtest-families.Rout.save (100%) rename {patch/tests => tests}/regtest-gamboostLSS.R (100%) rename {patch/tests => tests}/regtest-gamboostLSS.Rout.save (100%) rename {patch/tests => tests}/regtest-glmboostLSS.R (100%) rename {patch/tests => tests}/regtest-glmboostLSS.Rout.save (100%) rename {patch/tests => tests}/regtest-mstop.R (100%) rename {patch/tests => tests}/regtest-mstop.Rout.save (100%) rename {pkg/tests => tests}/regtest-noncyclic_fitting.R (100%) rename {patch/tests => tests}/regtest-stabilization.R (100%) rename {patch/tests => tests}/regtest-stabilization.Rout.save (100%) rename {patch/vignettes => vignettes}/bib.bib (100%) rename {patch/vignettes => vignettes}/cvrisk/cvr_india.Rda (100%) rename {patch/vignettes => vignettes}/gamboostLSS_Tutorial.Rnw (100%) delete mode 100644 www/index.php diff --git a/patch/.Rbuildignore b/.Rbuildignore similarity index 100% rename from patch/.Rbuildignore rename to .Rbuildignore diff --git a/patch/.RbuildignoreCRAN b/.RbuildignoreCRAN similarity index 100% rename from patch/.RbuildignoreCRAN rename to .RbuildignoreCRAN diff --git a/patch/.gitattributes b/.gitattributes similarity index 100% rename from patch/.gitattributes rename to .gitattributes diff --git a/patch/ChangeLog b/ChangeLog similarity index 100% rename from patch/ChangeLog rename to ChangeLog diff --git a/pkg/DESCRIPTION b/DESCRIPTION similarity index 100% rename from pkg/DESCRIPTION rename to DESCRIPTION diff --git a/pkg/NAMESPACE b/NAMESPACE similarity index 100% rename from pkg/NAMESPACE rename to NAMESPACE diff --git a/patch/R/AAA.R b/R/AAA.R similarity index 100% rename from patch/R/AAA.R rename to R/AAA.R diff --git a/patch/R/as.families.R b/R/as.families.R similarity index 100% rename from patch/R/as.families.R rename to R/as.families.R diff --git a/patch/R/cvrisk.R b/R/cvrisk.R similarity index 100% rename from patch/R/cvrisk.R rename to R/cvrisk.R diff --git a/pkg/R/cvrisk.nc_mboostLSS.R b/R/cvrisk.nc_mboostLSS.R similarity index 100% rename from pkg/R/cvrisk.nc_mboostLSS.R rename to R/cvrisk.nc_mboostLSS.R diff --git a/patch/R/families.R b/R/families.R similarity index 100% rename from patch/R/families.R rename to R/families.R diff --git a/patch/R/gamboostLSS_intern.R b/R/gamboostLSS_intern.R similarity index 100% rename from patch/R/gamboostLSS_intern.R rename to R/gamboostLSS_intern.R diff --git a/patch/R/helpers.R b/R/helpers.R similarity index 100% rename from patch/R/helpers.R rename to R/helpers.R diff --git a/pkg/R/mboostLSS.R b/R/mboostLSS.R similarity index 100% rename from pkg/R/mboostLSS.R rename to R/mboostLSS.R diff --git a/pkg/R/methods.R b/R/methods.R similarity index 100% rename from pkg/R/methods.R rename to R/methods.R diff --git a/patch/data/india.RData b/data/india.RData similarity index 100% rename from patch/data/india.RData rename to data/india.RData diff --git a/patch/data/india.bnd.RData b/data/india.bnd.RData similarity index 100% rename from patch/data/india.bnd.RData rename to data/india.bnd.RData diff --git a/patch/inst/CITATION b/inst/CITATION similarity index 100% rename from patch/inst/CITATION rename to inst/CITATION diff --git a/pkg/inst/NEWS.Rd b/inst/NEWS.Rd similarity index 100% rename from pkg/inst/NEWS.Rd rename to inst/NEWS.Rd diff --git a/patch/man/as.families.Rd b/man/as.families.Rd similarity index 100% rename from patch/man/as.families.Rd rename to man/as.families.Rd diff --git a/pkg/man/cvrisk.Rd b/man/cvrisk.Rd similarity index 100% rename from pkg/man/cvrisk.Rd rename to man/cvrisk.Rd diff --git a/pkg/man/families.Rd b/man/families.Rd similarity index 100% rename from pkg/man/families.Rd rename to man/families.Rd diff --git a/pkg/man/gamboostLSS-package.Rd b/man/gamboostLSS-package.Rd similarity index 100% rename from pkg/man/gamboostLSS-package.Rd rename to man/gamboostLSS-package.Rd diff --git a/patch/man/gamboostLSS_intern.Rd b/man/gamboostLSS_intern.Rd similarity index 100% rename from patch/man/gamboostLSS_intern.Rd rename to man/gamboostLSS_intern.Rd diff --git a/patch/man/india.Rd b/man/india.Rd similarity index 100% rename from patch/man/india.Rd rename to man/india.Rd diff --git a/pkg/man/mboostLSS.Rd b/man/mboostLSS.Rd similarity index 100% rename from pkg/man/mboostLSS.Rd rename to man/mboostLSS.Rd diff --git a/pkg/man/methods.Rd b/man/methods.Rd similarity index 100% rename from pkg/man/methods.Rd rename to man/methods.Rd diff --git a/pkg/man/stabsel.mboostLSS.Rd b/man/stabsel.mboostLSS.Rd similarity index 100% rename from pkg/man/stabsel.mboostLSS.Rd rename to man/stabsel.mboostLSS.Rd diff --git a/patch/man/weighted_median.Rd b/man/weighted_median.Rd similarity index 100% rename from patch/man/weighted_median.Rd rename to man/weighted_median.Rd diff --git a/patch/DESCRIPTION b/patch/DESCRIPTION deleted file mode 100644 index 97875f1..0000000 --- a/patch/DESCRIPTION +++ /dev/null @@ -1,17 +0,0 @@ -Package: gamboostLSS -Type: Package -Title: Boosting Methods for 'GAMLSS' -Version: 1.2-1 -Date: 2016-03-11 -Author: Benjamin Hofner, Andreas Mayr, Nora Fenske, Matthias Schmid -Maintainer: Benjamin Hofner -Description: Boosting models for fitting generalized additive models for - location, shape and scale ('GAMLSS') to potentially high dimensional - data. -Depends: R (>= 2.10.0), mboost (>= 2.3-0), parallel -Imports: graphics, grDevices, stats, utils -Suggests: gamlss, BayesX, gamlss.dist, survival, R2BayesX -LazyLoad: yes -LazyData: yes -License: GPL-2 -URL: For source code, development versions and issue tracker see https://github.com/boost-R/gamboostLSS diff --git a/patch/NAMESPACE b/patch/NAMESPACE deleted file mode 100644 index 004beea..0000000 --- a/patch/NAMESPACE +++ /dev/null @@ -1,67 +0,0 @@ -import("mboost") -import("parallel") - -importFrom("graphics", "axis", "box", "lines", "plot", "points") -importFrom("grDevices", "grey", "rgb") -importFrom("stats", "coef", "dlogis", "dnorm", "fitted", "median", "optimize", - "plogis", "pnorm", "predict", "qlnorm", "qlogis", "qnorm", "qt", - "qweibull", "rmultinom", "update", "var", "variable.names", "weighted.mean") -importFrom("utils", "tail") - -export(glmboostLSS, - gamboostLSS, - blackboostLSS, - mboostLSS, - mboostLSS_fit, - model.weights, - PI, predint, plot.predint, - make.grid, cvrisk.mboostLSS, - Families, - NBinomialLSS, NBinomialMu, NBinomialSigma, - StudentTLSS, StudentTMu, StudentTSigma, StudentTDf, - LogNormalLSS, LogNormalMu, LogNormalSigma, - LogLogLSS, LogLogMu, LogLogSigma, - GaussianLSS, GaussianMu, GaussianSigma, - GammaLSS, GammaMu, GammaSigma, - BetaLSS, BetaMu, BetaPhi, - WeibullLSS, WeibullMu, WeibullSigma, - ZIPoLSS, ZINBLSS, - gamlss.Families, as.families, - gamlss1parMu, - gamlss2parMu, gamlss2parSigma, - gamlss3parMu, gamlss3parSigma, gamlss3parNu, - gamlss4parMu, gamlss4parSigma, gamlss4parNu, gamlss4parTau, - weighted.median, gamboostLSS_intern) - -S3method("[", mboostLSS) -S3method(print, mboostLSS) -S3method(selected, mboostLSS) -S3method(risk, mboostLSS) -S3method(summary, mboostLSS) - -S3method(mstop, oobag) -S3method(mstop, mboostLSS) - -S3method(model.weights, default) -S3method(model.weights, mboostLSS) - -S3method(cvrisk, mboostLSS) -S3method(print, cvriskLSS) -S3method(plot, cvriskLSS) -S3method(mstop, cvriskLSS) - -S3method(coef, mboostLSS) -S3method(coef, glmboostLSS) - -S3method(plot, glmboostLSS) -S3method(plot, gamboostLSS) - -S3method(plot, predint) - -S3method(fitted, mboostLSS) -S3method(predict, mboostLSS) - -S3method(update, mboostLSS) - -S3method(get_qfun, mboostLSS) -S3method(get_qfun, character) diff --git a/patch/R/mboostLSS.R b/patch/R/mboostLSS.R deleted file mode 100644 index 833aba1..0000000 --- a/patch/R/mboostLSS.R +++ /dev/null @@ -1,304 +0,0 @@ -### -# Generic implementation for multiple component LSS-models - -### (glm/gam/m/black)boostLSS functions - -mboostLSS <- function(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...){ - cl <- match.call() - if(is.null(cl$families)) - cl$families <- families - fit <- mboostLSS_fit(formula = formula, data = data, families = families, - control = control, weights = weights, ..., - fun = mboost, funchar = "mboost", call = cl) - return(fit) -} - -glmboostLSS <- function(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...){ - cl <- match.call() - if(is.null(cl$families)) - cl$families <- families - fit <- mboostLSS_fit(formula = formula, data = data, families = families, - control = control, weights = weights, ..., - fun = glmboost, funchar = "glmboost", call = cl) - return(fit) -} - -gamboostLSS <- function(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...){ - cl <- match.call() - if(is.null(cl$families)) - cl$families <- families - fit <- mboostLSS_fit(formula = formula, data = data, families = families, - control = control, weights = weights, ..., - fun = gamboost, funchar = "gamboost", call = cl) - return(fit) -} - -blackboostLSS <- function(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...){ - cl <- match.call() - if(is.null(cl$families)) - cl$families <- families - fit <- mboostLSS_fit(formula = formula, data = data, families = families, - control = control, weights = weights, ..., - fun = blackboost, funchar = "blackboost", call = cl) - return(fit) -} - - -### work horse for fitting (glm/gam/m/black)boostLSS models -mboostLSS_fit <- function(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, - fun = mboost, funchar = "mboost", call = NULL, ...){ - - if (length(families) == 0) - stop(sQuote("families"), " not specified") - - if ("offset" %in% names(list(...))) - stop("Do not use argument ", sQuote("offset"), - ". Please specify offsets via families") - ### Use mu in "families" to specify offset in mu-family etc. - - if (is.list(formula)){ - if (!all(names(formula) %in% names(families)) || - length(unique(names(formula))) != length(names(families))) - stop(sQuote("formula"), " can be either a formula or a named list", - " of formulas with same names as ", sQuote("families"), ".") - ynames <- sapply(formula, function(fm) as.character(fm[[2]])) - if (length(unique(ynames)) > 1) - warning("responses differ for the components") - response <- lapply(formula, function(fm) - eval(as.expression(fm[[2]]), envir = data, - enclos = environment(fm))) - #response <- eval(as.expression(formula[[1]][[2]]), envir = data, - # enclos = environment(formula[[1]])) - } else { - response <- eval(as.expression(formula[[2]]), envir = data, - enclos = environment(formula)) - tmp <- vector("list", length = length(families)) - names(tmp) <- names(families) - for (i in 1:length(tmp)) - tmp[[i]] <- formula - formula <- tmp - } - - mstop <- mstoparg <- control$mstop - control$mstop <- 1 - mstop <- check(mstop, "mstop", names(families)) - - nu <- control$nu - nu <- check(nu, "nu", names(families)) - - if (is.list(control$risk) || is.list(control$center) || is.list(control$trace)) - stop(sQuote("risk"),", ", sQuote("center"), " and ", sQuote("trace") , - " cannot be lists in ", sQuote("boost_control")) - - trace <- control$trace - control$trace <- FALSE - - w <- weights - if (is.null(weights)){ - if (!is.list(response)) { - weights <- rep.int(1, NROW(response)) - } else { - weights <- rep.int(1, NROW(response[[1]])) - } - } - weights <- rescale_weights(weights) - - fit <- vector("list", length = length(families)) - names(fit) <- names(families) - - mods <- 1:length(fit) - - offset <- vector("list", length = length(mods)) - names(offset) <- names(families) - for (j in mods){ - if (!is.list(response)) { - response <- check_y_family(response, families[[j]]) - offset[[j]] <- families[[j]]@offset(y = response, w = weights) - } else { - response[[j]] <- check_y_family(response[[j]], families[[j]]) - offset[[j]] <- families[[j]]@offset(y = response[[j]], w = weights) - } - for (k in mods){ - for (l in mods){ - if (!is.null(offset[[l]])) - assign(names(offset)[l], families[[l]]@response(offset[[l]]), - environment(families[[k]]@ngradient)) - } - } - } - for (j in mods){ - ## update value of nuisance parameters in families - ## use response(fitted()) as this is much quicker than - ## fitted(, type = response) as the latter uses predict() - for (k in mods[-j]){ - if (!is.null(fit[[k]])) - assign(names(fit)[k], families[[k]]@response(fitted(fit[[k]])), - environment(families[[j]]@ngradient)) - } - ## use appropriate nu for the model - control$nu <- nu[[j]] - ## Do we need to recompute ngradient? - fit[[j]] <- do.call(fun, list(formula[[names(families)[[j]]]], - data = data, family = families[[j]], - control=control, weights = w, - ...)) - } - if (trace) - do_trace(current = 1, mstart = 0, - mstop = max(mstop), - risk = fit[[length(fit)]]$risk()) - - ### set up a function for iterating boosting steps - iBoost <- function(niter) { - start <- sapply(fit, mstop) - mvals <- vector("list", length(niter)) - for (j in 1:length(niter)){ - mvals[[j]] <- rep(start[j] + niter[j], max(niter)) - if (niter[j] > 0) - mvals[[j]][1:niter[j]] <- (start[j] + 1):(start[j] + niter[j]) - } - - ENV <- lapply(mods, function(j) environment(fit[[j]]$subset)) - for (i in 1:max(niter)){ - for (j in mods){ - ## update value of nuisance parameters - ## use response(fitted()) as this is much quicker than - ## fitted(, type = response) as the latter uses predict() - for (k in mods[-j]) - assign(names(fit)[k], families[[k]]@response(fitted(fit[[k]])), - environment(get("ngradient", environment(fit[[j]]$subset)))) - ## update value of u, i.e. compute ngradient with new nuisance parameters - - ENV[[j]][["u"]] <- ENV[[j]][["ngradient"]](ENV[[j]][["y"]], ENV[[j]][["fit"]], - ENV[[j]][["weights"]]) - # same as: - # evalq(u <- ngradient(y, fit, weights), environment(fit[[j]]$subset)) - - ## update j-th component to "m-th" boosting step - fit[[j]][mvals[[j]][i]] - } - if (trace){ - ## which is the current risk? rev() needed to get the last - ## list element with maximum length - whichRisk <- names(which.max(rev(lapply(lapply(fit, function(x) x$risk()), length)))) - do_trace(current = max(sapply(mvals, function(x) x[i])), - mstart = ifelse(firstRun, 0, max(start)), - mstop = ifelse(firstRun, max(niter) + 1, max(niter)), - risk = fit[[whichRisk]]$risk()) - } - } - return(TRUE) - } - - if (any(mstop > 1)){ - ## actually go for initial mstop iterations! - firstRun <- TRUE - tmp <- iBoost(mstop - 1) - } - - firstRun <- FALSE - - class(fit) <- c(paste(funchar, "LSS", sep=""), "mboostLSS") - - ### update to a new number of boosting iterations mstop - ### i <= mstop means less iterations than current - ### i > mstop needs additional computations - ### updates take place in THIS ENVIRONMENT, - ### some models are CHANGED! - attr(fit, "subset") <- function(i) { - - i <- check(i, "mstop", names(families)) - - msf <- mstop(fit) - niter <- i - msf - if (all(niter == 0)) { - ## make nothing happen with the model - minStart <- max(msf) - } else { - minStart <- min(msf[niter != 0], i[niter != 0]) - } - - ## check if minStart bigger than mstop of parameters that are not touched - #if (length(msf[niter == 0]) > 0 && minStart < min(msf[niter == 0])) - #minStart <- min(msf[niter == 0]) - - ## reduce models first (when necessary) - if (any(msf > minStart)){ - cf <- class(fit) - class(fit) <- "list" ## needed to use [] operator for lists - - #cat("processed parameters: ", paste(names(fit[msf > minStart]), - # collapse = ", "), "\n") - - lapply(fit[msf > minStart], - function(obj) obj$subset(minStart)) - - ## remove additional boosting iterations from environments - lapply(fit[msf > minStart], function(obj){ - evalq({xselect <- xselect[1:mstop]; - mrisk <- mrisk[1:mstop]; - ens <- ens[1:mstop]; - nuisance <- nuisance[1:mstop]}, - environment(obj$subset)) - }) - - class(fit) <- cf - if (trace) - cat("Model first reduced to mstop = ", minStart, ".\n", - "Now continue ...\n", sep ="") - } - - ## now increase models (when necessary) - if (any(i > minStart)){ - ## set negative values to 0 - ## (only applicable if some parameters do not need to be touched - inc <- ifelse(i - minStart > 0, i - minStart, 0) - tmp <- iBoost(inc) - } - - mstop <<- i - } - - ## make call in submodels nicer: - cl <- call - cl[[1]] <- as.name(gsub("LSS", "", cl[[1]])) - names(cl)[names(cl) == "families"] <- "family" - for (i in 1:length(fit)) { - fit[[i]]$call <- cl - ## This is not really nice - fit[[i]]$call$family <- families[[i]] - } - - attr(fit, "(weights)") <- weights ## attach weights used for fitting - - ## update to new weights; just a fresh start - attr(fit, "update") <- function(weights = NULL, oobweights = NULL, - risk = NULL, trace = NULL, mstop = NULL) { - if (is.null(mstop)) { - control$mstop <- mstoparg - } else { - control$mstop <- mstop - } - if (!is.null(risk)) - control$risk <- risk - if (!is.null(trace)) - control$trace <- trace - ## re-use user specified offset only - ## (since it depends on weights otherwise) - ## this is achieved via a re-evaluation of the families argument - mboostLSS_fit(formula = formula, data = data, - families = eval(call[["families"]]), weights = weights, - control = control, fun = fun, funchar = funchar, - call = call, oobweights = oobweights) - } - attr(fit, "control") <- control - attr(fit, "call") <- call - attr(fit, "data") <- data - attr(fit, "families") <- families - return(fit) -} diff --git a/patch/R/methods.R b/patch/R/methods.R deleted file mode 100644 index a06fed2..0000000 --- a/patch/R/methods.R +++ /dev/null @@ -1,368 +0,0 @@ -## Methods - -"[.mboostLSS" <- function(x, i, return = TRUE, ...) { - stopifnot((length(i) == 1 | length(i) == length(x)) && i > 0) - attr(x, "subset")(i) - if (return) return(x) - invisible(NULL) -} - -coef.mboostLSS <- function(object, which = NULL, - aggregate = c("sum", "cumsum", "none"), - parameter = names(object), ...){ - if (is.character(parameter)) - parameter <- extract_parameter(object, parameter) - RET <- lapply(parameter, function(i, object) - coef(object[[i]], which = which, - aggregate = aggregate, ...), - object = object) - if (length(RET) == 1) - RET <- RET[[1]] - return(RET) -} - -coef.glmboostLSS <- function(object, which = NULL, - aggregate = c("sum", "cumsum", "none"), - off2int = FALSE, parameter = names(object), ...){ - coef.mboostLSS(object, which = which, aggregate = aggregate, - parameter = parameter, off2int = off2int, ...) -} - -risk.mboostLSS <- function(object, merge = FALSE, parameter = names(object), ...){ - if (is.character(parameter)) - parameter <- extract_parameter(object, parameter) - - lo <- length(unique(mstop(object))) - if (merge) { - get_rsk <- function(i, object) { - mmo <- max(mstop(object)) - rsk <- object[[i]]$risk() - if (length(rsk) != mmo) { - rsk <- c(rsk, rep(NA, mmo - length(rsk))) - } - rsk - } - RES <- sapply(parameter, get_rsk, - object = object) - RES <- as.vector(t(RES)) - names(RES) <- rep(names(parameter), mstop(object)[1]) - ## drop unwanted NAs - if (lo != 1) - RES <- RES[!is.na(RES)] - class(RES) <- object[[1]]$control$risk - return(RES) - } - RES <- lapply(parameter, function(i, object) object[[i]]$risk(), - object = object) - class(RES) <- object[[1]]$control$risk - return(RES) -} - -mstop.mboostLSS <- function(object, parameter = names(object), ...){ - if (is.character(parameter)) - parameter <- extract_parameter(object, parameter) - RET <- sapply(parameter, function(i, object) object[[i]]$mstop(), - object = object) - names(RET) <- names(object)[parameter] - if (length(RET) == 1) - RET <- RET[[1]] - return(RET) -} - -mstop.oobag <- function(object, parameter = names(object), ...){ - if (is.character(parameter)) - parameter <- extract_parameter(object, parameter) - RET <- sapply(parameter, function(i, object) which.min(object[[i]]), - object = object) - names(RET) <- names(object)[parameter] - if (length(RET) == 1) - RET <- RET[[1]] - return(RET) -} - -selected.mboostLSS <- function(object, parameter = names(object), ...){ - if (is.character(parameter)) - parameter <- extract_parameter(object, parameter) - RET <- lapply(parameter, function(i, object) - selected(object[[i]]), - object = object) - names(RET) <- names(object)[parameter] - if (length(RET) == 1) - RET <- RET[[1]] - return(RET) -} - - -plot.glmboostLSS <- function(x, main = names(x), parameter = names(x), - off2int = FALSE, ...){ - if (is.character(parameter)) - parameter <- extract_parameter(x, parameter) - lapply(parameter, function(i, x, main, off2int, ...) - plot(x[[i]], main = main[[i]], off2int = off2int, ...), - x = x, main = main, off2int = off2int, ...) - invisible(coef(x, aggregate = "cumsum", off2int = off2int)) -} - - -plot.gamboostLSS <- function(x, main = names(x), parameter = names(x), ...){ - if (is.character(parameter)) - parameter <- extract_parameter(x, parameter) - RET <- lapply(parameter, function(i, x, main, ...) - plot(x[[i]], main = main[[i]], ...), - x = x, main = main, ...) - if (any(sapply(RET, class) == "trellis")) { - return(RET) - } else { - invisible(RET) - } -} - -plot.predint <- function(x, main = "Marginal Prediction Interval(s)", - xlab = NULL, ylab = NULL, lty = c("solid", "dashed"), - lcol = c("black", "black"), log = "", ...) { - - pi <- attr(x, "pi") - which <- attr(x, "which") - rawdata <- attr(x, "rawdata") - - if (length(lty) != length(pi) + 1) - lty <- c(lty, rep(tail(lty, 1), (length(pi) + 1) - length(lty))) - if (length(lcol) != length(pi) + 1) - lcol <- c(lcol, rep(tail(lcol, 1), (length(pi) + 1) - length(lcol))) - - if (is.null(xlab)) - xlab <- which - if (is.null(ylab)) - ylab <- "prediction" - - plot(rawdata$x, rawdata$y, pch = 20, - col = rgb(0.5, 0.5, 0.5, 0.5), - xlab = xlab, ylab = ylab, main = main, - log = log, ...) - - lines(x[, which], x$"Prediction (Median)", - lty = lty[1], col = lcol[1], ...) - - for (i in seq_along(pi)) { - lines(x[, which], x[, paste0(pi[i] * 100, "% PI (lower)")], - lty = lty[i + 1], col = lcol[i + 1], ...) - lines(x[, which], x[, paste0(pi[i] * 100, "% PI (upper)")], - lty = lty[i + 1], col = lcol[i + 1], ...) - } -} - - -PI <- predint <- function(x, which, pi = 0.9, newdata = NULL, ...) { - qfun <- get_qfun(x) - - if (length(which) != 1 || !is.character(which)) - stop("Please specify the variable for the marginal prediction interval.") - - var <- get_data(x, which = which) - if (ncol(var) > 1 || is.factor(var)) - stop("Prediction intervals are currently only implemented for ", - "base-learners of one numeric variable") - - pred_vars <- lapply(x, extract, what = "variable.names") - pred_vars <- unique(unlist(pred_vars)) - if ("(Intercept)" %in% pred_vars) - pred_vars <- pred_vars[pred_vars != "(Intercept)"] - - if (is.null(newdata)) { - tmp <- get_data(x, which = pred_vars) - i <- grepl(which, names(tmp)) - if (sum(i) != 1) - stop(sQuote("which"), " is misspecified") - newdata <- data.frame(x1 = seq(min(tmp[, i]), - max(tmp[, i]), length = 150)) - colnames(newdata) <- names(tmp)[i] - newdata[, names(tmp)[!i]] <- lapply(tmp[, !i], mean_mod) - } else { - i <- grepl(which, names(newdata)) - if (sum(i) != 1) - stop(sQuote("which"), "is misspecified") - ## check if data is ok, else give a warning - if (nrow(unique(newdata[, !i])) != 1) - warning("All variables but", sQuote("which"), "should be constant") - } - - newdata[, names(x)] <- predict(x, newdata = newdata, type = "response") - newdata$"Prediction (Median)" <- do.call(qfun, args = c(p = 0.5, - newdata[, names(x)])) - - for (i in seq_along(pi)) { - newdata[, paste0(pi[i] * 100, "% PI (lower)")] <- do.call(qfun, - args = c(p = (1 - pi[i])/2, newdata[, names(x)])) - newdata[, paste0(pi[i] * 100, "% PI (upper)")] <- do.call(qfun, - args = c(p = 1 - (1 - pi[i])/2, newdata[, names(x)])) - } - # drop predictions of parameters - newdata <- newdata[, !names(newdata) %in% names(x)] - - class(newdata) <- c("predint", "data.frame") - attr(newdata, "pi") <- pi - attr(newdata, "which") <- which - attr(newdata, "rawdata") <- data.frame(x = get_data(x, which = pred_vars)[, which], - y = x[[1]]$response) - return(newdata) -} - - -print.mboostLSS <- function(x, ...){ - cl <- match.call() - cat("\n") - cat("\t LSS Models fitted via Model-based Boosting\n") - cat("\n") - if (!is.null(attr(x, "call"))) - cat("Call:\n", deparse(attr(x, "call")), "\n\n", sep = "") - cat("Number of boosting iterations (mstop): ", - paste(names(mstop(x)), mstop(x), sep = " = ", collapse = ", "), "\n") - nus <- sapply(x, function(xi) xi$control$nu) - cat("Step size: ", - paste(names(nus), nus, sep = " = ", collapse = ", "), "\n\n") - cat("Families:\n") - lapply(x, function(xi) show(xi$family)) - invisible(x) -} - - -fitted.mboostLSS <- function(object, parameter = names(object), ...){ - if (is.character(parameter)) - parameter <- extract_parameter(object, parameter) - myApply(parameter, function(i, mod, ...) fitted(mod[[i]], ...), - mod = object, ...) -} - - -predict.mboostLSS <- function(object, newdata = NULL, - type = c("link", "response", "class"), - which = NULL, - aggregate = c("sum", "cumsum", "none"), - parameter = names(object), ...) { - if (is.character(parameter)) - parameter <- extract_parameter(object, parameter) - myApply(parameter, function(i, mod, ...) - predict(mod[[i]], newdata = newdata, type = type, which = which, - aggregate = aggregate, ...), - mod = object, ...) -} - -update.mboostLSS <- function(object, weights, oobweights = NULL, - risk = NULL, trace = NULL, mstop = NULL, ...) { - attr(object, "update")(weights = weights, oobweights = oobweights, - risk = risk, trace = trace, mstop = mstop, ...) -} - -## generic version of model.weights (see stats::model.weights) -model.weights <- function(x, ...) - UseMethod("model.weights") - -model.weights.default <- function(x, ...) - stats::model.weights(x) - -model.weights.mboostLSS <- function(x, ...) - attr(x, "(weights)") - -### summary function based on print.mboostLSS() and summary.mboost() -summary.mboostLSS <- function(object, ...) { - cat("\n") - cat("\t LSS Models fitted via Model-based Boosting\n") - cat("\n") - if (!is.null(attr(object, "call"))) - cat("Call:\n", deparse(attr(object, "call")), "\n\n", sep = "") - cat("Number of boosting iterations (mstop): ", - paste(names(mstop(object)), mstop(object), - sep = " = ", collapse = ", "), - "\n") - nus <- sapply(object, function(xi) xi$control$nu) - cat("Step size: ", - paste(names(nus), nus, sep = " = ", collapse = ", "), "\n\n") - - cat("Families:\n") - lapply(object, function(xi) show(xi$family)) - - if (inherits(object, "glmboostLSS")) { - cat("Coefficients:\n") - cf <- coef(object, off2int = TRUE) - for (i in 1:length(cf)) { - cat("Parameter ", names(cf)[i], ":\n", sep = "") - print(cf[[i]]) - cat("\n") - } - } - - cat("Selection frequencies:\n") - for (i in 1:length(object)) { - cat("Parameter ", names(object)[i], ":\n", sep = "") - nm <- variable.names(object[[i]]) - selprob <- tabulate(selected(object[[i]]), nbins = length(nm)) / - length(selected(object[[i]])) - names(selprob) <- names(nm) - selprob <- sort(selprob, decreasing = TRUE) - selprob <- selprob[selprob > 0] - print(selprob) - } - invisible(object) -} - -################################################################################ -### helpers - -## extract parameter index from mboostLSS object x -extract_parameter <- function(x, parameter) { - idx <- sapply(parameter, function(w) { - wi <- grep(w, names(x), fixed = TRUE) - if (length(wi) > 0) return(wi) - return(NA) - }) - if (any(is.na(idx))) - warning(paste(parameter[is.na(idx)], collapse = ","), " not found") - parameter <- idx -} - -## function for weighted sd -weighted.sd <- function(x, w, ...) { - if (missing(w)) - w <- rep(1, length(x)) - m <- weighted.mean(x, w, ...) - var <- weighted.mean((x - m)^2, w, ...) * sum(w) / (sum(w) - 1) - return(sqrt(var)) -} - -## weighted median -weighted.median <- function (x, w = 1, na.rm = FALSE) { - if (length(w) == 1) - w <- rep(w, length(x)) - - ## remove observations with zero weights - x <- x[w != 0] - w <- w[w != 0] - - ## remove NAs if na.rm = TRUE - if (na.rm) { - keep <- !is.na(x) & !is.na(w) - x <- x[keep] - w <- w[keep] - } else { - if (any(is.na(x)) | any(is.na(w))) - return(NA) - } - - ## sort data and weights - ind <- order(x) - x <- x[ind] - w <- w[ind] - - ## first time that fraction of weights is above 0.5 - ind1 <- min(which(cumsum(w)/sum(w) > 0.5)) - - ## first time that fraction of weights is below 0.5 - ind2 <- ifelse(ind1 == 1, 1, max(which(cumsum(w)/sum(w) <= 0.5))) - - ## if sum of weights is an even integer - if(sum(w) %% 1 == 0 && sum(w) %% 2 == 0) - return(mean(c(x[ind1], x[ind2]))) - - ## else return - return(max(c(x[ind1], x[ind2]))) -} diff --git a/patch/inst/NEWS.Rd b/patch/inst/NEWS.Rd deleted file mode 100644 index fff1510..0000000 --- a/patch/inst/NEWS.Rd +++ /dev/null @@ -1,219 +0,0 @@ -\name{NEWS} -\title{News for Package 'gamboostLSS'} - -\section{Changes in gamboostLSS version 1.2-1 (2016-03-11)}{ - \subsection{User-visible changes}{ - \itemize{ - \item Speed up computations by using \code{response(fitted())} - instead of \code{fitted(, type = response)} as the latter uses - \code{predict()}. Closes issue - \href{https://github.com/boost-R/gamboostLSS/issues/5}{#5}. - \item Improved output of \code{print.mboostLSS()} and - \code{summary.mboostLSS()}. Closes issue - \href{https://github.com/boost-R/gamboostLSS/issues/7}{#7}. - \item Added \code{gamboostLSS_intern()} to make \pkg{FDboost} - happy. Caution: Do not use this function. - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item Fixed \file{inst/CITATION}. - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item Fixed tests for stabilization. - \item Fixed bug in \code{cvrisk.mboostLSS()} which occurred if - \code{families} wasn't explicitly specified when fitting the - model. Closes - \href{https://github.com/boost-R/gamboostLSS/issues/9}{#9}. - } - } -} - -\section{Changes in gamboostLSS version 1.2-0 (2015-08-19)}{ - \subsection{User-visible changes}{ - \itemize{ - \item New interface: Stabilization of negative gradient is now - specified via families, e.g., \code{GaussianLSS(stabilization = - "MAD")}. Using \code{options(gamboostLSS_stab_ngrad = TRUE)} is - still supported for backward compatibility but discouraged. - \item Added \code{weighted.median} which is used in \code{"MAD"} - stabilization (see bugfixes). - \item Added preliminary version of the tutorial paper as vignette, - which is now available as \code{vignette("gamboostLSS_Tutorial", - package = "gamboostLSS")}. - \item Added \code{summary} function (request - \href{https://github.com/boost-R/gamboostLSS/issues/2}{#2}). - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item Added preliminary version of tutorial paper as reference. - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item Improve stored \code{call}s (closes - \href{https://github.com/boost-R/gamboostLSS/issues/3}{#3}). - \item Use \code{weighted.median} to compute MAD when negative - gradients are stabilized. - \item Fixed handling of \pkg{gamlss.dist} families with \code{type - = "Mixed"}. - \item Fixed a bug in \code{as.families} with truncated \code{families} - (which can be obtained using the package \pkg{gamlss.tr}). - \item The internal helper \code{get_qfun} is now a generic - function. - \item Adhere to CRAN policies regarding import of base packages - (closes \href{https://github.com/boost-R/gamboostLSS/issues/1}{#1}). - } - } -} - -\section{Changes in gamboostLSS version 1.1-3 (2015-01-12)}{ - \subsection{Miscellaneous}{ - \itemize{ - \item Changed plain text \file{NEWS} to \file{inst/NEWS.Rd} - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item Changes in \file{inst/CITATION} to make CRAN happy: - Citations can now be extracted without the need to install the - package. - \item Corrected \code{india} data set:\cr - stunting ranged from -600 to 600 but should range from -6 to 6 - \item Fixed unstated dependencies - \item Changed \code{require} to \code{requireNamespace} - and added \code{gamlss.dist::} where necessary - \item Fixed bug in \code{selected.mboostLSS} - \item \code{predict()} returned a vector instead of a matrix - \item \code{factor}s were coerced to \code{character}s in - \code{predint()} - } - } -} - - -\section{Changes in gamboostLSS version 1.1-2 (2014-06-25)}{ - \subsection{Miscellaneous}{ - \itemize{ - \item added \pkg{survival} to suggests and load it in tests to - reflect recent changes in \pkg{mboost} - \item removed the generic function \code{risk()} as this function is - now defined in \pkg{mboost} - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item check if response is correct for the \code{family} before - the \code{offset} is computed - } - } -} - -\section{Changes in gamboostLSS version 1.1-1 (2014-06-16)}{ - \subsection{Miscellaneous}{ - \itemize{ - \item re-added tests - \item changed \code{\\dontrun} to \code{\\donttest} in examples - } - } -} - -\section{Changes in gamboostLSS version 1.1-0 (2014-06-12)}{ - \subsection{User-visible changes}{ - \itemize{ - \item added new function \code{cvrisk} for generic - cross-validation (\pkg{gamboostLSS} now requires \pkg{mboost} >= - 2.2-3 for the generic function definition) - \item added a function to obtain cross-validation grids - (\code{make_grid}) - \item added new function \code{as.families} to include - \pkg{gamlss} families in \pkg{gamboostLSS} - \item added new families \code{BetaLSS}, \code{GammaLSS}, - \code{GaussianLSS}, \code{ZIPoLSS}, \code{ZINBLSS} - \item \code{GaussianLSS} is now the default for \code{families} - \item added new functions \code{predint()} and - \code{plot(predint())} to obtain and plot marginal prediction - intervals - \item added stabilization factor for negative gradients (MAD): - turn on the stabilization by using\cr - \code{options(gamboostLSS_stab_ngrad = TRUE)} - \item added new data sets \code{india} and \code{india.bnd} - } - } - \subsection{Miscellaneous}{ - \itemize{ - \item lots of minor improvements in the interface and methods - \item improved manuals in various places - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item Speed of model fitting was dependent on iteration, - i.e. the algorithm got slower for larger \code{mstop} values - } - } -} - -\section{Changes in gamboostLSS version 1.0-3 (2011-11-16)}{ - \subsection{Miscellaneous}{ - \itemize{ - \item removed duplicated (and slightly altered) code from - \pkg{mboost} that was required to make \pkg{gamboostLSS} work with - earlier versions of \pkg{mboost};\cr - \pkg{gamboostLSS} now requires \pkg{mboost} >= 2.0-12 - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item fixed potential problem that might occur if users specify - different outcomes for different components - \item fixed bug in \file{tests/regtest-gamboostLSS.R} - } - } -} - -\section{Changes in gamboostLSS version 1.0-2 (2011-08-31)}{ - \subsection{Bug-fixes}{ - \itemize{ - \item changed the way we use environments - (to get rid of note: \code{no visible binding}) - } - } -} - -\section{Changes in gamboostLSS version 1.0-1 (2011-08-10)}{ - \subsection{Miscellaneous}{ - \itemize{ - \item updated dependencies - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item fixed bug in \code{selected()} - } - } -} - -\section{Changes in gamboostLSS version 1.0 (2011-08-10)}{ - \subsection{Miscellaneous}{ - \itemize{ - \item updated references - \item moved \pkg{gamboostLSS} to CRAN - } - } - \subsection{Bug-fixes}{ - \itemize{ - \item some changes to make \pkg{gamboostLSS} work with - \pkg{mboost} 2.0.x series - } - } -} - -\section{Changes in gamboostLSS version 0.5 (2010-07-02)}{ - \itemize{ - \item initial development version of \pkg{gamboostLSS} on R-forge - } -} diff --git a/patch/man/cvrisk.Rd b/patch/man/cvrisk.Rd deleted file mode 100644 index 12e8dad..0000000 --- a/patch/man/cvrisk.Rd +++ /dev/null @@ -1,237 +0,0 @@ -\name{cvrisk.mboostLSS} -\alias{cvrisk} -\alias{cvrisk.mboostLSS} -\alias{make.grid} -\alias{plot.cvriskLSS} - -\title{ Cross-Validation } -\description{ - Multidimensional cross-validated estimation of the empirical risk for - hyper-parameter selection. -} -\usage{ -\method{cvrisk}{mboostLSS}(object, folds = cv(model.weights(object)), - grid = make.grid(mstop(object)), papply = mclapply, - trace = TRUE, fun = NULL, ...) - -make.grid(max, length.out = 10, min = NULL, log = TRUE, - dense_mu_grid = TRUE) - -\method{plot}{cvriskLSS}(x, type = c("heatmap", "lines"), - xlab = NULL, ylab = NULL, ylim = range(x), - main = attr(x, "type"), ...) -} - -\arguments{ - \item{object}{ - an object of class \code{mboostLSS}, i.e., a boosted GAMLSS model. - } - \item{folds}{ - 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. Can be computed using function - \code{\link{cv}} from package \pkg{mboost} and defaults to 25 - bootstrap samples. - } - \item{grid}{ - a matrix of stopping parameters the empirical risk is to be - evaluated for. Each row represents a parameter combination. The - number of columns must be equal to the number of parameters of the - GAMLSS family. Per default, \code{make.grid(mstop(object))} is used. - } - \item{papply}{ - (parallel) apply function, defaults to \code{\link[parallel]{mclapply}}. - Alternatively, \code{\link[parallel]{parLapply}} can be used. In the - latter case, usually more setup is needed. To run \code{cvrisk} - sequentially (i.e. not in parallel), one can use \code{\link{lapply}}. - } - \item{trace}{ - should status information beein printed during cross-validation? - Default: \code{TRUE}. - } - \item{fun}{ - if \code{fun} is 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. - } - \item{\dots}{ - additional arguments passed to \code{\link[parallel]{mclapply}} or - the \code{plot} function depending on the context. - } - \item{max}{ - a named vector of length equal to the number of parameters of the GAMLSS - family (and names equal to the names of \code{families}) that - determines the maximal values of the grid. - } - \item{length.out}{ - the number of grid points (default: 10). This can be either a vector - of the same length as \code{max} (with different values) or a scalar - (which is then used as length for all grids). - } - \item{min}{ - minimal value of the grid. Per default the grid starts at 1 but - other values (smaller \code{max}) are possible. This can be either a - vector of the same length as \code{max} (with different values) or a - scalar (which is then used as \code{min} for all grids). - } - \item{log}{ - should the grid be on a logarithmic scale? Default: \code{TRUE}. - } - \item{dense_mu_grid}{ - should the grid in the \code{mu} component be extended for all - values of the \code{mstop} values corresponding to \code{mu} that - are greater or equal to all other parameters in this combination. - These values can be computed without or with very little additional - computational costs. For details see examples. - } - \item{x}{ - an object of class \code{cvriskLSS}, which results from running - \code{cvrisk}. - } - \item{type}{ - should \code{"lines"} or a \code{"heatmap"} (default) be plotted? - See details. - } - \item{xlab, ylab}{ - user-specified labels for the x-axis and y-axis of the plot (which - are usually not needed). The defaults depend on the plot \code{type}. - } - \item{ylim}{ - limits of the y-axis. Only applicable for the line plot. - } - \item{main}{ - a title for the plots. - } -} -\details{ - The number of boosting iterations is a hyper-parameter of the - boosting algorithms implemented in this package. Honest, - i.e., cross-validated, estimates of the empirical risk - for different stopping parameters \code{mstop} are computed by - this function which can be utilized to choose an appropriate - number of boosting iterations to be applied. For details see - \code{\link{cvrisk.mboost}}. - - \code{make.grid} eases the creation of an equidistand, integer-valued - grids, which can be used with \code{cvrisk}. Per default, the grid is - equidistant on a logarithmic scale. - - The line plot depicts the avarage risk for each grid point and - additionally shows information on the variability of the risk from - fold to fold. The heatmap shows only the average risk but in a nicer - fashion. - - Hofner et al. (2015) provide a detailed description of - cross-validation for \code{\link{gamboostLSS}} models and show a - worked example. -} -\value{ - An object of class \code{cvriskLSS} (when \code{fun} wasn't - 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. -} -\references{ - B. Hofner, A. Mayr, M. Schmid (2015). gamboostLSS: An R Package for - Model Building and Variable Selection in the GAMLSS Framework. - Journal of Statistical Software. Accepted for publication. - - Available as \code{vignette("gamboostLSS_Tutorial")}. -} -\seealso{ - \code{\link{cvrisk.mboost}} and \code{\link{cv}} (both in package - \pkg{mboost}) -} -\examples{ -## Data generating process: -set.seed(1907) -x1 <- rnorm(1000) -x2 <- rnorm(1000) -x3 <- rnorm(1000) -x4 <- rnorm(1000) -x5 <- rnorm(1000) -x6 <- rnorm(1000) -mu <- exp(1.5 +1 * x1 +0.5 * x2 -0.5 * x3 -1 * x4) -sigma <- exp(-0.4 * x3 -0.2 * x4 +0.2 * x5 +0.4 * x6) -y <- numeric(1000) -for( i in 1:1000) - y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) -dat <- data.frame(x1, x2, x3, x4, x5, x6, y) - -## linear model with y ~ . for both components: 100 boosting iterations -model <- glmboostLSS(y ~ ., families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 100), - center = TRUE) - -## set up a grid -grid <- make.grid(mstop(model), length.out = 5, dense_mu_grid = FALSE) -plot(grid) - -\donttest{### Do not test the following code per default on CRAN as it takes some time to run: -### a tiny toy example (5-fold bootsrap with maximum stopping value 100) -## (to run it on multiple cores of a Linux or Mac OS computer remove -## set papply = mclapply (default) and set mc.nodes to the -## appropriate number of nodes) -cvr <- cvrisk(model, folds = cv(model.weights(model), B = 5), - papply = lapply, grid = grid) -cvr -## plot the results -par(mfrow = c(1, 2)) -plot(cvr) -plot(cvr, type = "lines") -## extract optimal mstop (here: grid to small) -mstop(cvr) -### END (don't test automatically) -} - -\donttest{### Do not test the following code per default on CRAN as it takes some time to run: -### a more realistic example -grid <- make.grid(c(mu = 400, sigma = 400), dense_mu_grid = FALSE) -plot(grid) -cvr <- cvrisk(model, grid = grid) -mstop(cvr) -## set model to optimal values: -mstop(model) <- mstop(cvr) -### END (don't test automatically) -} - -### Other grids: -plot(make.grid(mstop(model), length.out = 3, dense_mu_grid = FALSE)) -plot(make.grid(c(mu = 400, sigma = 400), log = FALSE, dense_mu_grid = FALSE)) -plot(make.grid(c(mu = 400, sigma = 400), length.out = 4, - min = 100, log = FALSE, dense_mu_grid = FALSE)) - - -### Now use dense mu grids -# standard grid -plot(make.grid(c(mu = 100, sigma = 100), dense = FALSE), - pch = 20, col = "red") -# dense grid for all mstop_mu values greater than mstop_sigma -grid <- make.grid(c(mu = 100, sigma = 100)) -points(grid, pch = 20, cex = 0.2) -abline(0,1) - -# now with three parameters -grid <- make.grid(c(mu = 100, sigma = 100, df = 30), - length.out = c(5, 5, 2), dense = FALSE) -densegrid <- make.grid(c(mu = 100, sigma = 100, df = 30), - length.out = c(5, 5, 2)) -par(mfrow = c(1,2)) -# first for df = 1 -plot(grid[grid$df == 1, 1:2], main = "df = 1", pch = 20, col = "red") -abline(0,1) -abline(v = 1) -# now expand grid for all mu values greater the corresponding sigma -# value (i.e. below the bisecting line) and above df (i.e. 1) -points(densegrid[densegrid$df == 1, 1:2], pch = 20, cex = 0.2) - -# now for df = 30 -plot(grid[grid$df == 30, 1:2], main = "df = 30", pch = 20, col = "red") -abline(0,1) -abline(v = 30) -# now expand grid for all mu values greater the corresponding sigma -# value (i.e. below the bisecting line) and above df (i.e. 30) -points(densegrid[densegrid$df == 30, 1:2], pch = 20, cex = 0.2) -} -\keyword{models} -\keyword{regression} diff --git a/patch/man/families.Rd b/patch/man/families.Rd deleted file mode 100644 index 3bd3da5..0000000 --- a/patch/man/families.Rd +++ /dev/null @@ -1,327 +0,0 @@ -\name{Families} -\alias{Families} -\alias{families} - -\alias{GaussianLSS} -\alias{GaussianMu} -\alias{GaussianSigma} - -\alias{GammaLSS} -\alias{GammaMu} -\alias{GammaSigma} - -\alias{BetaLSS} -\alias{BetaMu} -\alias{BetaPhi} - - -\alias{NBinomialLSS} -\alias{NBinomialMu} -\alias{NBinomialSigma} - -\alias{StudentTLSS} -\alias{StudentTMu} -\alias{StudentTSigma} -\alias{StudentTDf} - -\alias{LogNormalLSS} -\alias{LogNormalMu} -\alias{LogNormalSigma} - -\alias{WeibullLSS} -\alias{WeibullMu} -\alias{WeibullSigma} - -\alias{LogLogLSS} -\alias{LogLogMu} -\alias{LogLogSigma} - -\alias{ZIPoLSS} -\alias{ZINBLSS} - -\alias{options} -\alias{stab_ngrad} -\alias{stabilize_ngrad} -\alias{stabilize_ngradient} - -\title{ - Families for GAMLSS models -} -\description{ - The package provides some pre-defined GAMLSS families, e.g. - \code{NBionomialLSS}. Objects of the class \code{families} provide a - convenient way to specify GAMLSS distributions to be fitted by one of - the boosting algorithms implemented in this package. By using the - function \code{Families}, a new object of the class \code{families} - can be generated. -} - -\usage{ -############################################################ -# Families for continuous response - -# Gaussian distribution -GaussianLSS(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) - -# Student's t-distribution -StudentTLSS(mu = NULL, sigma = NULL, df = NULL, - stabilization = c("none", "MAD")) - -############################################################ -# Families for continuous non-negative response - -# Gamma distribution -GammaLSS(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) - -############################################################ -# Families for fractions and bounded continuous response - -# Beta distribution -BetaLSS(mu = NULL, phi = NULL, - stabilization = c("none", "MAD")) - -############################################################ -# Families for count data - -# Negative binomial distribution -NBinomialLSS(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) - -# Zero-inflated Poisson distribution -ZIPoLSS(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) - -# Zero-inflated negative binomial distribution -ZINBLSS(mu = NULL, sigma = NULL, nu = NULL, - stabilization = c("none", "MAD")) - -############################################################ -# Families for survival models (accelerated failure time -# models) for data with right censoring - -# Log-normal distribution -LogNormalLSS(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) - -# Log-logistic distribution -LogLogLSS(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) - -# Weibull distribution -WeibullLSS(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) - -############################################################ -# Constructor function for new GAMLSS distributions -Families(..., qfun = NULL, name = NULL) -} - -\arguments{ - \item{\dots}{ sub-families to be passed to constructor. } - \item{qfun}{ quantile function. This function can for example be used - to compute (marginal) prediction intervals. See - \code{\link{predint}}.} - \item{name}{ name of the families. } - \item{mu}{ offset value for mu. } - \item{sigma}{ offset value for sigma. } - \item{phi}{ offset value for phi. } - \item{df}{ offset value for df. } - \item{nu}{ offset value for nu. } - \item{stabilization}{ governs if the negative gradient should be - standardized in each boosting step. It can be either "none" or - "MAD". See also Details below. - } -} -\details{ - - The arguments of the families are the offsets for each distribution - parameter. Offsets can be either scalar, a vector with length equal to - the number of observations or \code{NULL} (default). In the latter - case, a scalar offset for this component is computed by minimizing the - risk function w.r.t. the corresponding distribution parameter (keeping - the other parameters fixed). - - Note that \code{gamboostLSS} is not restricted to three components but - can handle an arbitrary number of components (which, of course, - depends on the GAMLSS distribution). However, it is important that the - names (for the offsets, in the sub-families etc.) are chosen - \emph{consistently}. - - The \code{ZIPoLSS} families can be used to fit zero-inflated Poisson - models. Here, \code{mu} and \code{sigma} refer to the location - parameter of the Poisson component (with log link) and the mean of the - zero-generating process (with logit link), respectively. - - Similarly, \code{ZINBLSS} can be used to fit zero-inflated negative - binomial models. Here, \code{mu} and \code{sigma} refer to the - location and scale parameters (with log link) of the negative binomial - component of the model. The zero-generating process (with logit link) - is represented by \code{nu}. - - The \code{Families} function can be used to implements a new GAMLSS - distribution which can be used for fitting by \code{\link{mboostLSS}}. - Thereby, the function builds a list of sub-families, one for each - distribution parameter. The sub-families themselves are objects of the - class \code{boost_family}, and can be constructed via the function - \code{\link[mboost]{Family}} of the \code{mboost} Package. - - Arguments to be passed to \code{Family}: The \code{loss} for every - distribution parameter (contained in objects of class - \code{boost_family}) is the negative log-likelihood of the - corresponding distribution. The \code{ngradient} is the negative - partial derivative of the loss function with respect to the - distribution parameter. For a two-parameter distribution (e.g. mu and - sigma), the user therefore has to specify two sub-families with - \code{\link{Family}}. The \code{loss} is basically the same function - for both paramters, only \code{ngradient} differs. Both sub-families - are passed to the \code{Families} constructor, which returns an object - of the class \code{families}. - - To (potentially) stabilize the model estimation by standardizing the - negative gradients one can use the argument \code{stabilization} of - the families. If \code{stabilization = "MAD"}, the negative gradient - is divided by its (weighted) median absolute deviation \deqn{median_i - (|u_{k,i} - median_j(u_{k,j})|)} in each boosting step. See Hofner et - al. (2015) for details. - -} -\value{ - An object of class \code{families}. -} - -\author{ - \code{BetaLSS} for boosting beta regression was implmented by Florian - Wickler. -} - -\references{ - B. Hofner, A. Mayr, M. Schmid (2015). gamboostLSS: An R Package for - Model Building and Variable Selection in the GAMLSS Framework. - Journal of Statistical Software. Accepted for publication. - - Available as \code{vignette("gamboostLSS_Tutorial")}. - - 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, 507-554. - -} - - -\seealso{ - \code{\link{as.families}} for applying GAMLSS distributions provided - in the framework of the \code{gamlss} package. - - The functions \code{\link{gamboostLSS}} and \code{\link{glmboostLSS}} - can be used for model fitting. - - See also the corresponding constructor function - \code{\link[mboost]{Family}} in \code{\link[mboost]{mboost}}. -} - -\examples{ -## Example to define a new distribution: -## Students t-distribution with two parameters, df and mu: - -## sub-Family for mu -## -> generate object of the class family from the package mboost -newStudentTMu <- function(mu, df){ - - # loss is negative log-Likelihood, f is the parameter to be fitted with - # id link -> f = mu - loss <- function(df, y, f) { - -1 * (lgamma((df + 1)/2) - lgamma(1/2) - - lgamma(df/2) - 0.5 * log(df) - - (df + 1)/2 * log(1 + (y - f)^2/(df ))) - } - # risk is sum of loss - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, df = df)) - } - # ngradient is the negative derivate w.r.t. mu - ngradient <- function(y, f, w = 1) { - (df + 1) * (y - f)/(df + (y - f)^2) - } - - # use the Family constructor of mboost - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) f, - name = "new Student's t-distribution: mu (id link)") -} - -## sub-Family for df -newStudentTDf <- function(mu, df){ - - # loss is negative log-Likelihood, f is the parameter to be fitted with - # log-link: exp(f) = df - loss <- function( mu, y, f) { - -1 * (lgamma((exp(f) + 1)/2) - lgamma(1/2) - - lgamma(exp(f)/2) - 0.5 * f - - (exp(f) + 1)/2 * log(1 + (y - mu)^2/(exp(f) ))) - } - # risk is sum of loss - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu)) - } - # ngradient is the negative derivate w.r.t. df - ngradient <- function(y, f, w = 1) { - exp(f)/2 * (digamma((exp(f) + 1)/2) - digamma(exp(f)/2)) - - 0.5 - (exp(f)/2 * log(1 + (y - mu)^2 / (exp(f) )) - - (y - mu)^2 / (1 + (y - mu)^2 / exp(f)) * (exp(-f) + 1)/2) - } - # use the Family constructor of mboost - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) exp(f), - name = "Student's t-distribution: df (log link)") -} - -## families object for new distribution -newStudentT <- Families(mu= newStudentTMu(mu=mu, df=df), - df=newStudentTDf(mu=mu, df=df)) - -\donttest{### Do not test the following code per default on CRAN as it takes some time to run: -### usage of the new Student's t distribution: -library(gamlss) ## required for rTF -set.seed(1907) -n <- 5000 -x1 <- runif(n) -x2 <- runif(n) -mu <- 2 -1*x1 - 3*x2 -df <- exp(1 + 0.5*x1 ) -y <- rTF(n = n, mu = mu, nu = df) - -## model fitting -model <- glmboostLSS(y ~ x1 + x2, families = newStudentT, - control = boost_control(mstop = 100), - center = TRUE) -## shrinked effect estimates -coef(model, off2int = TRUE) - -## compare to pre-defined three parametric t-distribution: -model2 <- glmboostLSS(y ~ x1 + x2, families = StudentTLSS(), - control = boost_control(mstop = 100), - center = TRUE) -coef(model2, off2int = TRUE) - -## with effect on sigma: -sigma <- 3+ 1*x2 -y <- rTF(n = n, mu = mu, nu = df, sigma=sigma) -model3 <- glmboostLSS(y ~ x1 + x2, families = StudentTLSS(), - control = boost_control(mstop = 100), - center = TRUE) -coef(model3, off2int = TRUE) -} - -} -\keyword{ models } -\keyword{ distributions } - - diff --git a/patch/man/gamboostLSS-package.Rd b/patch/man/gamboostLSS-package.Rd deleted file mode 100644 index 59c29c4..0000000 --- a/patch/man/gamboostLSS-package.Rd +++ /dev/null @@ -1,122 +0,0 @@ -\name{gamboostLSS-package} -\alias{gamboostLSS-package} - -\docType{package} -\title{ - Boosting algorithms for GAMLSS -} -\description{ - Boosting methods for fitting generalized additive models for - location, scale and shape (GAMLSS). -} -\details{ - - This package uses boosting algorithms for fitting GAMLSS (generalized - additive models for location, scale and shape). For information on - GAMLSS theory see Rigby and Stasinopoulos (2005), or the information - provided at \url{http://gamlss.org}. For a tutorial on - \code{\link{gamboostLSS}} see Hofner et al. (2015). - - The fitting methods \code{\link{glmboostLSS}} and - \code{\link{gamboostLSS}}, are alternatives for the algorithms - provided with \code{\link[gamlss]{gamlss}} in the \code{gamlss} - package. They offer shrinkage of effect estimates, intrinsic variable - selecion and model choice for potentially high-dimensional data - settings. - - \code{\link{glmboostLSS}} (for linear effects) and - \code{\link{gamboostLSS}} (for smooth effects) depend on their - analogous companions \code{\link[mboost]{glmboost}} and - \code{\link[mboost]{gamboost}} for generalized additive models - (contained in package \code{\link{mboost}}, see Hothorn et al. 2010, - 2015) and are similar in their usage. - - The package includes some pre-defined GAMLSS distributions, but the - user can also specify new distributions with \code{\link{Families}}. - - A wide range of different base-learners is available for covariate - effects (see \code{\link[mboost]{baselearners}}) including linear - (\code{bols}), non-linear (\code{bbs}), random (\code{brandom}) or - spatial effects (\code{bspatial} or Markov random fields \code{bmrf}). - Each bease-learner can be included seperately for each predictor. The - selection of base-learnes is crucial as it implies the kind of effect - the covariate has on each distribution parameter in the final GAMLSS. -} -\author{ - Benjamin Hofner, Andreas Mayr, Nora Fenske, Matthias Schmid - - Maintainer: Benjamin Hofner -} -\references{ - - B. Hofner, A. Mayr, M. Schmid (2015). gamboostLSS: An R Package for - Model Building and Variable Selection in the GAMLSS Framework. - Journal of Statistical Software. Accepted for publication. - - Available as \code{vignette("gamboostLSS_Tutorial")}. - - 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. - - M. Schmid, S. Potapov, A. Pfahlberg, and T. Hothorn. Estimation and - regularization techniques for regression models with multidimensional - prediction functions. Statistics and Computing, 20(2):139-150, 2010. - - 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, 507-554. - - Stasinopoulos, D. M. and R. A. Rigby (2007). Generalized additive models - for location scale and shape (GAMLSS) in R. Journal of Statistical - Software 23(7). - - Buehlmann, P. and Hothorn, T. (2007). Boosting algorithms: Regularization, - prediction and model fitting. Statistical Science, 22(4), 477--505. - - Hothorn, T., Buehlmann, P., Kneib, T., Schmid, M. and Hofner, B. (2010). - Model-based boosting 2.0. Journal of Machine Learning Research 11(Aug), - 2109-2113. - - Hothorn, T., Buehlmann, P., Kneib, T., Schmid, M. and Hofner, B. (2015). - mboost: Model-based boosting. R package version 2.4-2. - \url{http://cran.r-project.org/package=mboost} -} -\keyword{ package } - -\seealso{ - - \code{\link{gamboostLSS}} and \code{\link{glmboostLSS}} for model - fitting. Available distributions (families) are documented here: - \code{\link{Families}}. - - See also the \code{\link{mboost}} package for more on model-based boosting, or - the \code{\link[gamlss]{gamlss}} package for the original GAMLSS - algorithms provided by Rigby and Stasinopoulos. -} -\examples{ -# Generate covariates -x1 <- runif(100) -x2 <- runif(100) -eta_mu <- 2 - 2*x1 -eta_sigma <- -1 + 2*x2 - -# Generate response: Negative Binomial Distribution -y <- numeric(100) -for( i in 1:100) y[i] <- rnbinom(1, size=exp(eta_sigma[i]), mu=exp(eta_mu[i])) - -# Model fitting, 300 boosting steps, same formula for both distribution parameters -mod1 <- glmboostLSS( y ~ x1 + x2, families=NBinomialLSS(), - control=boost_control(mstop=300), center = TRUE) - -# Shrinked effect estimates -coef(mod1, off2int=TRUE) - -# Empirical risk with respect to mu -plot(risk(mod1)$mu) - -# Empirical risk with respect to sigma -plot(risk(mod1)$sigma) -} diff --git a/patch/man/mboostLSS.Rd b/patch/man/mboostLSS.Rd deleted file mode 100644 index 6174e9e..0000000 --- a/patch/man/mboostLSS.Rd +++ /dev/null @@ -1,235 +0,0 @@ -\name{mboostLSS} -\alias{mboostLSS} -\alias{blackboostLSS} -\alias{glmboostLSS} -\alias{gamboostLSS} -\alias{mboostLSS_fit} - -\title{ - Fitting GAMLSS by Boosting -} -\description{ - Functions for fitting GAMLSS (generalized additive models for - location, scale and shape) using boosting techniques. The algorithm - iteratively rotates between the distribution parameters, updating one while using - the current fits of the others as offsets (for details see Mayr et - al., 2012). -} -\usage{ -mboostLSS(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...) -glmboostLSS(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...) -gamboostLSS(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...) -blackboostLSS(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, ...) - -## fit function: -mboostLSS_fit(formula, data = list(), families = GaussianLSS(), - control = boost_control(), weights = NULL, - fun = mboost, funchar = "mboost", call = NULL, ...) -} - -\arguments{ - \item{formula}{ a symbolic description of the model to be fit. See - \code{\link{mboost}} for details. 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 family (see example for details). } - \item{data}{ a data frame 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 or a new distribution - specified by the user (see \code{\link{Families}} for details). Per - default, we use the two-parametric \code{\link{GaussianLSS}} family.} - \item{control}{ a list of parameters controlling the algorithm. For - more details see \code{\link{boost_control}}. } - \item{weights}{ a numeric vector of weights (optional). } - \item{fun}{ fit function. Either \code{\link{mboost}}, - \code{\link{glmboost}}, \code{\link{gamboost}} or - \code{\link{blackboost}}. Specified directly via the corresponding LSS - function. E.g. \code{gamboostLSS()} calls - \code{mboostLSS_fit(..., fun = gamboost)}. } - \item{funchar}{ character representation of fit function. Either \code{"mboost"}, - \code{"glmboost"}, \code{"gamboost"} or \code{"blackboost"}. - Specified directly via the corresponding LSS function.} - \item{call}{ used to forward the call from \code{mboostLSS}, - \code{glmboostLSS}, \code{gamboostLSS} and \code{blackboostLSS}. - This argument should not be directly specified by users!} - \item{\dots}{Further arguments to be passed to \code{mboostLSS_fit}. - In \code{mboostLSS_fit}, \code{\dots} represent further arguments to be - passed to \code{\link{mboost}} and \code{\link{mboost_fit}}. So - \code{\dots} can be all arguments of \code{mboostLSS_fit} and - \code{mboost_fit}. } -} -\details{ - - For information on GAMLSS theory see Rigby and Stasinopoulos (2005) or - the information provided at \url{http://gamlss.org}. For a tutorial on - \code{\link{gamboostLSS}} see Hofner et al. (2015). - - \code{glmboostLSS} uses \code{\link[mboost]{glmboost}} to fit the - distribution parameters of a GAMLSS -- a linear boosting model is - fitted for each parameter. - - \code{gamboostLSS} uses \code{\link[mboost]{gamboost}} to fit the - distribution parameters of a GAMLSS -- an additive boosting model (by - default with smooth effects) is fitted for each parameter. With the - \code{formula} argument, a wide range of different base-learners can - be specified (see \code{\link[mboost]{baselearners}}). The - base-learners inply the type of effect each covariate has on the - corresponding distribution parameter. - - \code{mboostLSS} uses \code{\link[mboost]{mboost}} to fit the - distribution parameters of a GAMLSS. The type of model (linear, - tree-based or smooth) is specified by \code{fun}. - - \code{blackboostLSS} uses \code{\link[mboost]{blackboost}} to fit the - distribution parameters of a GAMLSS -- a tree-based boosting model is - fitted for each parameter. - - \code{mboostLSS}, \code{glmboostLSS}, \code{gamboostLSS} and - \code{blackboostLSS} all call \code{mboostLSS_fit} while \code{fun} is - the corresponding \code{\link{mboost}} function, i.e., the same - function without \code{LSS}. For further possible arguments see - these functions as well as \code{\link{mboost_fit}}. - - In all four fitting functions it is possible to specify one or - multiple \code{mstop} and \code{nu} values via - \code{\link{boost_control}}. In the case of one single value, this - value is used for all distribution parameters of the GAMLSS model. - Alternatively, a (named) vector or a (named) list with separate values - for each component can be used to specify a seperate value for each - parameter of the GAMLSS model. The names of the list must correspond - to the names of the distribution parameters of the GAMLSS family. If - no names are given, the order of the \code{mstop} or \code{nu} values - is assumed to be the same as the order of the components in the - \code{families}. For one-dimensional stopping, the user therefore can - specify, e.g., \code{mstop = 100} via \code{\link{boost_control}}. For - more-dimensional stopping, one can specify, e.g., \code{mstop = - list(mu = 100, sigma = 200)} (see examples). - - To (potentially) stabilize the model estimation by standardizing the - negative gradients one can use the argument \code{stabilization} of - the families. See \code{\link{Families}} for details. - -} -\value{ - An object of class \code{mboostLSS} with corresponding methods to - extract information. -} -\references{ -B. Hofner, A. Mayr, M. Schmid (2015). gamboostLSS: An R Package for -Model Building and Variable Selection in the GAMLSS Framework. -Journal of Statistical Software. Accepted for publication. - -Available as \code{vignette("gamboostLSS_Tutorial")}. - -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. - -M. Schmid, S. Potapov, A. Pfahlberg, and T. Hothorn. Estimation and -regularization techniques for regression models with multidimensional -prediction functions. Statistics and Computing, 20(2):139-150, 2010. - -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, 507-554. - -Buehlmann, P. and Hothorn, T. (2007), Boosting algorithms: Regularization, -prediction and model fitting. Statistical Science, 22(4), 477--505. -} - -\seealso{ - \code{\link{Families}} for a documentation of available GAMLSS distributions. - - The underlying boosting functions \code{\link{mboost}}, \code{\link{gamboost}}, \code{\link{glmboost}}, - \code{\link{blackboost}} are contained in the \code{\link{mboost}} package. - - See for example \code{\link{risk}} or \code{\link{coef}} for methods - that can be used to extract information from \code{\link{mboostLSS}} objects. -} -\examples{ - -### Data generating process: -set.seed(1907) -x1 <- rnorm(1000) -x2 <- rnorm(1000) -x3 <- rnorm(1000) -x4 <- rnorm(1000) -x5 <- rnorm(1000) -x6 <- rnorm(1000) -mu <- exp(1.5 +1 * x1 +0.5 * x2 -0.5 * x3 -1 * x4) -sigma <- exp(-0.4 * x3 -0.2 * x4 +0.2 * x5 +0.4 * x6) -y <- numeric(1000) -for( i in 1:1000) - y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) -dat <- data.frame(x1, x2, x3, x4, x5, x6, y) - -### linear model with y ~ . for both components: 400 boosting iterations -model <- glmboostLSS(y ~ ., families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 400), - center = TRUE) -coef(model, off2int = TRUE) - - -### estimate model with different formulas for mu and sigma: -names(NBinomialLSS()) # names of the family - -\donttest{### Do not test the following code per default on CRAN as it takes some time to run: -# Note: Multiple formulas must be specified via a _named list_ -# where the names correspond to the names of the distribution parameters -# in the family (see above) -model2 <- glmboostLSS(formula = list(mu = y ~ x1 + x2 + x3 + x4, - sigma = y ~ x3 + x4 + x5 + x6), - families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 400, trace = TRUE), - center = TRUE) -coef(model2, off2int = TRUE) -### END (don't test automatically) -} - - -### Offset needs to be specified via the arguments of families object: -model <- glmboostLSS(y ~ ., data = dat, - families = NBinomialLSS(mu = mean(mu), - sigma = mean(sigma)), - control = boost_control(mstop = 10), - center = TRUE) -# Note: mu-offset = log(mean(mu)) and sigma-offset = log(mean(sigma)) -# as we use a log-link in both families -coef(model) -log(mean(mu)) -log(mean(sigma)) - -\donttest{### Do not test the following code per default on CRAN as it takes some time to run: -### use different mstop values for the two distribution parameters -### (two-dimensional early stopping) -### the number of iterations is passed to boost_control via a named list -model3 <- glmboostLSS(formula = list(mu = y ~ x1 + x2 + x3 + x4, - sigma = y ~ x3 + x4 + x5 + x6), - families = NBinomialLSS(), data = dat, - control = boost_control(mstop = list(mu = 400, - sigma = 300), - trace = TRUE), - center = TRUE) -coef(model3, off2int = TRUE) - -### Alternatively we can change mstop of model2: -# here it is assumed that the first element in the vector corresponds to -# the first distribution parameter of model2 etc. -mstop(model2) <- c(400, 300) -par(mfrow = c(1,2)) -plot(model2, xlim = c(0, max(mstop(model2)))) -## all.equal(coef(model2), coef(model3)) # same! -### END (don't test automatically) -} -} - -\keyword{models} -\keyword{nonlinear} -\keyword{fitting} diff --git a/patch/man/methods.Rd b/patch/man/methods.Rd deleted file mode 100644 index b400743..0000000 --- a/patch/man/methods.Rd +++ /dev/null @@ -1,373 +0,0 @@ -\name{methods} - -\alias{print.mboostLSS} -\alias{summary.mboostLSS} - -\alias{coef.mboostLSS} -\alias{coef.glmboostLSS} - -\alias{risk} -\alias{risk.mboostLSS} - -\alias{[.mboostLSS} - -\alias{mstop.mboostLSS} -\alias{mstop.oobag} -\alias{mstop.cvriskLSS} - -\alias{selected} -\alias{selected.mboostLSS} - -\alias{fitted.mboostLSS} -\alias{predict.mboostLSS} - -\alias{predint} -\alias{PI} - -\alias{plot.glmboostLSS} -\alias{plot.gamboostLSS} -\alias{plot.predint} - -\alias{update.mboostLSS} - -\alias{model.weights} -\alias{model.weights.default} -\alias{model.weights.mboostLSS} - -\title{ - Methods for mboostLSS -} -\description{ - Methods for GAMLSS models fitted by boosting algorithms. -} -\usage{ -### print model -\method{print}{mboostLSS}(x, ...) - -### summarize model -\method{summary}{mboostLSS}(object, ...) - -### extract coefficients -\method{coef}{glmboostLSS}(object, which = NULL, - aggregate = c("sum", "cumsum", "none"), - off2int = FALSE, parameter = names(object), ...) -\method{coef}{mboostLSS}(object, which = NULL, - aggregate = c("sum", "cumsum", "none"), - parameter = names(object), ...) - -### plot partial effects -\method{plot}{glmboostLSS}(x, main = names(x), parameter = names(x), - off2int = FALSE, ...) -\method{plot}{gamboostLSS}(x, main = names(x), parameter = names(x), ...) - -### extract and plot marginal prediction intervals -predint(x, which, pi = 0.9, newdata = NULL, ...) -PI(x, which, pi = 0.9, newdata = NULL, ...) -\method{plot}{predint}(x, main = "Marginal Prediction Interval(s)", - xlab = NULL, ylab = NULL, lty = c("solid", "dashed"), - lcol = c("black", "black"), log = "", ...) - -### extract mstop -\method{mstop}{mboostLSS}(object, parameter = names(object), ...) -\method{mstop}{oobag}(object, parameter = names(object), ...) -\method{mstop}{cvriskLSS}(object, parameter = NULL, ...) - -### set mstop -\method{[}{mboostLSS}(x, i, return = TRUE, ...) - -### extract risk -\method{risk}{mboostLSS}(object, merge = FALSE, parameter = names(object), ...) - -### extract selected base-learners -\method{selected}{mboostLSS}(object, parameter = names(object), ...) - -### extract fitted values -\method{fitted}{mboostLSS}(object, parameter = names(object), ...) - -### make predictions -\method{predict}{mboostLSS}(object, newdata = NULL, - type = c("link", "response", "class"), which = NULL, - aggregate = c("sum", "cumsum", "none"), - parameter = names(object), ...) - -### update weights of the fitted model -\method{update}{mboostLSS}(object, weights, oobweights = NULL, - risk = NULL, trace = NULL, mstop = NULL, ...) - -### extract model weights -\method{model.weights}{mboostLSS}(x, ...) - -} -\arguments{ - \item{x, object}{ an object of the appropriate class (see usage). } - \item{which}{ a subset of base-learners to take into account when computing - predictions or coefficients. If \code{which} is given - (as an integer vector or characters corresponding - to base-learners), a list or matrix is returned. In \code{plot_PI} - the argument \code{which} must be specified and it must be given as - a character string containing the name of the variable.} - \item{aggregate}{ a character specifying how to aggregate predictions - or coefficients of single base-learners. The default - returns the prediction or coefficient for the final number of - boosting iterations. \code{"cumsum"} returns a - matrix with the predictions for all iterations - simultaneously (in columns). \code{"none"} returns a - list with matrices where the \eqn{j}th columns of the - respective matrix contains the predictions - of the base-learner of the \eqn{j}th boosting - iteration (and zero if the base-learner is not - selected in this iteration).} - \item{parameter}{ This can be either a vector of indices or a vector - of parameter names which should be processed. See expamles for - details. Per default all distribution parameters of the GAMLSS family are - returned. } - \item{off2int}{ logical indicating whether the offset should be - added to the intercept (if there is any) or if the offset is - neglected for plotting (default).} - \item{merge}{ logical. Should the risk vectors of the single - components be merged to one risk vector for the model in total? Per - default (\code{merge = FALSE}) a (named) list of risk vectors is - returned.} - \item{i}{ integer. Index specifying the model to extract. If \code{i} - is smaller than the initial \code{mstop}, a subset is used. - If \code{i} is larger than the initial \code{mstop}, - additional boosting steps are performed until step \code{i} - is reached. One can specify a scalar, a (possibly named) vector or a - (possibly named) list with separate values for each component. See - the details section of \code{\link{mboostLSS}} for more information.} - \item{return}{ a logical indicating whether the changed object is - returned. } - \item{main}{ a title for the plots.} - \item{xlab, ylab}{ x- and y axis labels for the plots.} - \item{pi}{ the level(s) of the prediction interval(s); Per default a - 90\% prediction interval is used.} - \item{lty}{ (vector) of line types to be used for plotting the - prediction intervals. The vector should contain \code{length(pi) + - 1} elements. If less elements are specified, the last element is - recycled. The first value \code{lty[1]} is used for the marginal - median, the second value \code{lty[2]} is used for the \code{pi[1]} - prediction interval, etc.} - \item{lcol}{ (vector) of (line) colors to be used for plotting the - prediction intervals. The vector should contain \code{length(pi) + - 1} elements. If less elements are specified, the last element is - recycled. The first value \code{lcol[1]} is used for the marginal - median, the second value \code{lcol[2]} is used for the \code{pi[1]} - prediction interval, etc.} - \item{log}{ a character string which determines if and if so which - axis should be logarithmic. See \code{\link{plot.default}} for details.} - \item{newdata}{ optional; A data frame in which to look for variables with - which to predict or with which to plot the marginal prediction intervals.} - \item{type}{ the type of prediction required. The default is on the scale - of the predictors; the alternative \code{"response"} is on - the scale of the response variable. Thus for a - binomial model the default predictions are on the log-odds scale - (probabilities on logit scale) and \code{type = "response"} gives - the predicted probabilities. The \code{"class"} option returns - predicted classes.} - \item{weights}{ - a numeric vector of weights for the model - } - \item{oobweights}{ - an additional vector of out-of-bag weights (used internally - by \code{\link[gamboostLSS]{cvrisk}}. For details see there.). - } - \item{risk}{ - a character indicating how the empirical risk should be - computed for each boosting iteration. Per default \code{risk} is set - to the risk type specified for model fitting via - \code{\link{boost_control}}. For details and alternatives see there. - } - \item{trace}{ - a logical triggering printout of status information during the - fitting process. - } - \item{mstop}{ - number of boosting iterations. - } - \item{\dots}{ - Further arguments to the functions. - } -} -\details{ - These functions can be used to extract details from fitted models. For - a tutorial with worked examples see Hofner et al. (2015). - - \code{print} shows a dense representation of the model fit. - - The function \code{coef} extracts the regression coefficients of - linear predictors fitted using the \code{\link{glmboostLSS}} function or - additive predictors fitted using \code{\link{gamboostLSS}}. Per default, - only coefficients of selected base-learners are returned for all - distribution parameters. However, any desired coefficient can be - extracted using the \code{which} argument. Furhtermore, one can - extract only coefficients for a single distribution parameter via the - \code{parameter} argument (see examples for details). - - Analogical, the function \code{plot} per default displays the - coefficient paths for the complete GAMLSS but can be restricted to - single distribution parameters or covariates (or subsets) using the - \code{parameter} or \code{which} arguments, respectively. - - The function \code{predint} (or \code{PI} which is just an alias) - computes marginal prediction intervals and returns a data frame with - the predictors used for the marginal prediction interval, the computed - median prediction and the marginal prediction intervals. A plot - function (\code{plot.predint}) for the resulting object exists. Note - that marginal predictions from AFT models (i.e., families - \code{\link{LogLogLSS}}, \code{\link{LogNormalLSS}}, and - \code{\link{WeibullLSS}}) represent the predicted \dQuote{true} - survival time and not the observed survival time which is possible - subject to censoring. Hence, comparing observed survival times with - the marginal prediction interval is only sensible for uncensored - observations. - - The \code{predict} function can be used for predictions for the - distribution parameters depending on new observations whereas - \code{fitted} extracts the regression fits for the observations in the - learning sample. For \code{predict}, \code{newdata} can be specified - -- otherwise the fitted values are returned. If \code{which} is - specified, marginal effects of the corresponding base-learner(s) are - returned. The argument \code{type} can be used to make predictions on - the scale of the link (i.e., the linear predictor X * beta), the - \code{response} (i.e. h(X * beta), where h is the response function) - or the \code{class} (in case of classification). - - The function \code{update} updates models fit with \pkg{gamboostLSS} - and is primarily used within \code{\link[gamboostLSS]{cvrisk}}. It - updates the weights and refits the model to the altered data. - Furthermore, the type of \code{risk}, the \code{trace} and the number - of boosting iterations \code{mstop} can be modified. - - The function \code{model.weights} is a generic version of the same - function provided by package \pkg{stats}, which is required to make - \code{model.weights} work with \code{mboostLSS} models. - -} - -\section{Warning}{ - The \code{[.mboostLSS} function changes the original object, i.e., - \code{LSSmodel[10]} changes \code{LSSmodel} directly! -} - -\references{ - -B. Hofner, A. Mayr, M. Schmid (2015). gamboostLSS: An R Package for -Model Building and Variable Selection in the GAMLSS Framework. -Journal of Statistical Software. Accepted for publication. - -Available as \code{vignette("gamboostLSS_Tutorial")}. - -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. - -Buehlmann, P. and Hothorn, T. (2007), Boosting algorithms: -regularization, prediction and model fitting. Statistical Science, -22(4), 477--505. - -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, 507-554. - -} - -\seealso{ - - \code{\link{glmboostLSS}}, \code{\link{gamboostLSS}} and - \code{\link{blackboostLSS}} for fitting of GAMLSS. - - Available distributions (families) are documented here: - \code{\link{Families}}. - - See \code{\link[mboost]{methods}} in the \code{mboost} package for the - corresponding methods for \code{\link[mboost]{mboost}} objects. - -} - \examples{ - -### generate data -set.seed(1907) -x1 <- rnorm(1000) -x2 <- rnorm(1000) -x3 <- rnorm(1000) -x4 <- rnorm(1000) -x5 <- rnorm(1000) -x6 <- rnorm(1000) -mu <- exp(1.5 + x1^2 +0.5 * x2 - 3 * sin(x3) -1 * x4) -sigma <- exp(-0.2 * x4 +0.2 * x5 +0.4 * x6) -y <- numeric(1000) -for( i in 1:1000) - y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) -dat <- data.frame(x1, x2, x3, x4, x5, x6, y) - -### fit a model -model <- gamboostLSS(y ~ ., families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 100)) - -\donttest{### Do not test the following line per default on CRAN as it takes some time to run: -### use a model with more iterations for a better fit -mstop(model) <- 400 -} -### extract coefficients -coef(model) - -### only for distribution parameter mu -coef(model, parameter = "mu") - -### only for covariate x1 -coef(model, which = "x1") - - -### plot complete model -par(mfrow = c(4, 3)) -plot(model) -### plot first parameter only -par(mfrow = c(2, 3)) -plot(model, parameter = "mu") -### now plot only effect of x3 of both parameters -par(mfrow = c(1, 2)) -plot(model, which = "x3") -### first component second parameter (sigma) -par(mfrow = c(1, 1)) -plot(model, which = 1, parameter = 2) - -\donttest{### Do not test the following code per default on CRAN as it takes some time to run: -### plot marginal prediction interval -pi <- predint(model, pi = 0.9, which = "x1") -pi <- predint(model, pi = c(0.8, 0.9), which = "x1") -plot(pi, log = "y") # warning as some y values are below 0 -## here it would be better to plot x1 against -## sqrt(y) and sqrt(pi) - -### set model to mstop = 300 (one-dimensional) -mstop(model) <- 300 -### END (don't test automatically) -} - -par(mfrow = c(2, 2)) -plot(risk(model, parameter = "mu")[[1]]) -plot(risk(model, parameter = "sigma")[[1]]) - -\donttest{### Do not test the following code per default on CRAN as it takes some time to run: -### get back to orignal fit -mstop(model) <- 400 -plot(risk(model, parameter = "mu")[[1]]) -plot(risk(model, parameter = "sigma")[[1]]) - -### use different mstop values for the components -mstop(model) <- c(100, 200) -## same as - mstop(model) <- c(mu = 100, sigma = 200) -## or - mstop(model) <- list(mu = 100, sigma = 200) -## or - mstop(model) <- list(100, 200) - -plot(risk(model, parameter = "mu")[[1]]) -plot(risk(model, parameter = "sigma")[[1]]) -### END (don't test automatically) -} -} -\keyword{methods} diff --git a/patch/tests/bugfixes.R b/patch/tests/bugfixes.R deleted file mode 100644 index a6b5e09..0000000 --- a/patch/tests/bugfixes.R +++ /dev/null @@ -1,49 +0,0 @@ -### -# Bugfixes - -require("gamboostLSS") - -## subset method was missing if initial mstop = 1 -set.seed(1907) -x1 <- rnorm(1000) -x2 <- rnorm(1000) -x3 <- rnorm(1000) -x4 <- rnorm(1000) -x5 <- rnorm(1000) -x6 <- rnorm(1000) -mu <- exp(1.5 + x1^2 +0.5 * x2 - 3 * sin(x3) -1 * x4) -sigma <- exp(-0.2 * x4 +0.2 * x5 +0.4 * x6) -y <- numeric(1000) -for( i in 1:1000) - y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) -dat <- data.frame(x1, x2, x3, x4, x5, x6, y) - -model <- gamboostLSS(y ~ ., families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 1)) -model[10] - - -## selected() was broken (didn't call mboost-function) -stopifnot(all.equal(selected(model), - list(mu = mboost::selected(model[[1]]), - sigma = mboost::selected(model[[2]])))) - - -# If the families argument is not specified explicitly in mboostLSSone gets an -# error in cvrisk.mboostLSS() (spotted by Almond Stöcker). -# (https://github.com/boost-R/gamboostLSS/issues/9) -set.seed(1907) -x1 <- rnorm(1000) -mu <- 2*x1 -sigma <- rep(1, 1000) -y <- numeric(1000) -for( i in 1:1000) - y[i] <- rnorm(1, mean = mu[i], sd=sigma[i]) -dat <- data.frame(x1=x1, y=y) -## model with default families -model <- mboostLSS(y ~ bbs(x1), data = dat, control = boost_control(mstop = 2)) -## cvrisk.mboostLSS() does not work as families was not specified in model call -cvr <- try(cvrisk(model, folds = cv(model.weights(model), B=3), trace=FALSE), - silent = TRUE) -if (inherits(cvr, "try-error")) - stop("cvrisk does not work if no family was (explicitly) chosen") diff --git a/pkg/.Rbuildignore b/pkg/.Rbuildignore deleted file mode 100644 index a8ca993..0000000 --- a/pkg/.Rbuildignore +++ /dev/null @@ -1,4 +0,0 @@ -^\..* -vignettes/gamboostLSS_Tutorial.tex -vignettes/auto -vignettes/graphics diff --git a/pkg/.RbuildignoreCRAN b/pkg/.RbuildignoreCRAN deleted file mode 100644 index 521ac08..0000000 --- a/pkg/.RbuildignoreCRAN +++ /dev/null @@ -1,7 +0,0 @@ -tests/.*\.Rout\.save$ -tests/Examples -^\..* -vignettes/gamboostLSS_Tutorial.tex -vignettes/auto -vignettes/graphics -vignettes/.*\.Rout\.save$ diff --git a/pkg/.gitattributes b/pkg/.gitattributes deleted file mode 100644 index 9ac575c..0000000 --- a/pkg/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -* text=auto -data/* binary -src/* text=lf -R/* text=lf \ No newline at end of file diff --git a/pkg/ChangeLog b/pkg/ChangeLog deleted file mode 100644 index a088602..0000000 --- a/pkg/ChangeLog +++ /dev/null @@ -1,891 +0,0 @@ -commit 73b484b0b606df5cdaaaef2cf2287b3a8f2f0521 -Author: Benjamin Hofner - - Release version 1.2-0 - -commit ce8fa96e414af1fe50523370d7749772e1b505f2 -Author: Benjamin Hofner - - Fixed SOPs, .Rbuildignore files and NAMESPACE - -commit b28403bc6c3f22a513bc0a8c84f4542f24c19ac7 -Author: Benjamin Hofner - - Updated vignette - -commit 37009df1109851bf7e663db7a88411dc2d04cdf9 -Author: Benjamin Hofner - - Updated manuals - -commit 5ce03e6c00cc71270981dfffe664f424961d6555 -Author: Benjamin Hofner - - Updated .Rout.save files - -commit 35ccbb1556e6ace00e22d8d08a59f3a05def6b0c -Author: Benjamin Hofner - - Improve calls (close #3) - -commit 873b0d6b272c4669fbfcdba36dfc54899f857cde -Author: Benjamin Hofner - - Added summary function (closes #2) - -commit f1aa58c137beadd068e9584f3ab18fed9a95cead -Author: Benjamin Hofner - - Updated refernce to tutorial (now JSS, accepted) - -commit 3fb38232f52fd9161476cbc03d2df97cc6d9de44 -Author: Benjamin Hofner - - Added tutorial as vignette - -commit 434b351c8bb73c3cead101d295b795efa29b07ec -Author: Benjamin Hofner - - Minor changes to prepare release of gamboostLSS 1.2-0 - -commit 5c38817041b7204c8e68fd2c5f5262ce3ca646e1 -Author: Benjamin Hofner - - Fixed: Duplicated function get_qfun now as generic - -commit 75080ec261783cfcfc1b4de37be9a2589cf14602 -Author: Benjamin Hofner - - Fixed mboost URL and updated references - -commit 7d4a7a005cfddacaf1071ecccdb0df6dda09e660 -Author: Benjamin Hofner - - Adhere to CRAN policies regarding import of base packages (close #1) - -commit 17ced716a73e24d38eec096e88d5a0158c994e59 -Author: Benjamin Hofner - - (DESCRIPTION) Updated link > now points to github - -commit 2378bc83fbf103141b1860bf2fae2f83afdf9c8a -Author: hofner - - Adding github for development - -commit a2d99db4d6c70d86255bcea26f77b6a3c9cebf89 -Author: hofner - - bugfix in stabsel: violations was missing if no violations occured - -commit 4582b2fed6f65438db8aea1e2ab56fb8380f8923 -Author: hofner - - remove stepsize as this does not really result in a speed gain - -commit 70c3cf655ee3154d52f45b825ac60e382d16e26d -Author: hofner - - lots of improvements in stabsel.mboostLSS: - - stabsel now returns status messages per default - - stabsel now returns a warning if mstop is to small to select q variables - - large speed up in the computation of the updates - (used to get slower and slower with increasing mstop) - -commit 6b7858e0eb8e517a67d035130954fc8af7123dca -Author: hofner - - Fixed issue with truncated distributions - -commit 4e0394ce2b1336949046d974bd7e05b5fd4b1fcb -Author: hofner - - increased versions in pkg and patch - -commit f2316868fcbacbe84402638dbae4a4266fa6f2fc -Author: hofner - - merged handling of families with 'Mixed' type to patch - -commit d0bcac4c0f0b128775e1d6e331ea62289bc02185 -Author: hofner - - merged changes from patch to pkg - -commit 110ae2879f282b5372fd7592d0eba35c2a52f309 -Author: hofner - - minor fix in tests - -commit cd90f8962ea6c9638af6c71f690ce2bbb1d0f00f -Author: hofner - - updated documentation of stabilization - -commit 18135422ef31cbfb3ff0215c104cbbc17a0ba19e -Author: hofner - - more tests for novel stabilization interface - -commit 5f5bedba6fcc831240a07cb6638c38e1e36b24d9 -Author: hofner - - fix 'replacing previous import' issue regarding selected - -commit e4e6caec0b342545277dcbd874b311f9a001dbf4 -Author: hofner - - New interface: Stabilization of negative gradient is now specified via families - -commit f6f559c4f4f419ff7a9d4f4c56e54e9bc2e95bad -Author: hofner - - merged changes from patch version to pkg - -commit 216673a30eef357853c3a1b8bde8695b86ba0bd8 -Author: hofner - - stabsel now is able to use argument eval - -commit 39a05601e9481c9f4dee7e7600e03832b70d8f25 -Author: hofner - - minor bug fix for backward compatibility - -commit 5e05740103b6060e593aaccca113d37dde07507b -Author: hofner - - started new version and updated NEWS.Rd - -commit 89ebb33513436a74b1a939f55ea26bcbb77ef340 -Author: hofner - - updated tests for weighted.median - -commit 626ff3b4c29a72693dc94d870b923a8f40edd2a9 -Author: hofner - - Added technical report of tutorial as reference - -commit d268bb83b2d87a6f37d2c6bf06f8d6b22307d203 -Author: hofner - - use weighted median in stabilization - -commit 11f192cb926dbb72ac857e11346e7d0e3eb17435 -Author: hofner - - refactored code: moved standardization to a separate function - -commit 071a53f50f95ae150094fe3eb8d683068720982f -Author: hofner - - Typos - -commit 7354861ad8fa53bb3905daeb14706acab3862f4a -Author: hofner - - Updated release SOPs and scripts - -commit 844f77836d78e7813e40c945d7ddb705cdec6be9 -Author: hofner - - Added weighted median (based on a contribution of Andreas Mayr) - -commit cf0597f6a14c0441249d100a6dff0d780e9b991e -Author: hofner - - updated .Rout.save files to reflect latest changes - -commit 92b15036d60857359435849e2cb0d01ab367d8dd -Author: amayr - - fix again - -commit c669fb0794d087514ba4dcd7034df2008e94fd2e -Author: amayr - - solve problem with selected to pass the test - -commit 81129240db04e88e3b5389b3ea246652a86b5fa6 -Author: amayr - - Fix mixture bug for 3 param families (mail Gert van Dijck) - -commit f89999c9ea7110cd06e751702e5f4dbfff061d66 -Author: hofner - - updated release SOPs - -commit 96c3ee472f1ea48467c3e18d168df02305609bd3 -Author: hofner - - Updated NEWS.Rd, DESCRIPTION and ChangeLog - -commit 21f2c5a7ca1375c33f7b60c13856b7eae600509f -Author: hofner - - changed plain text NEWS to inst/NEWS.Rd - -commit 84afb294825675542d6ebd97179f641ee60cd5df -Author: hofner - - changed reuqire to requireNamespace - and added gamlss.dist:: where necessary - -commit 60c8c3431782308485b0271276b8d15ef1bd1c12 -Author: hofner - - fixed package citation to make CRAN happy - -commit decaddbf64ce1f9c9af399eb9030e4452c23db3b -Author: hofner - - merged changes from pkg/ to patch/ - (excluding stabsel) - -commit cc02dd40db24bf6853d5c3ca7eed2abc92cfab20 -Author: hofner - - Corrected india data set: - stunting ranged from -600 to 600 but should range from -6 to 6 - -commit 95cd54f416d8b244e41ce59824664b07cf52821d -Author: hofner - - Fixed unstated dependencies - -commit ec25906d1f76e921db30c007f01945fcb6f91987 -Author: hofner - - fixed bug in selected.mboostLSS - mboost does no longer export stabsel (only stabsel.mboost is exported), - hence mboost::selected() does not exist - -commit 38ee36db34b413aa2d45fc0c839a3ee38d97d2a2 -Author: hofner - - - added a specialized selected() function for stability selection objects - - fixed classes of a stability selection object for gamboostLSS models - -commit 553da3525e8d7a0c1d71aa0e8dd3edef4a1e9c20 -Author: hofner - - - implemented first version of stability selection - (gamboostLSS therefore now depends on stabs) - -commit 4e8303a655b70c9e6aa3c9043f993aabe6a9bf82 -Author: hofner - - - fixed bug regarding predictions (returned a vector insead of a matrix) - -commit ed5a79ce77e94aa23c94a9b4b8e2fc6ded1b343e -Author: hofner - - - Bugfix in predint: factors were coerced to characters - -commit 1026103b53c4d88714efe8fbebc5f55c6ba8ba26 -Author: hofner - - RELEASE VERSION gamboostLSS 1.1-2 - - make mboost 2.3-0 happy (by adding Suggests: survival) - - make tests platform independent - - removed generic risk function (which is available in mboost >= 2.3-0) - - improved checking of responses - -commit 07457d51953aaedf3d09aeca8aa301a56ef7b4ab -Author: hofner - - updated patch version (now synced with pkg) - -commit 6ccaa8a9ec38bb02dd8ceb5e57ed6eefd2afc426 -Author: hofner - - RELEASE VERSION gamboostLSS 1.1-1 - - re-added tests - - changed \dontrun to \donttest in examples - -commit 9a76bf672e9127111e393a8a8a9ac901697f3e6d -Author: hofner - - SECOND TRY: RELEASE VERSION gamboostLSS 1.1-0 - -commit 86b30c61176aaa2ff4ba6c51e502ce2b8cd25cec -Author: hofner - - RELEASE VERSION gamboostLSS 1.1-0 - -commit d43ae992fdb85af3c332ab12ee202d6e5568f3d9 -Author: hofner - - - changed default color of marginal prediction intervals to black - -commit 20e8ad1c4362d9b8ecd3948041de468ae4cc9d5c -Author: hofner - - - added qXXX functions for AFT models - -commit 9c280c380b75dd826c344c89fe553a285f14b128 -Author: hofner - - - marginal prediction intervals: - * added function to compute marginal PIs (predint) - * replaced plot_PI with plot(predint()) - - improved manual for methods - -commit f35547b38c0ad1bb4004d5327477412e11c5681d -Author: hofner - - - families: - * included some more quantile functions (needed for plot_PI) - * improved checks for outcome variable - - plot: - * fixed lattice plot (for bivariate effects) - - manuals: - * restructured families in groups - * improved documentation of gamboostLSS_stab_ngrad, - which can be used to stabilize the negative gradient - -commit 2dbe28ea16925848d89589c96186263b555473b5 -Author: hofner - - - made GaussianLSS the default family - - bugfix in internal qNormal function - -commit 93ed2f603d9604655177b7d2e139a9ed69e563c4 -Author: hofner - - - improved as.families: User can now also specify - fname as function or evaluated function - - plot_PI now potentially works for all families - - added qfun to (most of the) families which - is required for plot_PI - - moved some helper functions to helpers.R - - improvements in manuals - -commit 2c60a7298205302d5dbf9935045f757507e645d4 -Author: hofner - - - added experimental version of marginal prediction plot - (plot_PI; currently only implemented for GaussianLSS models) - -commit 71ec08a73ec3b94e933f1cd420b91fb11318dd30 -Author: hofner - - - fixed problem with subset method (mstop-names were ignored) - - started experimental version for marginal prediction interval plots - -commit 90af9885efcf97b20b5c36c5abd31fae33994739 -Author: hofner - - - renamed Families.gamlss to as.families - (an kept gamlss.Families for compatibility with PhD thesis of A. Mayr) - - stabilization factor: - * changed stabilization factor to median absolute deviation for all families - (and added the factor to the families where it was missing) - * introduced a minimal documentation of the options command needed to swith - stabilization on or off to all family manuals - - data(india): - * renamed distH to mcdist - * added variable (mcdist_lab) containing the district names - - (renamed files gamlss.Families.Rd and gamlss.Families.R) - -commit cc9959150a75062bbd5b54413e569e9eb9480c25 -Author: hofner - - - cross-validation: - * improved speed when dense_mu_grid = TRUE is used - (now there is really no increased run time with this arument) - * improved plot function for cvriskLSS objects - * added documentation for plot function - - stabilization: changed factor to median absolute deviation - (currently only in GaussianLSS()) - - additional minor changes in manuals - -commit 0307241ae7723ee2a636ee4337fe5f8af5792a4e -Author: hofner - - - included stability correction for GaussianLSS() - - added new (experimental) plot for results from cvrisk - - layout improvements and minor corrections in the manual - -commit f819446aa83c912d24648fa19a870c2138eb53fe -Author: hofner - - - added option dense_mu_grid to make.grid - - mstop values can now also be specified as vectors - (with and without names) - - improved manuals - - some improvements in code layout and (internal) variable names - -commit 85df026b5ba0f11463ed9e4b9237a7e47708e4a3 -Author: hofner - - - added india data set - -commit 4a08289b0bad16167881d5fa90e59a5e3bf6f4f3 -Author: amayr - - included stability correction for Families.gamlss - -commit 2d5296d049dca087ec2d5222dc2ee1a699f3bb52 -Author: hofner - - - removed unneeded dependencies - - some code cleaning - -commit 30795bf9ee52a80f3348406afce348e476d40963 -Author: hofner - - - fix: speed of model fitting was dependent on iteration, - i.e. the algorithm got slower for larger mstop values - (to really fix speed problem mboost >= revision 754 needed) - - changed email address - -commit 9f0d6881f6395694811d4c5c87522fe1408c8a4a -Author: hofner - - - fixed offset in NBinomialMu wrt the computation of sigma - (divide by var(y) and introduce lower positive limit if sigma gets negative) - -commit 815ff2da0a9c2e8062eac913c0677d732ad31646 -Author: hofner - - added ChangeLogs - -commit 4a17e2c86a4a039b099cbdb6989a95cc270b08fe -Author: hofner - - experimental: added a new global option options("gamboostLSS_stab_ngrad") to stabilize estimation - -commit 370a0d962f4e1fb9867fb5adc002c9345f594d2a -Author: hofner - - require mboost >= 2.2-3 to make cvrisk happy - -commit afb50a174f1758eaa7913020f3bd36a7b16e5521 -Author: hofner - - added manual for cvrisk - bug fixes in cvrisk (and related functions) - minor fixes in manuals - -commit e2baec9cd540df201a65963b59c398b03dde7d8c -Author: schmidm - - added wrapper functions for zero-inflated models - -commit 9ce2a8525ef2847388e6d697fa4deacb74b72113 -Author: hofner - - added cvrisk functions - -commit 9d56e875beea68ecb706e652248bb83b257cc122 -Author: hofner - - added manual for cvrisk and related methods - minor changes in code - -commit 572b6248a6ce6fff260ab31a925fcb41f3eb66aa -Author: hofner - - added first version of cvrisk function for mboostLSS models - documentation etc. still needs to be fixed - -commit db3363bb756f3d213d79105237dc37ecb7f10fab -Author: hofner - - make update function work correctly (w.r.t. offset handling) - make GausianLSS work with weighted offsets - -commit 961cdd54130b5745db8db2f196abcb4d5012e633 -Author: amayr - - changed name of gamlss.Families to Families.gamlss - -commit 4ce47629b9c689ec568dc4ca208e30734ac506c5 -Author: amayr - - changed name of gamlss.Families to Families.gamlss - -commit b8dc9d457caa1b51ed2cb86922de7158af3d5472 -Author: amayr - - changed name of gamlss.Families to Families.gamlss - -commit 324d8e3d698b7346d2f34ba233662594a7ae6f36 -Author: amayr - - changed name of gamlss.Families to Families.gamlss - -commit 804785daebb64a3b3712f29a925e37464d95b1f4 -Author: amayr - - changed name of gamlss.Families to Families.gamlss - -commit 5927c13c196ce9c25488ca3577dfbe95f669d1c5 -Author: amayr - - changed name of gamlss.Families to Families.gamlss - -commit 2aebf5a5faf50a18a6aafae50caa023bbfeef28c -Author: amayr - - fixed citation - -commit e7354054136808155151dca9bd5e7ce08dbe9b8b -Author: hofner - - changed interface - preparations for cvrisk function - -commit cce73e86a0aec12944d97ff8645f416471566be4 -Author: amayr - - adding gamlss.Families - -commit 7b1ded16abb310c38afdca6eb308afde8713f175 -Author: amayr - - adding gamlss.Families - -commit eaf49d3de4596323c2d067c066a40c13dae12df7 -Author: amayr - - adding gamlss.Families - -commit bf1880e1b5c3d0045213c0a78a45075d03b80b0f -Author: amayr - - adding gamlss.Families - -commit 19eea4281bb25aac4970b9bd5b390a024891fd6b -Author: amayr - - adding gamlss.dist to suggested + cosmetics - -commit 9883b996c5e0b0b52413be3a9b8ef57e130fa0b4 -Author: amayr - - cosmetics - -commit ac4e22738853ce2a04e4753eb799635c835dcca6 -Author: amayr - - cleanup + cosmetics - -commit c6d03df2597b7e0bf251d298e7f79bdd4f64af31 -Author: amayr - - cleanup + cosmetics - -commit d02ecf602934a077667b2ec1680095feff96f8ae -Author: amayr - - updating citation of Applied Statistics article - -commit 88f775672c10dd9c14dd399f3514993a2013427e -Author: amayr - - updating citation of Applied Statistics article - -commit aa03b8f07338574c51cb0ee01e8b7a52b6dc4f69 -Author: amayr - - adding BetaLSS - -commit dd8ccd516c86e0cac33f0b9f114f6ba397250f58 -Author: amayr - - adding BetaLSS - -commit ca1e90348427795f63ef3855134f527c93b073da -Author: amayr - - adding BetaLSS - -commit 07e71f8da9a5ff816989230515b60d9242f3c359 -Author: amayr - - adding BetaLSS - -commit e8cae4ed83dad9a831d895b4edfc216ad91230dd -Author: amayr - - adding BetaLSS - -commit 71fc1f0ee233bb6923e313fd779cff37e3cc014a -Author: amayr - - adding BetaLSS - -commit 66f95685690f38691600d9fff96488d6797b3679 -Author: hofner - - ping - -commit 9ebf29d506da49e06d9470ecdbc6b275041fd3ef -Author: hofner - - fixed links to CHANGES - -commit 2177f34ed75a42a4572c8cf9757bc355933c23bc -Author: hofner - - gamboostLSS 1.0-3 - - fixed potential problem that might occur if users specify different outcomes for different components - - updated tests - -commit b8e7bdf08c2fe9ac79ff3a497d475792af5a705d -Author: hofner - - - fixed bug in regtest-gamboostLSS.R - - removed duplicated (and slightly altered) code from mboost - (gamboostLSS now requires mboost >= 2.0-12) - -commit 2447ee7af974f0240454ff0c57199348f5f25364 -Author: hofner - - added v. 1.0-2 to folder patch for patch updates (pkg contains minor / major updates) - -commit 8ac2e3f6ed36d659236bba881f38edf31c30730b -Author: hofner - - start 1.1-0 - -commit 17b0910480013c73c74a6b39243cd651e87d99e9 -Author: amayr - - updating NAMESPACE for GammaLSS - -commit a1820c422c016f5241f3d2085be14a973d9d80af -Author: amayr - - Updating CHANGES due to GammaLSS - -commit 5cbaaa04605b729c11578aa95da4af74cb71c017 -Author: amayr - - Updating manual for GammaLSS - -commit cfd055a617b3f38d0fb55a45500196a9ddf9cabd -Author: amayr - - updating NAMESPACE for GammaLSS - -commit 4e93767d1dce561b5dab542a871910f3b62269f3 -Author: amayr - - Updating manual for GammaLSS - -commit 429aedda17552025255afa74d4425d018f4b38e9 -Author: amayr - - Adding new GammaLSS family - -commit 3f6e4e057eba532df0fed0a61683c5d335360621 -Author: hofner - - make mboost happy again - -commit 31a062c128d41424fe79370c3bdae5fabaf81bb9 -Author: amayr - - new family added to NAMESPACE + minor fixes - -commit 14c769ac2da3e737b2d87bdde32d06eb236390bf -Author: amayr - - update manual due to GaussianLSS - -commit 7349637caf2b5acb187c56bbdaec3368ee11592b -Author: amayr - - Implement GaussianLSS to fit mu and sigma in a Gaussian setting - -commit 0624287cc254ad11d4b7ead5868429de9819be32 -Author: hofner - - changed the way we use environments (to get rid of note: no visible binding) - -commit 1d953bb81b4f0f7a67fd45eafb5f5aa6b1a06143 -Author: hofner - - version 1.0-1 - -commit fe8e528c92529edb6e2f1c52c62b6ebfa97768dc -Author: hofner - - version 1.0-1 - -commit 8e0e736232ff159e4880522cbb6ebd7ea074ef10 -Author: hofner - - version 1.0-0 - -commit 42a5915e9ced0a6562fac0a76e45c58592a59302 -Author: hofner - - version 1.0-0 - -commit e0dc5c329085ba4ee87b2a6a4a4c7a1eb0724cb7 -Author: amayr - - minor changes by NF - -commit d37deb2fe3a430dace0da68a92c81fe434c31500 -Author: amayr - - minor changes by NF - -commit 6410d78cb8efff4379c52862e2c859089fa01dfc -Author: amayr - - minor changes by NF - -commit e8cbaf0c069d8fc7cfec4f27b909bfb3f4613d3a -Author: amayr - - minor changes by NF - -commit eb9b119120257f429c86ce0dfc6850644e2b9021 -Author: amayr - - git-svn-id: svn+ssh://svn.r-forge.r-project.org/svnroot/gamboostlss@26 edb9625f-4e0d-4859-8d74-9fd3b1da38cb - -commit 42a87280ea0755c181448b9c4308c747c39e8c13 -Author: hofner - - typo - -commit af762be9dd5d83b0afa4030b4a6a806ec14838d9 -Author: schmidm - - minor changes to documentation files - -commit ca339a6ab31ec232027caa13074acf82f5513bbb -Author: hofner - - git-svn-id: svn+ssh://svn.r-forge.r-project.org/svnroot/gamboostlss@23 edb9625f-4e0d-4859-8d74-9fd3b1da38cb - -commit 4224669651247537f7308ba0e51a76fc8d5356cf -Author: amayr - - delete obsolete help-file - -commit 0a16355dd858f7c8f1c4795ddc4e4cd94acb5932 -Author: amayr - - Major changes to the help files - -commit fe9fd4c4ed9f9ad3e5e985a4d2e7cef1facf926f -Author: hofner - - renamed makeFamilies() to Families() - -commit 306e10e6ff80fb25b1611fd00eabccdeafc3c27a -Author: amayr - - small changes - -commit eb0f54152772fab281f66d869dc1a85a04445ff3 -Author: hofner - - AM: some changes in manuals - -commit 59357625a68ef480a51ace472270180f84da6be2 -Author: hofner - - bugfix: no subset method available if initial mstop = 1 - changed generic function selected - -commit 5f3f16ef01b2cdafa0ec3ae279a89627f04702d1 -Author: hofner - - improved manual - added some tests - -commit 3200efd5557a8a597e0b48bb6bf17d1935ced9ac -Author: hofner - - changed behavior of subset method (now smarter) - added new tests - -commit fca9035a62947c9dab3964fafc86148f33827c24 -Author: hofner - - changes in callies (now specify arguments explicitly instead of using "...") - added predict function - -commit 506b8de42df2717c95247a7a8cfbbabaf006de49 -Author: hofner - - added support for mulitple nu values - bugfix in subset method - -commit 0de5d63a9011e10214f8a74a24775c1aabff9f6e -Author: hofner - - added support for multiple mstops - added function fitted() to extract fitted values - changed behaviour of mstop (now returns a named vector) - added new checks - -commit 08890a483d9e7d01eb541b6526c4b82792dfee79 -Author: hofner - - fixed problem with internal call of glmboost() - added and improved plot methods for glmboostLSS und gamboostLSS models - added print method - -commit 8a041a86a994d3bd35d44a0547af5f654c4bc967 -Author: hofner - - fixed: ngradient of StudentTSigma family - -commit 2b46bdc0f853848f91ea6e21b523a189b1b1758a -Author: hofner - - fixed: now some (or all) parameters of a family can be initiated with an offset - -commit df4e9a0baf6d8a22a7b486131ebe5c00d0db5220 -Author: hofner - - corrected AFT families - included manuals for AFT families - renamed crtl --> control in mboostLSS_fit() - other minor changes - -commit a76c5edc750716b5fd4b19613641998261d28bd1 -Author: hofner - - added families to fit AFT models - -commit 1668429b59e63e38ff02fd681cfaca0a91b40029 -Author: hofner - - offset per default computed by minimizing the risk function per component - plot.glmboostLSS enhanced - -commit 8444f2b4bdc5c4aca3bac82752d6c07868320562 -Author: hofner - - familes changed (defaults, usage of offset values, ...) - documentation added - -commit 06daaa5afc09ff92561cc5b7dc3b8c4c9d632ee5 -Author: hofner - - tests added - -commit f2c6058c02df9fd7e89161db3e33b4a970140a1d -Author: hofner - - formula can now be a (named) list - subset now also able to increase mstop - some helpers added - -commit 2282cd73c2a925cd92fcc7689b344e77385986b2 -Author: hofner - - initial version diff --git a/pkg/R/AAA.R b/pkg/R/AAA.R deleted file mode 100644 index 2692bd9..0000000 --- a/pkg/R/AAA.R +++ /dev/null @@ -1,5 +0,0 @@ -.onLoad <- function(libname, pkgname) { - ### stabilize negative gradient by using a multiplicative factor based on - ### the variance of the negative gradient - options(gamboostLSS_stab_ngrad = FALSE) -} diff --git a/pkg/R/as.families.R b/pkg/R/as.families.R deleted file mode 100755 index f490da1..0000000 --- a/pkg/R/as.families.R +++ /dev/null @@ -1,505 +0,0 @@ - -################################################################################ -### Family wrapper for gamlss families - -## to use stability correction for gradients -## please set -## options(gamboostLSS_stab_ngrad = TRUE) - - - -################################################################################ -## constructor - -## a wrapper to as.families (for compatibility reasons -gamlss.Families <- function(...) - as.families(...) - -as.families <- function(fname = "NO", - mu = NULL, sigma = NULL, nu = NULL, tau = NULL, - stabilization = c("none", "MAD")) { - - ## require gamlss.dist - if (!requireNamespace("gamlss.dist", quietly = TRUE)) - stop("Please install package 'gamlss.dist' for using gamlss families.") - - if (is.function(fname)) - fname <- fname() - - if (inherits(fname, "gamlss.family")) - fname <- fname$family[1] - - if (mode(fname) != "character" && mode(fname) != "name") - fname <- as.character(substitute(fname)) - - gamlss.fam <- try(gamlss.dist::gamlss.family(fname), silent = TRUE) - if (inherits(gamlss.fam, "try-error")) - stop(sQuote("fname"), " specifies no valid gamlss family") - - stabilization <- check_stabilization(stabilization) - - npar <- gamlss.fam$nopar - switch(npar, { - ## 1 parameter - fun <- gamlss1parMu(mu = mu, fname = fname) - warning("For boosting one-parametric families,", - " please use the mboost package.") - if (stabilization != "none") - warning("Stabilization is ignored for one-parametric families.") - }, { - ## 2 parameters - fun <- gamlss2parFam(mu = mu, sigma = sigma, - stabilization = stabilization, fname = fname) - }, { - ## 3 parameters - fun <- gamlss3parFam(mu = mu, sigma = sigma, nu = nu, - stabilization = stabilization, fname = fname) - }, { - ## 4 parameters - fun <- gamlss4parFam(mu = mu, sigma = sigma, nu = nu, tau = tau, - stabilization = stabilization, fname = fname) - }) - fun -} - - -################################################################################ -## 1 parameter - -gamlss1parMu <- function(mu = NULL, fname = "EXP") { - - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - dfun <- paste("gamlss.dist::d", fname, sep = "") - pdf <- eval(parse(text = dfun)) - - ## get the loss - loss <- function(y, f, w = 1) { - -pdf(x = y, mu = FAM$mu.linkinv(f), log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f)) - } - ## get the ngradient: mu is linkinv(f) - ## we need dl/deta = dl/dmu*dmu/deta - ngradient <- function(y, f, w = 1) { - FAM$dldm(y = y, mu = FAM$mu.linkinv(f)) * FAM$mu.dr(eta = f) - } - - ## get the offset -> we take the starting values of gamlss - offset <- function(y, w = 1) { - if (!is.null(mu)) { - RET <- FAM$mu.linkfun(mu) - } else { - eval(FAM$mu.initial) - RET <- FAM$mu.linkfun(mean(mu)) - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$mu.linkinv(f), offset = offset, - name = paste(FAM$family[2], "(mboost family)")) -} - - -################################################################################ -## 2 parameters - -gamlss2parMu <- function(mu = NULL, sigma = NULL, - stabilization, fname = "NO") { - - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, sigma, w = 1) { - -pdf(x = y, mu = FAM$mu.linkinv(f), sigma = sigma, log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, sigma = sigma)) - } - - ## get the ngradient: mu is linkinv(f) - ## we need dl/deta = dl/dmu*dmu/deta - ngradient <- function(y, f, w = 1) { - ngr <- FAM$dldm(y = y, mu = FAM$mu.linkinv(f), sigma = sigma) * FAM$mu.dr(eta = f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - - ## get the offset -> we take the starting values of gamlss - offset <- function(y, w = 1) { - if (!is.null(mu)) { - RET <- FAM$mu.linkfun(mu) - } else { - eval(FAM$mu.initial) - RET <- FAM$mu.linkfun(mean(mu)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$mu.linkinv(f), offset = offset, - name = paste(FAM$family[2], "1st parameter (mu)")) -} - - -gamlss2parSigma <- function(mu = NULL, sigma = NULL, - stabilization, fname = "NO") { - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, w = 1, mu) { - -pdf(x = y, mu = mu, sigma = FAM$sigma.linkinv(f), log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu)) - } - ## get the ngradient: sigma is linkinv(f) - ## we need dl/deta = dl/dsigma*dsigma/deta - ngradient <- function(y, f, w = 1) { - ngr <- FAM$dldd(y = y, mu = mu, sigma = FAM$sigma.linkinv(f)) * FAM$sigma.dr(eta = f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - ## get the offset - offset <- function(y, w = 1) { - if (!is.null(sigma)) { - RET <- FAM$sigma.linkfun(sigma) - } else { - eval(FAM$sigma.initial) - RET <- FAM$sigma.linkfun(mean(sigma)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$sigma.linkinv(f), offset = offset, - name = paste(FAM$family[2], "2nd parameter (sigma)")) -} - -## Build the Families object -gamlss2parFam <- function(mu = NULL, sigma = NULL, stabilization, fname = "NO") { - Families(mu = gamlss2parMu(mu = mu, sigma = sigma, stabilization, fname = fname), - sigma = gamlss2parSigma(mu = mu, sigma = sigma, stabilization, fname = fname), - qfun = get_qfun(fname), - name = fname) -} - -################################################################################ -## 3 parameters - -## sub-family for Mu -gamlss3parMu <- function(mu = NULL, sigma = NULL, nu = NULL, - stabilization, fname = "TF") { - - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, sigma, nu, w = 1) { - -pdf(x = y, mu = FAM$mu.linkinv(f), sigma = sigma, nu = nu, log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, sigma = sigma, nu = nu)) - } - ## get the ngradient: mu is linkinv(f) - ## we need dl/deta = dl/dmu*dmu/deta - ngradient <- function(y, f, w = 1) { - if (FAM$type == "Mixed") { - ngr <- FAM$dldm(y = y, mu = FAM$mu.linkinv(f), sigma = sigma) * FAM$mu.dr(eta = f) - } else { - ngr <- FAM$dldm(y = y, mu = FAM$mu.linkinv(f), sigma = sigma, nu = nu) * FAM$mu.dr(eta = f) - } - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - - ## get the offset -> we take the starting values of gamlss - offset <- function(y, w = 1) { - if (!is.null(mu)) { - RET <- FAM$mu.linkfun(mu) - } else { - eval(FAM$mu.initial) - RET <- FAM$mu.linkfun(mean(mu)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$mu.linkinv(f), offset = offset, - name = paste(FAM$family[2], "1st parameter (mu)")) -} - - -gamlss3parSigma <- function(mu = NULL, sigma = NULL, nu = NULL, - stabilization, fname = "TF") { - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, w = 1, mu, nu) { - -pdf(x = y, mu = mu, sigma = FAM$sigma.linkinv(f), nu = nu, log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu, nu = nu)) - } - ## get the ngradient: sigma is linkinv(f) - ## we need dl/deta = dl/dsigma*dsigma/deta - ngradient <- function(y, f, w = 1) { - if (FAM$type == "Mixed") { - ngr <- FAM$dldd(y = y, mu = mu, sigma = FAM$sigma.linkinv(f)) * FAM$sigma.dr(eta = f) - } else { - ngr <- FAM$dldd(y = y, mu = mu, sigma = FAM$sigma.linkinv(f), nu = nu) * FAM$sigma.dr(eta = f) - } - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - ## get the offset - offset <- function(y, w = 1) { - if (!is.null(sigma)) { - RET <- FAM$sigma.linkfun(sigma) - } else { - eval(FAM$sigma.initial) - RET <- FAM$sigma.linkfun(mean(sigma)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$sigma.linkinv(f), offset = offset, - name = paste(FAM$family[2], "2nd parameter (sigma)")) -} - -gamlss3parNu <- function(mu = NULL, sigma = NULL, nu = NULL, - stabilization, fname = "TF") { - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, w = 1, mu, sigma) { - -pdf(x = y, mu = mu, sigma = sigma, nu = FAM$nu.linkinv(f), log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu, sigma = sigma)) - } - ## get the ngradient: sigma is linkinv(f) - ## we need dl/deta = dl/dsigma*dsigma/deta - ngradient <- function(y, f, w = 1) { - if (FAM$type == "Mixed") { - ngr <- FAM$dldv(y = y, nu = FAM$nu.linkinv(f)) * FAM$nu.dr(eta = f) - } else { - ngr <- FAM$dldv(y = y, mu = mu, sigma = sigma, nu = FAM$nu.linkinv(f)) * FAM$nu.dr(eta = f) - } - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - ## get the offset - offset <- function(y, w = 1) { - if (!is.null(nu)) { - RET <- FAM$nu.linkfun(nu) - } else { - eval(FAM$nu.initial) - RET <- FAM$nu.linkfun(mean(nu)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$nu.linkinv(f), - offset = offset, name = paste(FAM$family[2], "3rd parameter (nu)")) -} - -## Build the Families object -gamlss3parFam <- function(mu = NULL, sigma = NULL, nu = NULL, stabilization, fname = "TF") { - Families(mu = gamlss3parMu(mu = mu, sigma = sigma, nu = nu, stabilization, fname = fname), - sigma = gamlss3parSigma(mu = mu, sigma = sigma, nu = nu, stabilization, fname = fname), - nu = gamlss3parNu(mu = mu, sigma = sigma, nu = nu, stabilization, fname = fname), - qfun = get_qfun(fname), - name = fname) -} - - -################################################################################ -## 4 parameters - -gamlss4parMu <- function(mu = NULL, sigma = NULL, nu = NULL, tau = NULL, - stabilization, fname = "BCPE") { - - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, sigma, nu, tau, w = 1) { - -pdf(x = y, mu = FAM$mu.linkinv(f), sigma = sigma, nu = nu, tau = tau, log = TRUE) - } - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, sigma = sigma, nu = nu, tau = tau)) - } - ## get the ngradient: mu is linkinv(f) - ## we need dl/deta = dl/dmu*dmu/deta - ngradient <- function(y, f, w = 1) { - ngr <- FAM$dldm(y = y, mu = FAM$mu.linkinv(f), sigma = sigma, nu = nu, tau = tau) * - FAM$mu.dr(eta = f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - ## get the offset -> we take the starting values of gamlss - offset <- function(y, w = 1) { - if (!is.null(mu)) { - RET <- FAM$mu.linkfun(mu) - } else { - eval(FAM$mu.initial) - RET <- FAM$mu.linkfun(mean(mu)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$mu.linkinv(f), offset = offset, - name = paste(FAM$family[2], "1st parameter (mu)")) -} - - -gamlss4parSigma <- function(mu = NULL, sigma = NULL, nu = NULL, tau = NULL, - stabilization, fname = "BCPE") { - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, w = 1, mu, nu, tau) { - -pdf(x = y, mu = mu, sigma = FAM$sigma.linkinv(f), nu = nu, tau = tau, - log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu, nu = nu, tau = tau)) - } - ## get the ngradient: sigma is linkinv(f) - ## we need dl/deta = dl/dsigma*dsigma/deta - ngradient <- function(y, f, w = 1) { - ngr <- FAM$dldd(y = y, mu = mu, sigma = FAM$sigma.linkinv(f), nu = nu, - tau = tau) * FAM$sigma.dr(eta = f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - ## get the offset - offset <- function(y, w = 1) { - if (!is.null(sigma)) { - RET <- FAM$sigma.linkfun(sigma) - } else { - eval(FAM$sigma.initial) - RET <- FAM$sigma.linkfun(mean(sigma)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$sigma.linkinv(f), offset = offset, - name = paste(FAM$family[2], "2nd parameter (sigma)")) -} - -gamlss4parNu <- function(mu = NULL, sigma = NULL, nu = NULL, tau = NULL, - stabilization, fname = "BCPE") { - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, w = 1, mu, sigma, tau) { - -pdf(x = y, mu = mu, sigma = sigma, nu = FAM$nu.linkinv(f), tau = tau, - log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu, sigma = sigma, tau = tau)) - } - ## get the ngradient: sigma is linkinv(f) - ## we need dl/deta = dl/dsigma*dsigma/deta - ngradient <- function(y, f, w = 1) { - ngr <- FAM$dldv(y = y, mu = mu, sigma = sigma, nu = FAM$nu.linkinv(f), - tau = tau) * FAM$nu.dr(eta = f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - ## get the offset - offset <- function(y, w = 1) { - if (!is.null(nu)) { - RET <- FAM$nu.linkfun(nu) - } else { - eval(FAM$nu.initial) - RET <- FAM$nu.linkfun(mean(nu)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$nu.linkinv(f), offset = offset, - name = paste(FAM$family[2], "3rd parameter (nu)")) -} - - - -gamlss4parTau <- function(mu = NULL, sigma = NULL, nu = NULL, tau = NULL, - stabilization, fname = "BCPE") { - FAM <- gamlss.dist::as.gamlss.family(fname) - NAMEofFAMILY <- FAM$family - pdf <- get_pdf(fname) - - ## get the loss - loss <- function(y, f, w = 1, mu, sigma, nu) { - -pdf(x = y, mu = mu, sigma = sigma, nu = nu, tau = FAM$tau.linkinv(f), - log = TRUE) - } - - ## compute the risk - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu, sigma = sigma, nu = nu)) - } - ## get the ngradient - ngradient <- function(y, f, w = 1) { - ngr <- FAM$dldt(y = y, mu = mu, sigma = sigma, tau = FAM$tau.linkinv(f), - nu = nu) * FAM$tau.dr(eta = f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - ngr - } - ## get the offset - offset <- function(y, w = 1) { - if (!is.null(tau)) { - RET <- FAM$tau.linkfun(tau) - } else { - eval(FAM$tau.initial) - RET <- FAM$tau.linkfun(mean(tau)) - } - return(RET) - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) FAM$tau.linkinv(f), offset = offset, - name = paste(FAM$family[2], "4th parameter (tau)")) -} - -## Build the Families object -gamlss4parFam <- function(mu = NULL, sigma = NULL, nu = NULL, tau = NULL, stabilization, fname = "BCPE") { - Families(mu = gamlss4parMu(mu = mu, sigma = sigma, nu = nu, tau = tau, stabilization, fname = fname), - sigma = gamlss4parSigma(mu = mu, sigma = sigma, nu = nu, tau = tau, stabilization, fname = fname), - nu = gamlss4parNu(mu = mu, sigma = sigma, nu = nu, tau = tau, stabilization, fname = fname), - tau = gamlss4parTau(mu = mu, sigma = sigma, nu = nu, tau = tau, stabilization, fname = fname), - qfun = get_qfun(fname), - name = fname) -} diff --git a/pkg/R/cvrisk.R b/pkg/R/cvrisk.R deleted file mode 100644 index 5ecf8fd..0000000 --- a/pkg/R/cvrisk.R +++ /dev/null @@ -1,369 +0,0 @@ -################################################################### -## cross-validation (bootstrap, k-fold cv etc.) of empirical risk -## for boosting algorithms for gamLSS models - -make.grid <- function(max, length.out = 10, min = NULL, log = TRUE, - dense_mu_grid = TRUE) { - - if (is.null(min)) - min <- rep(1, length(max)) - if (length(min) == 1) - min <- rep(min, length(max)) - if (length(length.out) == 1) - length.out <- rep(length.out, length(max)) - if (length(length.out) != length(max)) - stop(sQuote("length.out"), - " must be either scalar or a vector of the same length as ", - sQuote("max")) - if (length(min) != length(max)) - stop(sQuote("min"), - " must be either scalar or a vector of the same length as ", - sQuote("max")) - - if (log == TRUE) { - min <- log(min) - max <- log(max) - } - - if (any(sapply(1:length(max), function(i) min[i] >= max[i]))) - stop("All min values must be smaller than the respectiv max value.") - - ## single paramter family - if (length(max) == 1) { - RET <- seq(from = min, to = max, length.out = length.out) - if (log == TRUE) - RET <- exp(RET) - ## round to get integer values - RET <- round(RET) - if (any(duplicated(RET))) { - warning("Duplicates produced; Only unique values are returned") - RET <- unique(RET) - } - return(RET) - } - - ## ELSE: multiple parameter family - - if (is.null(names(max))) - stop(sQuote("max"), " must be a named vector") - - RET <- lapply(1:length(max), function(i) - seq(from = min[i], to = max[i], - length.out = length.out[i])) - if (log == TRUE) - RET <- lapply(RET, exp) - ## round to get integer values - RET <- lapply(RET, round) - - if (any(sapply(RET, function(x) any(duplicated(x))))) { - warning("Duplicates produced; Only unique values are returned") - RET <- lapply(RET, unique) - } - ## make grid - RET <- expand.grid(RET) - if (!is.null(names(max))) - colnames(RET) <- names(max) - - ## no way to produce dense grid - if (dense_mu_grid && max(RET[,1]) <= min(RET[, -1])) - dense_mu_grid <- FALSE - - ## if dense grid for mu is requested: - if (dense_mu_grid) { - ## find all grid points where at least one mu grid point is greater than - ## all other parameters - tmp <- RET[RET[, 1] > apply(RET[, -1, drop = FALSE], 1, max), ] - tmp <- unique(tmp[, -1, drop = FALSE]) - ## for these values produce a dense grid - stop <- max(RET[, 1]) - for (i in 1:nrow(tmp)) { - start <- max(tmp[i, ]) - res <- suppressWarnings(cbind(seq(start, to = stop, by = 1), tmp[i, ])) - colnames(res) <- colnames(RET) - RET <- rbind(RET, res) - } - RET <- unique(RET) - ## SORT THE GRID AND THEN CONTINUE IN cvrisk BY checking if - ## grid[, 1] >= grid[, -1] && ??? - RET <- RET[do.call(order, RET[, rev(colnames(RET))]), ] - # RET <- RET[order(RET[,2], RET[,1]), ] - rownames(RET) <- NULL - } - attr(RET, "dense_mu_grid") <- dense_mu_grid - return(RET) -} - -### -# cvrisk, adapted version from mboost (2.2-2) -cvrisk.mboostLSS <- function(object, folds = cv(model.weights(object)), - grid = make.grid(mstop(object)), - papply = mclapply, trace = TRUE, - fun = NULL, ...) { - - weights <- model.weights(object) - if (any(weights == 0)) - warning("Zero weights in ", sQuote("object")) - if (is.null(folds)) { - folds <- rmultinom(25, length(weights), weights/sum(weights)) - } else { - stopifnot(is.matrix(folds) && nrow(folds) == length(weights)) - } - if (length(object) != ncol(grid)) - stop(sQuote("grid"), - " must be a matrix with the same number of columns", - " as parameters in", sQuote("object")) - - if (!is.null(fun)) - stopifnot(is.function(fun)) - - ### WHAT ABOUT: - ## fam_name <- object$family@name - call <- deparse(attr(object, "call")) - oobrisk <- matrix(0, nrow = ncol(folds), ncol = ncol(grid)) - if (!is.null(attr(grid, "dense_mu_grid"))) { - dense_mu_grid <- attr(grid, "dense_mu_grid") - } else { - dense_mu_grid <- FALSE - } - if (trace) - cat("Starting cross-validation...\n", - "[fold]\t[current mstop]\n", sep = "") - if (is.null(fun)) { - dummyfct <- function(i, weights, oobweights) { - ## make model with new weights and minimal mstop - mod <- update(object, weights = weights, oobweights = oobweights, - risk = "oobag", trace = FALSE, - mstop = apply(grid, 2, min)) - - ## now we need to increase mstop (stupid or clever) - risks <- vector("numeric", nrow(grid)) - - ## fitting loop - j <- 1 - while (j <= nrow(grid)) { - j_start <- j - ## check for dense grid - if (dense_mu_grid && - (grid[j, 1] >= max(grid[j, -1])) && - j < nrow(grid) && ## needed for the next line (i.e., grid[j+1,]) - (grid[j, 1] == grid[j + 1, 1] - 1)) { - ## now check how long the dense grid continues - # usual length: - j_tmp <- j + max(grid[, 1]) - grid[j, 1] - # now check if this is correct: - if (all(grid[j:j_tmp, -1] == grid[j, -1, drop = TRUE])) { - ## increase j - j <- j_tmp - } - ## else continue step by step... - } - mod[grid[j, ]] - rsk <- risk(mod, merge = TRUE) - risks[j_start:j] <- rsk[(length(rsk) - j + j_start):length(rsk)] - if (trace) { - txt <- paste0(" [", i, "]\t", - paste0("[", paste(mstop(mod), collapse = ","), - "]"), "\n") - cat(txt) - } - j <- j + 1 - } ## end while - return(risks) - } - } - else { - stop("currently not implemented") - dummyfct <- function(i, weights, oobweights) { - ## make model with new weights and minimal mstop - mod <- update(object, weights = weights, oobweights = oobweights, - risk = "oobag", trace = FALSE, - mstop = apply(grid, 2, min)) - - res <- vector("list", nrow(grid)) - for (i in 1:nrow(grid)) { - mod[grid[i, ]] - class(mod) <- class(object) - res[i] <- fun(mod) - } - return(res) - } - } - - OOBweights <- matrix(rep(weights, ncol(folds)), ncol = ncol(folds)) - OOBweights[folds > 0] <- 0 - oobrisk <- papply(1:ncol(folds), - function(i) dummyfct(i, weights = folds[, i], - oobweights = OOBweights[, i]), ...) - ## get errors if mclapply is used - if (any(idx <- sapply(oobrisk, is.character))) - stop(sapply(oobrisk[idx], function(x) x)) - if (!is.null(fun)) - return(oobrisk) - oobrisk <- t(as.data.frame(oobrisk)) - oobrisk <- oobrisk / colSums(OOBweights) - colnames(oobrisk) <- apply(grid, 1, - function(x) paste(x, collapse = ",")) - rownames(oobrisk) <- 1:nrow(oobrisk) - ## attr(oobrisk, "risk") <- fam_name - ## sowas wie "Normal distribution: mu(id link)" - attr(oobrisk, "call") <- call - attr(oobrisk, "mstop") <- grid - attr(oobrisk, "type") <- ifelse(!is.null(attr(folds, "type")), - attr(folds, "type"), "user-defined") - class(oobrisk) <- "cvriskLSS" - oobrisk -} - -print.cvriskLSS <- function(x, ...) { - #cat("\n\t Cross-validated", attr(x, "risk"), "\n\t", - cat("\n\t Cross-validated risk\n\t", - attr(x, "call"), "\n\n") - print(colMeans(x)) - cat("\n\t Optimal number of boosting iterations:", mstop(x), "\n") - return(invisible(x)) -} - -plot.cvriskLSS <- function(x, type = c("heatmap", "lines"), - xlab = NULL, ylab = NULL, - ylim = range(x), - main = attr(x, "type"), - ...) { - - type <- match.arg(type) - - nms <- names(attr(x, "mstop")) - if (type == "lines") { - if (is.null(xlab)) - xlab <- paste0("Number of boosting iterations (", - paste0(nms, collapse = ","), ")") - if (is.null(ylab)) - ylab <- "Out-of-bag risk" - } else { - if (is.null(xlab)) - xlab <- paste0("Number of boosting iterations (", nms[1], ")") - if (is.null(ylab)) - ylab <- paste0("Number of boosting iterations (", nms[2], ")") - } - - if (type == "lines") { - cm <- colMeans(x) - plot(1:ncol(x), cm, xlab = xlab, ylab = ylab, - ylim = ylim, type = "n", lwd = 2, - main = main, axes = FALSE, ...) - out <- apply(x, 1, function(y) lines(1:ncol(x),y, col = "lightgrey")) - rm(out) - ms <- which.min(cm) - lines(c(ms, ms), c(min(c(0, ylim[1] * ifelse(ylim[1] < 0, 2, 0.5))), cm[ms]), - lty = 2) - lines(1:ncol(x), cm, type = "l") - axis(1, at = 1:ncol(x), labels = colnames(x)) - axis(2) - box() - } else { - cm <- colMeans(x) - grid <- attr(x, "mstop") - if (!(ncol(grid) %in% c(2,3))) - stop("currently only implemented for 2 and 3 dimensional grids") - mstop <- mstop(x) - #cm <- exp(cm) - standardized_cm <- 1 - (cm - min(cm))/(max(cm) - min(cm)) - col <- grey(standardized_cm) - # col <- heat.colors(length(unique(cm))) - # col <- colorRampPalette(c("blue", "white", "red"))(length(cm)) - # plot(grid, col = col[order(cm)], pch = 15) - # plot(grid, col = col, pch = 15) - make_plot <- function(grid, col, idx, main, k) { - plot(grid[idx, ], col = col[idx], xlab = xlab, ylab = ylab, - main = main, pch = 15, ...) - if (is.null(k) || k == mstop[3]) { - points(mstop[1], mstop[2], col = "red", pch = 22) - lines(c(0, mstop[1]), c(mstop[2], mstop[2]), col = "red", lty = "dashed") - lines(c(mstop[1], mstop[1]), c(0, mstop[2]), col = "red", lty = "dashed") - } - } - if (ncol(grid) == 2) { - make_plot(grid, col = col, idx = 1:nrow(grid), main = main, k = NULL) - } else { - for (k in unique(grid[, 3])) - make_plot(grid[, -3], col = col, idx = (grid[, 3] == k), - main = paste0(main, "\n(", nms[3], "=", k, ")"), - k = k) - } - } -} - -mstop.cvriskLSS <- function(object, parameter = NULL, ...) { - res <- unlist(attr(object, "mstop")[which.min(colSums(object)),]) - if (!is.null(parameter)) { - if(is.character(parameter)) - parameter <- extract_parameter(object, parameter) - res <- res[parameter] - } - return(res) -} - -if (FALSE) { - library(gamboostLSS) - - ## check cvrisk - set.seed(1907) - x1 <- rnorm(1000) - x2 <- rnorm(1000) - x3 <- rnorm(1000) - x4 <- rnorm(1000) - x5 <- rnorm(1000) - x6 <- rnorm(1000) - mu <- exp(1.5 +1 * x1 +0.5 * x2 -0.5 * x3 -1 * x4) - sigma <- exp(-0.2 * x3) - y <- numeric(1000) - for( i in 1:1000) - y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) - dat <- data.frame(x1, x2, x3, x4, x5, x6, y) - model <- glmboostLSS(y ~ ., families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 400), - center = TRUE) - grid <- make.grid(c(mu = 1000, sigma = 1000), length.out = 5) - plot(grid) - abline(0,1) - cvr <- cvrisk(model, folds = cv(model.weights(model), B = 5), grid = grid, - papply = lapply) - - ### check timings: - - ### Data generating process: - set.seed(1907) - x1 <- rnorm(1000) - x2 <- rnorm(1000) - x3 <- rnorm(1000) - x4 <- rnorm(1000) - x5 <- rnorm(1000) - x6 <- rnorm(1000) - mu <- exp(1.5 +1 * x1 +0.5 * x2 -0.5 * x3 -1 * x4) - sigma <- exp(-0.4 * x3 -0.2 * x4 +0.2 * x5 +0.4 * x6) - y <- numeric(1000) - for( i in 1:1000) - y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) - dat <- data.frame(x1, x2, x3, x4, x5, x6, y) - - system.time({ - ## linear model with y ~ . for both components: 1 boosting iterations - model <- glmboostLSS(y ~ ., families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 1), - center = TRUE) - for (i in 10:1000) { - model[c(i, 10)] - } - }) - ## langsamer als: - system.time({ - ## linear model with y ~ . for both components: 1 boosting iterations - model <- glmboostLSS(y ~ ., families = NBinomialLSS(), data = dat, - control = boost_control(mstop = 1), - center = TRUE) - model[c(1000, 10)] - - }) - - - ## what about the warnings in 3d? -} diff --git a/pkg/R/families.R b/pkg/R/families.R deleted file mode 100644 index 1a11a7b..0000000 --- a/pkg/R/families.R +++ /dev/null @@ -1,882 +0,0 @@ -### -# Constructor Function - -Families <- function(..., qfun = NULL, name = NULL) { - RET <- list(...) - class(RET) <- "families" - ## check if response function is not specified - check <- sapply(RET, function(x){ - bdy <- body(x@response) - (length(x@response(c(-1,0,1))) != 3 && class(bdy) != "call" && - length(bdy) == 1 && is.na(bdy)) - }) - if (any(check)) - stop("response function not specified in families for:\n\t", - paste(names(RET)[check], collapse =", ")) - attr(RET, "qfun") <- qfun - attr(RET, "name") <- name - return(RET) -} - -### -# Negative Binomial LSS Family - -NBinomialMu <- function(mu = NULL, sigma = NULL, stabilization) { - loss <- function(sigma, y, f) - -(lgamma(y + sigma) - lgamma(sigma) - lgamma(y + 1) + sigma * log(sigma) - + y * f - (y + sigma) * log(exp(f) + sigma)) - risk <- function(y, f, w = 1){ - RET <- sum(w * loss(y = y, f = f, sigma = sigma)) - return(RET) - } - ngradient <- function(y, f, w = 1) { - ngr <- y - (y + sigma)/(exp(f) + sigma) * exp(f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(mu)){ - RET <- log(mu) - } else { - if (is.null(sigma)) { - sigma <<- mean(y)^2 / (var(y) - mean(y)) - sigma <<- ifelse(sigma < 0, 1e-10, sigma) - } - ### look for starting value of f = log(mu) in "interval" - ### i.e. mu possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, offset = offset, risk = risk, loss = loss, - response = function(f) exp(f), - check_y = function(y) { - if (!all.equal(unique(y - floor(y)), 0)) - stop("response must be an integer") - if (any(y < 0)) - stop("response must be >= 0") - y - }, name = "Negative Negative-Binomial Likelihood: mu (log link)") -} - -NBinomialSigma <- function(mu = NULL, sigma = NULL, stabilization) { - # this family boosts sigma therefore f is sigma - loss <- function(mu, y, f) - -(lgamma(y + exp(f)) - lgamma(exp(f)) - lgamma(y + 1) + exp(f) * f + - y * log(mu) - (y + exp(f)) * log(mu + exp(f))) - risk <- function(y, f, w = 1){ - RET <- sum(w * loss(y = y, f = f, mu = mu)) - return(RET) - } - ngradient <- function(y, f, w = 1) { # f is sigma ! - ngr <- exp(f)*(digamma(y +exp(f)) - digamma(exp(f)) + log(exp(f)) + 1 - - log(mu +exp(f)) - (exp(f) + y)/(mu +exp(f))) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y,w){ - if (!is.null(sigma)){ - RET <- log(sigma) - } else { - if (is.null(mu)) - mu <<- mean(y) - ### look for starting value of f = log(sigma) in "interval" - ### i.e. sigma possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, offset = offset, risk = risk, loss = loss, - response = function(f) exp(f), - check_y = function(y) { - if (!all.equal(unique(y - floor(y)), 0)) - stop("response must be an integer") - if (any(y < 0)) - stop("response must be >= 0") - y - }, name = "Negative Negative-Binomial Likelihood: sigma (log link)") -} - - -NBinomialLSS <- function(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) { - if ((!is.null(sigma) && sigma <= 0) || (!is.null(mu) && mu <= 0)) - stop(sQuote("sigma"), " and ", sQuote("mu"), - " must be greater than zero") - stabilization <- check_stabilization(stabilization) - Families(mu = NBinomialMu(mu = mu, sigma = sigma, stabilization = stabilization), - sigma = NBinomialSigma(mu = mu, sigma = sigma, stabilization = stabilization), - qfun = qNBinomial, - name = "Negative Binomial") -} - -## we use almost the same parameterization as NBI but with theta = 1/sigma -qNBinomial <- function(p, mu = 0, sigma = 1, lower.tail = TRUE, log.p = FALSE) { - ## require gamlss.dist - if (!requireNamespace("gamlss.dist", quietly = TRUE)) - stop("Please install package 'gamlss.dist' for using qNBinomial.") - gamlss.dist::qNBI(p = p, mu = mu, sigma = 1/sigma, lower.tail = lower.tail, log.p = log.p) -} - - -### -# T-distribution LSS Family - -StudentTMu <- function(mu = NULL, sigma = NULL, df = NULL, stabilization) { - loss <- function(df, sigma,y, f){ - -1 * (lgamma((df+1)/2) - log(sigma) - lgamma(1/2) - lgamma(df/2) - 0.5 * - log(df) - (df+1)/2 * log(1 + (y-f)^2 / (df * sigma^2))) - } - risk <- function(y, f, w = 1){ - sum(w * loss(y = y, f = f, df = df, sigma = sigma)) - } - ngradient <- function(y, f, w = 1) { - ngr <- (df+1)*(y-f)/(df*sigma^2 +(y-f)^2) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - - offset <- function(y, w){ - if (!is.null(mu)){ - RET <- mu - } else { - if (is.null(sigma)) - sigma <<- 1 - if (is.null(df)) - df <<- 4 - RET <- optimize(risk, interval = range(y), y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, loss = loss, - offset=offset, - response = function(f) f, - check_y = function(y) { - if (!is.numeric(y) || !is.null(dim(y))) - stop("response is not a numeric vector ") - y - }, name = "Student's t-distribution: mu (id link)") -} - -StudentTSigma <- function(mu = NULL, sigma = NULL, df = NULL, stabilization) { - loss <- function(df, mu, y, f){ - -1 * (lgamma((df+1)/2) - f - lgamma(1/2) - lgamma(df/2) - 0.5 * log(df) - - (df+1)/2 * log(1 + (y-mu)^2 / (df * exp(2 * f)))) - } - risk <- function(y, f, w = 1){ - sum(w * loss(y = y, f = f, df = df, mu = mu)) - } - ngradient <- function(y, f, w = 1) { - ngr <- (-1 + (df+1)/(df*exp(2*f)/(y-mu)^2 + 1)) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(sigma)){ - RET <- log(sigma) - } else { - if (is.null(mu)) - mu <<- mean(y) - if (is.null(df)) - df <<- 4 - ### look for starting value of f = log(sigma) in "interval" - ### i.e. sigma possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, loss = loss, - offset=offset, - response = function(f) exp(f), - check_y = function(y) { - if (!is.numeric(y) || !is.null(dim(y))) - stop("response is not a numeric vector ") - y - }, name = "Student's t-distribution: sigma (log link)") -} - -StudentTDf <- function(mu = NULL, sigma = NULL, df = NULL, stabilization) { - loss <- function(sigma, mu,y, f){ - -1 * (lgamma((exp(f)+1)/2) - log(sigma) - lgamma(1/2) - lgamma(exp(f)/2) - - 0.5*f - (exp(f)+1)/2 * log(1 + (y-mu)^2 / (exp(f)*sigma^2))) - } - risk <- function(y, f, w = 1){ - sum(w * loss(y = y, f = f, sigma = sigma, mu = mu)) - } - ngradient <- function(y, f, w = 1) { - ngr <- exp(f)/2 * (digamma((exp(f)+1)/2)-digamma(exp(f)/2)) - 0.5 - - (exp(f)/2 * log(1+ (y-mu)^2/(exp(f)*sigma^2)) - - (y-mu)^2/(sigma^2 + (y-mu)^2/exp(f)) * (exp(-f) +1)/2 ) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(df)){ - RET <- log(df) - } else { - if (is.null(mu)) - mu <<- mean(y) - if (is.null(sigma)) - sigma <<- 1 - ### look for starting value of f = log(df) in "interval" - ### i.e. df possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, loss = loss, - offset=offset, - response = function(f) exp(f), - check_y = function(y) { - if (!is.numeric(y) || !is.null(dim(y))) - stop("response is not a numeric vector ") - y - }, name = "Student's t-distribution: df (log link)") -} - - - -StudentTLSS <- function(mu = NULL, sigma = NULL, df = NULL, - stabilization = c("none", "MAD")) { - if ((!is.null(sigma) && sigma <= 0) || (!is.null(df) && df <= 0)) - stop(sQuote("sigma"), " and ", sQuote("df"), - " must be greater than zero") - stabilization <- check_stabilization(stabilization) - Families(mu = StudentTMu(mu = mu, sigma = sigma, df = df, stabilization = stabilization), - sigma = StudentTSigma(mu = mu, sigma = sigma, df = df, stabilization = stabilization), - df = StudentTDf(mu = mu, sigma = sigma, df = df, stabilization = stabilization), - qfun = qT, - name = "Student T") -} - -qT <- function(p, mu, sigma, df, n, lower.tail = TRUE, log.p = FALSE) { - if (any(sigma <= 0)) - stop("sigma must be greater 0") - if (any(df <= 0)) - stop("df must be greater 0") - if (length(n) != 1 || n <= 0) - stop("n must be a single value greater 0") - ncp <- mu * sqrt(n)/sigma - q <- qt(p, df = df, ncp = ncp, lower.tail = lower.tail, log.p = log.p) - return(q) -} - - -### -# Log-Normal LSS Family - -LogNormalMu <- function (mu = NULL, sigma = NULL, stabilization){ - loss <- function(sigma, y, f) { - logfw <- function(pred) - dnorm(pred, log = TRUE) - logSw <- function(pred) - pnorm(pred, lower.tail = FALSE, log.p = TRUE) - eta <- (log(y[,1]) - f)/sigma - -y[,2] * (logfw(eta) - log(sigma)) - (1 - y[,2]) * logSw(eta) - } - risk <- function(y, f, w = 1) - sum(w * loss(y = y, f = f, sigma = sigma)) - ngradient <- function(y, f, w = 1) { - eta <- (log(y[,1]) - f)/sigma - ngr <- (y[,2] * eta + (1 - y[,2]) * dnorm(eta)/(1 - pnorm(eta)))/sigma - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(mu)){ - RET <- mu - } else { - if (is.null(sigma)) - sigma <<- 1 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), - y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, offset = offset, loss = loss, - response = function(f) f, - check_y = function(y) { - if (!inherits(y, "Surv")) - stop("response is not an object of class ", sQuote("Surv"), - " but ", sQuote("families = LogNormalLSS()")) - y - }, name = "Log-Normal AFT Model: mu (id link)") -} - -LogNormalSigma <- function(mu = NULL, sigma = NULL, stabilization){ - loss <- function(mu, y, f) { - logfw <- function(pred) - dnorm(pred, log = TRUE) - logSw <- function(pred) - pnorm(pred, lower.tail = FALSE, log.p = TRUE) - eta <- (log(y[,1]) - mu) / exp(f) - -y[,2] * (logfw(eta) - f) - (1 - y[,2]) * logSw(eta) - } - risk <- function(y, f, w = 1) - sum(w * loss(y = y, f = f, mu = mu)) - ngradient <- function(y, f, w = 1) { - eta <- (log(y[,1]) - mu)/exp(f) - ngr <- -(y[,2] - y[,2]*eta^2 + (y[,2]-1)*eta*dnorm(eta)/(1-pnorm(eta))) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(sigma)){ - RET <- log(sigma) - } else { - if (is.null(mu)) - mu <<- 0 - ## look for starting value of f = log(sigma) in "interval" - ## i.e. sigma possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), - y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, offset = offset, loss = loss, - response = function(f) exp(f), - check_y = function(y) { - if (!inherits(y, "Surv")) - stop("response is not an object of class ", sQuote("Surv"), - " but ", sQuote("family = LogNormalLSS()")) - y - }, name = "Log-Normal AFT Model: sigma (log link)") -} - -LogNormalLSS <- function(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) { - if ((!is.null(sigma) && sigma <= 0)) - stop(sQuote("sigma"), " must be greater than zero") - stabilization <- check_stabilization(stabilization) - Families(mu = LogNormalMu(mu = mu, sigma = sigma, stabilization = stabilization), - sigma = LogNormalSigma(mu = mu, sigma = sigma, stabilization = stabilization), - qfun = qLogNormal, - name = "Log-Normal") -} - -qLogNormal <- function(p, mu = 1, sigma = 1, lower.tail = TRUE, log.p = FALSE) { - qlnorm(p = p, meanlog = log(mu), sdlog = log(sigma), lower.tail = lower.tail, - log.p = log.p) -} - - -### -# LogLog LSS Family - -LogLogMu <- function (mu = NULL, sigma = NULL, stabilization){ - loss <- function(sigma, y, f) { - logfw <- function(pred) - dlogis(pred, log = TRUE) - #pred - 2 * (1 + exp(pred)) - logSw <- function(pred) - plogis(pred, lower.tail = FALSE, log.p = TRUE) - #1/(1 + exp(pred)) - eta <- (log(y[,1]) - f)/sigma - -y[,2] * (logfw(eta) - log(sigma)) - (1 - y[,2]) * logSw(eta) - } - - risk <- function(y, f, w = 1) - sum(w * loss(y = y, f = f, sigma = sigma)) - - ngradient <- function(y, f, w = 1) { - eta <- (log(y[,1]) - f)/sigma - nom <- (exp(-eta) + 1) - ngr <- (y[,2] * (2/nom - 1) + (1 - y[,2])/nom)/sigma - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(mu)){ - RET <- mu - } else { - if (is.null(sigma)) - sigma <<- 1 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), - y = y, w = w)$minimum - } - return(RET) - } - - - Family(ngradient = ngradient, risk = risk, offset = offset, loss = loss, - response = function(f) f, - check_y = function(y) { - if (!inherits(y, "Surv")) - stop("response is not an object of class ", sQuote("Surv"), - " but ", sQuote("families = LogLogLSS()")) - y - }, name = "Log-Logistic AFT Model: mu (id link)") -} - -LogLogSigma <- function (mu = NULL, sigma = NULL, stabilization){ - loss <- function(mu, y, f) { - logfw <- function(pred) - dlogis(pred, log = TRUE) - #exp(pred)/(1 + exp(pred))^2 - logSw <- function(pred) - pnorm(pred, lower.tail = FALSE, log.p = TRUE) - #1/(1 + exp(pred)) - eta <- (log(y[,1]) - mu)/exp(f) - -y[,2] * (logfw(eta) - f) - (1 - y[,2]) * logSw(eta) - } - risk <- function(y, f, w = 1) - sum(w * loss(y = y, f = f, mu = mu)) - ngradient <- function(y, f, w = 1) { - eta <- (log(y[,1]) - mu)/exp(f) - ngr <- -(y[,2] + y[,2]*eta -(y[,2]+1)*eta/(1+exp(-eta))) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(sigma)){ - RET <- log(sigma) - } else { - if (is.null(mu)) - mu <<- 0 - ## look for starting value of f = log(sigma) in "interval" - ## i.e. sigma possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, offset = offset, loss = loss, - response = function(f) exp(f), - check_y = function(y) { - if (!inherits(y, "Surv")) - stop("response is not an object of class ", sQuote("Surv"), - " but ", sQuote("families = LogLogLSS()")) - y - }, name = "Log-Logistic AFT Model: sigma (log link)") -} - -LogLogLSS <- function(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) { - if ((!is.null(sigma) && sigma <= 0)) - stop(sQuote("sigma"), " must be greater than zero") - stabilization <- check_stabilization(stabilization) - Families(mu = LogLogMu(mu = mu, sigma = sigma, stabilization = stabilization), - sigma = LogLogSigma(mu = mu, sigma = sigma, stabilization = stabilization), -# qfun = qLogLog, - name = "Log-Log") -} - -# nach: qllog (package FAdist) -#qLogLog <- function(p, mu = 0, sigma = 1, lower.tail = TRUE, log.p = FALSE) { -# exp(qlogis(p = p, location = mu, scale = sigma, -# lower.tail = lower.tail, log.p = log.p)) -#} -# andere Ergebnisse als qllogis (package actuar) - - -### -# Weibull LSS Family -WeibullMu <- function (mu = NULL, sigma = NULL, stabilization){ - loss <- function(sigma, y, f) { - logfw <- function(pred) - pred - exp(pred) - logSw <- function(pred) - -exp(pred) - eta <- (log(y[,1]) - f)/sigma - -y[,2] * (logfw(eta) -log(sigma)) - (1 - y[,2]) * logSw(eta) - } - risk <- function(y, f, w = 1) - sum(w * loss(y = y, f = f, sigma = sigma)) - ngradient <- function(y, f, w = 1){ - eta <- (log(y[,1]) - f)/sigma - ngr <- (y[,2] * (exp(eta) - 1) + (1 - y[,2]) * exp(eta))/sigma - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(mu)){ - RET <- log(mu) - } else { - if (is.null(sigma)) - sigma <<- 1 - RET <- optimize(risk, interval = c(0, max(y[,1], na.rm = TRUE)), - y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, offset = offset, loss = loss, - response = function(f) f, - check_y = function(y) { - if (!inherits(y, "Surv")) - stop("response is not an object of class ", sQuote("Surv"), - " but ", sQuote("families = WeibullLSS()")) - y - }, name = "Weibull AFT Model: mu (id link)") -} - - -WeibullSigma <- function (mu = NULL, sigma = NULL, stabilization){ - loss <- function(mu, y, f) { - logfw <- function(pred) - pred - exp(pred) - logSw <- function(pred) - -exp(pred) - eta <- (log(y[,1]) - mu)/exp(f) - -y[,2] * (logfw(eta) - f) - (1 - y[,2]) * logSw(eta) - } - risk <- function(y, f, w = 1) - sum(w * loss(y = y, f = f, mu = mu)) - ngradient <- function(y, f, w = 1) { - eta <- (log(y[,1]) - mu)/exp(f) - ngr <- -(y[,2] * (eta + 1) - eta * exp(eta)) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(sigma)){ - RET <- log(sigma) - } else { - if (is.null(mu)) - mu <<- 0 - ## look for starting value of f = log(sigma) in "interval" - ## i.e. sigma possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), - y = y, w = w)$minimum - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, offset = offset, loss = loss, - response = function(f) exp(f), - check_y = function(y) { - if (!inherits(y, "Surv")) - stop("response is not an object of class ", sQuote("Surv"), - " but ", sQuote("families = WeibullLSS()")) - y - }, name = "Weibull AFT Model: sigma (log link)") -} - -WeibullLSS <- function(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) { - if ((!is.null(sigma) && sigma <= 0)) - stop(sQuote("sigma"), " must be greater than zero") - stabilization <- check_stabilization(stabilization) - Families(mu = WeibullMu(mu = mu, sigma = sigma, stabilization = stabilization), - sigma = WeibullSigma(mu = mu, sigma = sigma, stabilization = stabilization), - qfun = qWeibull, - name = "Weibull") -} - -qWeibull <- function(p, mu = 1, sigma = 1, lower.tail = TRUE, log.p = FALSE) { - qweibull(p, scale = mu, shape = sigma, - lower.tail = lower.tail, log.p = log.p) -} - - -GaussianMu <- function(mu = NULL, sigma = NULL, stabilization){ - - loss <- function(sigma, y, f) -dnorm(x=y, mean=f, sd=sigma, log=TRUE) - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, sigma = sigma)) - } - ngradient <- function(y, f, w = 1) { - ngr <- (1/sigma^2)*(y - f) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - - offset <- function(y, w){ - if (!is.null(mu)){ - RET <- mu - } else { - RET <- weighted.mean(y, w = w, na.rm=TRUE) - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) f, offset=offset, - name = "Normal distribution: mu(id link)") -} - -GaussianSigma <- function(mu = NULL, sigma = NULL, stabilization){ - - loss <- function(y, f, mu) - dnorm(x=y, mean=mu, sd=exp(f), log=TRUE) - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu)) - } - ngradient <- function(y, f, w = 1) { - ngr <- (- 1 + exp(-2*f)*((y - mu)^2)) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w){ - if (!is.null(sigma)){ - RET <- log(sigma) - } else { - RET <- log(weighted.sd(y, w = w, na.rm=TRUE)) - } - return(RET) - } - - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) exp(f), offset=offset, - name = "Normal distribution: sigma (log link)") -} - - -GaussianLSS <- function(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) { - if ((!is.null(sigma) && sigma <= 0)) - stop(sQuote("sigma"), " must be greater than zero") - stabilization <- check_stabilization(stabilization) - Families(mu = GaussianMu(mu=mu, sigma=sigma, stabilization = stabilization), - sigma = GaussianSigma(mu=mu, sigma=sigma, stabilization = stabilization), - qfun = qNormal, - name = "Gaussian") -} - - -qNormal <- function(p, mu = 0, sigma = 1, lower.tail = TRUE, log.p = FALSE) { - qnorm(p = p, mean = mu, sd = sigma, lower.tail = lower.tail, log.p = log.p) -} - -GammaMu <-function (mu = NULL, sigma = NULL, stabilization) { - loss <- function(sigma, y, f) { - lgamma(sigma) + sigma * y * exp(-f) - sigma * log(y) - - sigma * log(sigma) + sigma * f + log(y) - } - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, sigma = sigma)) - } - ngradient <- function(y, f, w = 1) { - ngr <- sigma * y * exp(-f) - sigma - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w) { - if (!is.null(mu)) { - RET <- log(mu) - } - else { - if (is.null(sigma)) - sigma <<- mean(y)^2/(var(y)) - RET <- optimize(risk, interval = c(0, max(y^2, na.rm = TRUE)), - y = y, w = w)$minimum - } - return(RET) - } - check_y <- function(y) { - if (!is.numeric(y) || !is.null(dim(y))) - stop("response is not a numeric vector but ", sQuote("GammaLSS()")) - if (any(y < 0)) - stop("response is not positive but ", sQuote("GammaLSS()")) - y - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) exp(f), offset = offset, check_y = check_y, - name = "Gamma distribution: mu(log link)") -} - -GammaSigma <- function(mu = NULL, sigma = NULL, stabilization) { - loss <- function(mu, y, f) { - lgamma(exp(f)) + (exp(f) * y )/mu - exp(f) * log(y) - - f * exp(f) + exp(f) * log(mu) + log(y) - } - risk <- function(y, f, w = 1){ - sum(w * loss(y = y, f = f, mu = mu)) - } - ngradient <- function(y, f, w = 1) { - ngr <- - digamma(exp(f))*exp(f) + (f+1)*exp(f) - log(mu)*exp(f) + - exp(f)*log(y) - (y*exp(f))/mu - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w) { - if (!is.null(sigma)) { - RET <- log(sigma) - } - else { - if (is.null(mu)) - mu <<- mean(y) - RET <- optimize(risk, interval = c(0, max(y, na.rm = TRUE)), - y = y, w = w)$minimum - } - return(RET) - } - check_y <- function(y) { - if (!is.numeric(y) || !is.null(dim(y))) - stop("response is not a numeric vector but ", sQuote("GammaLSS()")) - if (any(y < 0)) - stop("response is not positive but ", sQuote("GammaLSS()")) - y - } - Family(ngradient = ngradient, risk = risk, loss = loss, - response = function(f) exp(f), offset = offset, check_y = check_y, - name = "Gamma distribution: sigma(log link)") -} - -GammaLSS <- function (mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) { - if ((!is.null(sigma) && sigma <= 0)) - stop(sQuote("sigma"), " must be greater than zero") - if ((!is.null(mu) && mu <= 0)) - stop(sQuote("mu"), " must be greater than zero") - stabilization <- check_stabilization(stabilization) - Families(mu = GammaMu(mu = mu, sigma = sigma, stabilization = stabilization), - sigma = GammaSigma(mu = mu, sigma = sigma, stabilization = stabilization), - qfun = qGamma, - name = "Gamma") -} - -## we use almost the same parameterization as GA but with sigma = sqrt(1/sigma) -qGamma <- function(p, mu = 0, sigma = 1, lower.tail = TRUE, log.p = FALSE) { - ## require gamlss.dist - if (!requireNamespace("gamlss.dist", quietly = TRUE)) - stop("Please install package 'gamlss.dist' for using qGamma.") - gamlss.dist::qGA(p = p, mu = mu, sigma = sqrt(1/sigma), lower.tail = lower.tail, log.p = log.p) -} - - - -BetaMu <- function(mu = NULL, phi = NULL, stabilization){ - - # loss is negative log-Likelihood, f is the parameter to be fitted with - # logit link -> exp(f) = mu - loss <- function(phi, y, f) { - - 1 * (lgamma(phi) - lgamma(plogis(f) * phi) - - lgamma((1 - plogis(f)) * phi) + (plogis(f) * phi - 1) * log(y) + - ((1 - plogis(f)) * phi - 1) * log(1 - y)) - } - # risk is sum of loss - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, phi = phi)) - #sqrt(mean(w * (y - plogis(f))^2)) - } - # ngradient is the negative derivate w.r.t. mu - ngradient <- function(y, f, w = 1) { - ngr <- +1 * exp(f)/(1 + exp(f))^2 * (phi * (qlogis(y) - (digamma(plogis(f) * phi) - - digamma((1 - plogis(f)) * phi)))) # Nachdifferenzieren? -> nein, da nach mu ableiten und nicht nach beta - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w) { - if (!is.null(mu)) { - RET <- qlogis(mu) - } - else { - if (is.null(phi)) - phi <<- mean(y) * (1 - mean(y)) /var(y) - 1 - ### look for starting value of f = qlogis(mu) in "interval" - ### i.e. mu ranges from 0.000001 to 0.999999 - RET <- optimize(risk, interval = c(qlogis(0.000001), qlogis(0.999999)), y = y, - w = w)$minimum - } - return(RET) - } - # use the Family constructor of mboost - Family(ngradient = ngradient, risk = risk, loss = loss, offset = offset, - response = function(f) plogis(f), - check_y <- function(y) { - if (!is.numeric(y) || !is.null(dim(y))) - stop("response must be a numeric vector") - if (any(y <= 0) | any(y >= 1)) - stop("response must be >0 and <1") - y - }, - name = "Beta-distribution: mu (logit link)") -} - -# Sub-Family for phi -BetaPhi <- function(mu = NULL, phi = NULL, stabilization){ - - # loss is negative log-Likelihood, f is the parameter to be fitted with - # log-link: exp(f) = phi - loss <- function(mu, y, f) { - #y <- (y * (length(y) - 1) + 0.5)/length(y) - -1 * (lgamma(exp(f)) - lgamma(mu * exp(f)) - - lgamma((1 - mu) * exp(f)) + (mu * exp(f) - 1) * log(y) + - ((1 - mu) * exp(f) - 1) * log(1 - y)) - } - # risk is sum of loss - risk <- function(y, f, w = 1) { - sum(w * loss(y = y, f = f, mu = mu)) - } - # ngradient is the negative derivate w.r.t. phi - ngradient <- function(y, f, w = 1) { - #y <- (y * (length(y) - 1) + 0.5)/length(y) - ngr <- +1 * exp(f) * (mu * (qlogis(y) - (digamma(mu * exp(f)) - digamma((1 - mu) * exp(f)))) + - digamma(exp(f)) - digamma((1 - mu) * exp(f)) + log(1 - y)) - ngr <- stabilize_ngradient(ngr, w = w, stabilization) - return(ngr) - } - offset <- function(y, w) { - if (!is.null(phi)) { - RET <- log(phi) - } - else { - if (is.null(mu)) - mu <<- mean(y) - ### look for starting value of f = log(phi) in "interval" - ### i.e. phi possibly ranges from 1e-10 to 1e10 - RET <- optimize(risk, interval = c(log(1e-10), log(1e10)), - y = y, w = w)$minimum - } - return(RET) - } - # use the Family constructor of mboost - Family(ngradient = ngradient, risk = risk, loss = loss, offset = offset, - response = function(f) exp(f), - check_y <- function(y) { - if (!is.numeric(y) || !is.null(dim(y))) - stop("response must be a numeric vector") - if (any(y <= 0) | any(y >= 1)) - stop("response must be >0 and <1") - y - }, - name = "Beta-distribution: phi (log link)") -} - -# families object for new distribution -BetaLSS <- function (mu = NULL, phi = NULL, - stabilization = c("none", "MAD")) { - stabilization <- check_stabilization(stabilization) - Families(mu = BetaMu(mu = mu, phi = phi, stabilization = stabilization), - phi = BetaPhi(mu = mu, phi = phi, stabilization = stabilization), - qfun = qBeta, - name = "Beta") -} - -## we use almost the same parameterization as BE but with sigma = 1/sqrt(phi + 1) -qBeta <- function(p, mu = 0, phi = 1, lower.tail = TRUE, log.p = FALSE) { - ## require gamlss.dist - if (!requireNamespace("gamlss.dist", quietly = TRUE)) - stop("Please install package 'gamlss.dist' for using qBeta.") - gamlss.dist::qBE(p = p, mu = mu, sigma = 1/sqrt(phi + 1), lower.tail = lower.tail, log.p = log.p) -} - -# Zero-inflated Poisson model -ZIPoLSS <- function(mu = NULL, sigma = NULL, - stabilization = c("none", "MAD")) { - fam <- as.families(fname = "ZIP", mu = mu, sigma = sigma, stabilization = stabilization) - - fam$mu@name <- "Zero-inflated Poisson model: count data component" - fam$sigma@name <- "Zero-inflated Poisson model: zero component" - - fam -} - -# Zero-inflated negative binomial model -ZINBLSS <- function(mu = NULL, sigma = NULL, nu = NULL, - stabilization = c("none", "MAD")) { - fam <- as.families(fname = "ZINBI", mu = mu, sigma = sigma, nu = nu, stabilization = stabilization) - - fam$mu@name <- "Zero-inflated negative binomial model: location parameter for count data component" - fam$sigma@name <- "Zero-inflated negative binomial model: scale parameter for count data component" - fam$nu@name <- "Zero-inflated negative binomial model: zero component" - - fam -} diff --git a/pkg/R/gamboostLSS_intern.R b/pkg/R/gamboostLSS_intern.R deleted file mode 100644 index 30501be..0000000 --- a/pkg/R/gamboostLSS_intern.R +++ /dev/null @@ -1,5 +0,0 @@ -gamboostLSS_intern <- function(..., fun = c("check", "do_trace")) { - - fun <- match.arg(fun) - do.call(fun, list(...)) -} diff --git a/pkg/R/helpers.R b/pkg/R/helpers.R deleted file mode 100644 index 80b1f85..0000000 --- a/pkg/R/helpers.R +++ /dev/null @@ -1,184 +0,0 @@ -## helper functions - -check <- function(what, what_char, names) { - - errormsg <- paste0(sQuote(what_char), " can be either a scalar, a (named) vector or a (named) list", - " of ", what_char, " values with same names as ", sQuote("families"), "in ", - sQuote("boost_control")) - - if (is.list(what)) { - if (is.null(names(what)) && length(what) == length(names)) - names(what) <- names - if (!all(names(what) %in% names) || - length(unique(names(what))) != length(names)) - stop(errormsg) - what <- what[names] ## sort in order of families - what <- unlist(what) - } else { - if(length(what) != 1 && length(what) != length(names)) - stop(errormsg) - if (length(what) == 1) { - what <- rep(what, length(names)) - names(what) <- names - } else { - if (is.null(names(what))) - names(what) <- names - if (!all(names(what) %in% names)) - stop(errormsg) - what <- what[names] ## sort in order of families - } - } - - return(what) -} - -## extract data from a gamboostLSS model (used in plot_PI) -get_data <- function(x, which = NULL) { - data <- attr(x, "data") - if (length(data) != 0) { - data <- data[, which, drop = FALSE] - } else { - data <- try(sapply(which, get, env = parent.frame(2)), - silent = TRUE) - if (inherits(data, "try-error")) - stop("No data set found.") - data <- as.data.frame(data) - } - return(data) -} - -## extract family name from a gamboostLSS model (used in plot_PI) -get_families_name <- function(x) { - attr(attr(x, "families"), "name") -} - -## make generic get_qfun function -get_qfun <- function(x, ...) - UseMethod("get_qfun") - -## extract family name from a gamboostLSS model (used in plot_PI) -get_qfun.mboostLSS <- function(x) { - qfun <- attr(attr(x, "families"), "qfun") - if (is.null(qfun)) - stop("Currently not implemented for this family") - return(qfun) -} - -## obtain pdf from gamlss.dist or global environment -## (needed in as.families) -get_qfun.character <- function(x) { - qfun <- paste("gamlss.dist::q", x, sep = "") - pdf <- try(eval(parse(text = qfun)), silent = TRUE) - if (inherits(pdf, "try-error")) { - ## try to find the function in global environment - ## this is needed e.g. for truncated families - qfun2 <- paste("q", x, sep = "") - pdf <- try(eval(parse(text = qfun2)), silent = TRUE) - if (inherits(pdf, "try-error")) - stop(sQuote(qfun2), " and ", sQuote(qfun), " do not exist.") - } - return(pdf) -} - -## obtain pdf from gamlss.dist or global environment -## (needed in as.families) -get_pdf <- function(x) { - dfun <- paste("gamlss.dist::d", x, sep = "") - pdf <- try(eval(parse(text = dfun)), silent = TRUE) - if (inherits(pdf, "try-error")) { - ## try to find the function in global environment - ## this is needed e.g. for truncated families - dfun2 <- paste("d", x, sep = "") - pdf <- try(eval(parse(text = dfun2)), silent = TRUE) - if (inherits(pdf, "try-error")) - stop(sQuote(dfun2), " and ", sQuote(dfun), " do not exist.") - } - return(pdf) -} - -## return mean or (first) modus of a vector depending on its class -mean_mod <- function(x) { - if (is.numeric(x)) - return(mean(x, na.rm = TRUE)) - ## else compute and return modus - if (is.character(x) || is.factor(x)) { - ret <- names(which.max(table(x)))[1] - if (is.factor(x)) - ret <- factor(ret, levels = levels(x)) - return(ret) - } - stop("not implemented for data type ", class(x)) -} - -## helper function copied from mboost_2.2-3 -rescale_weights <- function(w) { - if (max(abs(w - floor(w))) < sqrt(.Machine$double.eps)) - return(w) - return(w / sum(w) * sum(w > 0)) -} - -## helper function in a modified version based on mboost_2.2-3 -## print trace of boosting iterations -do_trace <- function(current, mstart, risk, - linebreak = options("width")$width / 2, mstop = 1000) { - current <- current - mstart - if (current != mstop) { - if ((current - 1) %/% linebreak == (current - 1) / linebreak) { - mchr <- formatC(current + mstart, format = "d", - width = nchar(mstop) + 1, big.mark = "'") - cat(paste("[", mchr, "] ",sep = "")) - } else { - if ((current %/% linebreak != current / linebreak)) { - cat(".") - } else { - cat(" -- risk:", risk[current + mstart], "\n") - } - } - } else { - cat("\nFinal risk:", risk[current + mstart], "\n") - } -} - -## helper function copied from mboost_2.2-3 -### check measurement scale of response for some losses -check_y_family <- function(y, family) - family@check_y(y) - -################################################################################ -# sapply function that differentiates between data.frames and (numeric) vectors -myApply <- function(X, FUN, ...) { - ret <- lapply(X, FUN, ...) - if (length(ret) == 1) - ret <- ret[[1]] - return(ret) -} - - -## helper function that stabilizes the negative gradient if requested by the user -stabilize_ngradient <- function(ngr, w = 1, stabilization) { - ## set which to MAD if gamboostLSS_stab_ngrad = TRUE and which == "none" - if (stabilization == "none" && getOption("gamboostLSS_stab_ngrad")) - stabilization <- "MAD" - ## stabilization using the mean absolute deviation (MAD) - if (stabilization == "MAD") { - div <- weighted.median(abs(ngr - weighted.median(ngr, w = w, na.rm = TRUE)), - w = w, na.rm = TRUE) - div <- ifelse(div < 0.0001, 0.0001, div) - ngr <- ngr / div - } - ngr -} - - -check_stabilization <- function(stabilization = c("none", "MAD")) { - stabilization <- match.arg(stabilization) - ## check if old stabilization interface is used and issue a warning - if (getOption("gamboostLSS_stab_ngrad")) { - warning("Usage of ", sQuote("options(gamboostLSS_stab_ngrad = TRUE)"), - " is deprecated.\n", "Use argument ", sQuote("stabilization"), - " in the fitting family. See ?Families for details.") - if (stabilization == "none") - warning(sQuote("stabilization"), " is set to ", dQuote("MAD")) - } - stabilization -} diff --git a/pkg/data/india.RData b/pkg/data/india.RData deleted file mode 100644 index bcfd414c5203a4b3aee852a07d0300eafe7c815f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84671 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

w?exJR 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%0AUXzF<$Z#35 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

R!3O?sXYtla30_-?8 zFD5FB#aX`^*Rb65V|y#c+oOtL@&oKvF(Ey?GZVHnVBB*quVn|4=F9rPu|IZ3ecMSs z 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ℑO)b{1xw@e-oj6&t6zt+t@*tw4}hOf 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 RB_TdA4T}N*00001Sy~@x_j>>U diff --git a/pkg/inst/CITATION b/pkg/inst/CITATION deleted file mode 100644 index 0fa5bd7..0000000 --- a/pkg/inst/CITATION +++ /dev/null @@ -1,62 +0,0 @@ -citHeader("To cite package 'gamboostLSS' in publications use:") - -year <- sub(".*(2[[:digit:]]{3})-.*", "\\1", meta$Date) -vers <- paste("{R} package version", meta$Version) -txt_vers <- paste("R package version", meta$Version) - -citEntry( - entry="Manual", - title = "{gamboostLSS}: Boosting Methods for {GAMLSS} Models", - author = personList(as.person("Benjamin Hofner"), - as.person("Andreas Mayr"), - as.person("Nora Fenske"), - as.person("Matthias Schmid")), - year = year, - note = vers, - url = "http://CRAN.R-project.org/package=gamboostLSS", - textVersion = - paste("B. Hofner, A. Mayr, N. Fenske and M. Schmid (", year, - "). gamboostLSS: Boosting Methods for GAMLSS Models, ", - txt_vers, ", http://CRAN.R-project.org/package=gamboostLSS", ".", - sep="") -) - -citEntry( - entry="Article", - title = "{gamboostLSS}: An {R} Package for Model Building and Variable Selection in the {GAMLSS} Framework", - author = personList(as.person("Benjamin Hofner"), - as.person("Andreas Mayr"), - as.person("Matthias Schmid")), - journal = "Journal of Statistical Software", - year = "2015", - note = "Accepted.", - header = "To cite the package and the tutorial in publications use:", - textVersion = - paste("Hofner, B., A. Mayr, and M. Schmid (2015).", - "gamboostLSS: An R Package for Model Building and Variable Selection in the GAMLSS Framework.", - "Journal of Statistical Software. Accepted.") -) - - -citEntry( - entry="Article", - title = "Generalized additive models for location, scale and shape for high-dimensional data - a flexible approach based on boosting", - author = personList(as.person("Andreas Mayr"), - as.person("Nora Fenske"), - as.person("Benjamin Hofner"), - as.person("Thomas Kneib"), - as.person("Matthias Schmid")), - journal = "Journal of the Royal Statistical Society, Series C - Applied Statistics", - year = "2012", - volume = "61", - number = "3", - pages = "403--427", - header = "To cite the theory of 'gamboostLSS' use:", - textVersion = - paste("Mayr, A., N. Fenske, B. Hofner, T. Kneib and M. Schmid (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.") -) - - -citFooter('\nUse ', sQuote('toBibtex(citation("gamboostLSS"))'), ' to extract BibTeX references.') diff --git a/pkg/man/as.families.Rd b/pkg/man/as.families.Rd deleted file mode 100644 index d2e5b36..0000000 --- a/pkg/man/as.families.Rd +++ /dev/null @@ -1,163 +0,0 @@ -\name{as.families} -\alias{as.families} - -\alias{gamlss.Families} -\alias{gamlss1parMu} - -\alias{gamlss2parMu} -\alias{gamlss2parSigma} - -\alias{gamlss3parMu} -\alias{gamlss3parSigma} -\alias{gamlss3parNu} - -\alias{gamlss4parMu} -\alias{gamlss4parSigma} -\alias{gamlss4parNu} -\alias{gamlss4parTau} - -\title{ - Include \code{gamlss} families in the boosting framework of \code{gamboostLSS} -} - -\description{ - The function \code{as.families()} provides an interface to apply - the available distributions (families) of the \code{gamlss.dist} package - for boosting GAMLSS via \code{gamboostLSS}. - - The function automatically builds sub-families for every distribution - parameter and uses the constructor function \code{\link{Families}} to - build a \code{families} object, which can be then included in the - fitting functions \code{\link{gamboostLSS}} and - \code{\link{glmboostLSS}}. -} -\usage{ -as.families(fname = "NO", mu = NULL, sigma = NULL, - nu = NULL, tau = NULL, stabilization = c("none", "MAD")) - -## a wrapper to as.families: -gamlss.Families(...) -} - -\arguments{ - \item{fname}{ - name of the distribution in the \code{gamlss} framework, - as specified in the \code{gamlss.dist} package (e.g., \code{"NO"} for a - normal distribution with parameters \code{mu} and \code{sigma}). - Alternatively, one can directly specify the function (i.e., - \code{NO}) or the evaluated function \code{NO()}. - } - \item{mu}{possible offset value for parameter \code{mu}.} - \item{sigma}{possible offset value for parameter \code{sigma}.} - \item{nu}{possible offset value for parameter \code{nu}.} - \item{tau}{possible offset value for parameter \code{tau}.} - \item{stabilization}{ governs if the negative gradient should be - standardized in each boosting step. It can be either "none" or - "MAD". For details see \code{\link{Families}}. - } - \item{\ldots}{same arguments as above.} -} -\details{ - - The function aims at providing an interface to include all available - GAMLSS distributions which are implemented with the original - \code{gamlss.dist} package in the model-based boosting framework. The user - specifies the name of the family (as it is called in - \code{gamlss.dist}), and the function automatically builds the - corresponding \code{mboost}-like sub-families and the final - \code{families} object, which can be then used with the fitting - functions \code{\link{gamboostLSS}} and \code{\link{glmboostLSS}}. - - To extract the necessary information regarding partial derivatives - (for the \code{ngradient} - see \code{\link{Family}} for details) and - the log-likelihood (for the \code{loss}) the \code{gamlss.dist} - package is loaded. If the package is not installed yet, this will - prompt an error message. - - The functions \code{gamlss1parMu}, \code{gamlss2parMu}, - \code{gamlss2parSigma}, ... , \code{gamlss4parTau} are called - internally to construct the sub-families. For one-parametric - distributions, the function will prompt a warning and returns a - \code{\link{mboost}} family, which can be then used by the fitting - functions of the \code{\link{mboost}} package. - - For information on GAMLSS theory see Rigby and Stasinopoulos (2005), - lists of available distributions are provided at - \url{http://gamlss.org}. For more on details boosting GAMLSS see Mayr - et al. (2012). Hofner et al. (2015) provides a worked example and more - details on \code{as.families}. - - To (potentially) stabilize the model estimation by standardizing the - negative gradients one can use the argument \code{stabilization} of - the families. See \code{\link{Families}} for details. -} - -\author{ - The help of Mikis Stasinpoulos during the work on this function is - gratefully acknowledged. -} - -\value{ - An object of class \code{families}. If the user specifies a - one-parametric distribution, an object of class \code{family} is - returned. -} - -\references{ - - B. Hofner, A. Mayr, M. Schmid (2015). gamboostLSS: An R Package for - Model Building and Variable Selection in the GAMLSS Framework. - Journal of Statistical Software. Accepted for publication. - - Available as \code{vignette("gamboostLSS_Tutorial")}. - - 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, 507-554. - -} - -\seealso{ - \code{gamlss.dist} for available distributions in the \code{gamlss} - framework. - - \code{\link{Families}} for a documentation of pre-implemented - distributions for \code{gamboostLSS}, as well as possibilities for - user-defined distributions. -} -\examples{ -## simulate small example -set.seed(123) -x <- runif(1000) - -y <- rnorm(mean = 2 + 3 * x, # effect on mu - sd = exp( 1 - 1 * x ), # effect on sigma - n = 1000) - -## boosting -glmss <- glmboostLSS(y ~ x, families = as.families("NO")) -## the same: -if (require("gamlss.dist")) { - glmss <- glmboostLSS(y ~ x, families = as.families(NO)) - glmss <- glmboostLSS(y ~ x, families = as.families(NO())) -} - -coef(glmss, off2int = TRUE) - -## compare to gamlss -library(gamlss) -glmss2 <- gamlss(y ~ x, sigma.formula = ~x, family = "NO") -coef(glmss2) -glmss2$sigma.coef - -} - -\keyword{models} -\keyword{distributions} - diff --git a/pkg/man/gamboostLSS_intern.Rd b/pkg/man/gamboostLSS_intern.Rd deleted file mode 100644 index 7b08f5d..0000000 --- a/pkg/man/gamboostLSS_intern.Rd +++ /dev/null @@ -1,19 +0,0 @@ -\name{gamboostLSS_intern} -\alias{gamboostLSS_intern} -\title{ - Call internal functions. -} -\description{ - Call one of the internal gamboostLSS functions. -} -\usage{ -gamboostLSS_intern(..., fun = c("check", "do_trace")) -} -\arguments{ - \item{\dots}{ Arguments to \code{fun}. } - \item{fun}{ The name on an internal gamboostLSS function. } -} -\details{ - This function must not be called under any circumstances. -} -\keyword{internal} diff --git a/pkg/man/india.Rd b/pkg/man/india.Rd deleted file mode 100644 index aed230f..0000000 --- a/pkg/man/india.Rd +++ /dev/null @@ -1,67 +0,0 @@ -\name{india} -\alias{india} -\alias{india.bnd} -\docType{data} - -\title{ - Malnutrition of Children in India (DHS, 1998-99) -} - -\description{ - Data sample from the Standard Demographic and Health Survey, 1998-99, - on malnutrition of children in India. The data set contains - approximately 12\% of the observations in the original data set and - only a (very small) subset of variables. Additionally, a boundary - file representing the districts of India is provided for spatial analysis. -} - -\usage{ -data(india) -data(india.bnd) -} -\details{ - For details on the boundary file see function \code{\link[BayesX]{read.bnd}} - from package \pkg{BayesX}. -} - -\format{ - A data frame with 4000 observations on the following 6 variables: - \describe{ - \item{\code{stunting}}{A numeric z-score for malnutrition, stunted - growth to be more precise, which ranges from -6 to 6, where - negative values represent malnourished children. Children with - values below -2 are considered stunted (height-for-age).} - \item{\code{cbmi}}{BMI of the child.} - \item{\code{cage}}{Age of the child in months.} - \item{\code{mbmi}}{BMI of the mother.} - \item{\code{mage}}{Age of the mother in years.} - \item{\code{mcdist}}{The district in India, where mother and child live. - A factor encoded to match the map \code{\link{india.bnd}}.} - \item{\code{mcdist_lab}}{The district in India, where mother and child live. - A factor with actual district names.} - } -} - -\source{ - - The complete data set is provided by the Monitoring and Evaluation to - Assess and Use Results Demographic and Health Surveys (MEASURE DHS) - which is funded by the U.S. Agency of International Development - (USAID). It can be obtained for research purposes (after registration) - from - \url{http://www.measuredhs.com/what-we-do/survey/survey-display-156.cfm} - (Data set for All-India, Children's Recode: iakr42dt.zip) } - \references{ For details on the data set see also: - - Fahrmeir L and Kneib T (2011), - \emph{Bayesian smoothing and regression for longitudinal, spatial and - event history data}, Oxford University Press. - -} -\examples{ -if (require("BayesX")) { - ## plot distribution of stunting in India - drawmap(india, map = india.bnd, regionvar = "mcdist", plotvar = "stunting") -} -} -\keyword{datasets} diff --git a/pkg/man/weighted_median.Rd b/pkg/man/weighted_median.Rd deleted file mode 100644 index 0ccfbf9..0000000 --- a/pkg/man/weighted_median.Rd +++ /dev/null @@ -1,66 +0,0 @@ -\name{weighted.median} - -\alias{weighted.median} - -\title{ - Weighted Median -} -\description{ - Function to compute the weighted median. -} -\usage{ -weighted.median(x, w = 1, na.rm = FALSE) -} -\arguments{ - \item{x}{ - a numeric vector containing the values whose median is to be - computed. - } - \item{w}{ - weights that are used to compute the median. This can be either a - single value (which will be used as weight for all observations) - or a numeric vector of the same length as \code{x}. - } - \item{na.rm}{ - logical. Should \code{NA}s (from weights \code{w} and/or data - \code{x}) be removed? - } -} -\details{ - The weighted median is computed as the value where the cumulative - relative weights (relative to the sum of all weights) crosses 0.5. - - This function is used in the stabilization of the negative gradient - via the meadian absolute deviation (MAD). For details see Hofner et al - (2015). -} - -\references{ - B. Hofner, A. Mayr, M. Schmid (2015). gamboostLSS: An R Package for - Model Building and Variable Selection in the GAMLSS Framework. - Journal of Statistical Software. Accepted for publication. - - Available as \code{vignette("gamboostLSS_Tutorial")}. -} - -\seealso{ - - \code{\link{glmboostLSS}}, \code{\link{gamboostLSS}} and - \code{\link{blackboostLSS}} for fitting of GAMLSS where the - standardization is explained in more detail. - -} -\examples{ - -## compute the weighted median with case weights -x <- c(1, 2, 3, 4) -w <- c(0, 1, 2, 3) -weighted.median(x, w) - -## compute the weighted median with arbitrary weights -x <- rnorm(100) -w <- runif(100) -weighted.median(x, w) - -} -\keyword{methods} diff --git a/pkg/tests/Examples/gamboostLSS-Ex.Rout.save b/pkg/tests/Examples/gamboostLSS-Ex.Rout.save deleted file mode 100644 index 356229c..0000000 --- a/pkg/tests/Examples/gamboostLSS-Ex.Rout.save +++ /dev/null @@ -1,3613 +0,0 @@ - -R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree" -Copyright (C) 2015 The R Foundation for Statistical Computing -Platform: x86_64-pc-linux-gnu (64-bit) - -R is free software and comes with ABSOLUTELY NO WARRANTY. -You are welcome to redistribute it under certain conditions. -Type 'license()' or 'licence()' for distribution details. - - Natural language support but running in an English locale - -R is a collaborative project with many contributors. -Type 'contributors()' for more information and -'citation()' on how to cite R or R packages in publications. - -Type 'demo()' for some demos, 'help()' for on-line help, or -'help.start()' for an HTML browser interface to help. -Type 'q()' to quit R. - -> pkgname <- "gamboostLSS" -> source(file.path(R.home("share"), "R", "examples-header.R")) -> options(warn = 1) -> base::assign(".ExTimings", "gamboostLSS-Ex.timings", pos = 'CheckExEnv') -> base::cat("name\tuser\tsystem\telapsed\n", file=base::get(".ExTimings", pos = 'CheckExEnv')) -> base::assign(".format_ptime", -+ function(x) { -+ if(!is.na(x[4L])) x[1L] <- x[1L] + x[4L] -+ if(!is.na(x[5L])) x[2L] <- x[2L] + x[5L] -+ options(OutDec = '.') -+ format(x[1L:3L], digits = 7L) -+ }, -+ pos = 'CheckExEnv') -> -> ### * -> library('gamboostLSS') -Loading required package: mboost -Loading required package: parallel -Loading required package: stabs -This is mboost 2.6-0. See ‘package?mboost’ and ‘news(package = "mboost")’ -for a complete list of changes. - - -Attaching package: ‘gamboostLSS’ - -The following object is masked from ‘package:stats’: - - model.weights - -> -> base::assign(".oldSearch", base::search(), pos = 'CheckExEnv') -> cleanEx() -> nameEx("as.families") -> ### * as.families -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: as.families -> ### Title: Include 'gamlss' families in the boosting framework of -> ### 'gamboostLSS' -> ### Aliases: as.families gamlss.Families gamlss1parMu gamlss2parMu -> ### gamlss2parSigma gamlss3parMu gamlss3parSigma gamlss3parNu -> ### gamlss4parMu gamlss4parSigma gamlss4parNu gamlss4parTau -> ### Keywords: models distributions -> -> ### ** Examples -> -> ## simulate small example -> set.seed(123) -> x <- runif(1000) -> -> y <- rnorm(mean = 2 + 3 * x, # effect on mu -+ sd = exp( 1 - 1 * x ), # effect on sigma -+ n = 1000) -> -> ## boosting -> glmss <- glmboostLSS(y ~ x, families = as.families("NO")) -> ## the same: -> if (require("gamlss.dist")) { -+ glmss <- glmboostLSS(y ~ x, families = as.families(NO)) -+ glmss <- glmboostLSS(y ~ x, families = as.families(NO())) -+ } -Loading required package: gamlss.dist -Loading required package: MASS - -Attaching package: ‘gamlss.dist’ - -The following object is masked from ‘package:mboost’: - - Family - -> -> coef(glmss, off2int = TRUE) -$mu -(Intercept) x - 2.114767 2.824394 - -$sigma -(Intercept) x - 1.031368 -1.062068 - -> -> ## compare to gamlss -> library(gamlss) -Loading required package: splines -Loading required package: gamlss.data -Loading required package: nlme - ********** GAMLSS Version 4.3-8 ********** -For more on GAMLSS look at http://www.gamlss.org/ -Type gamlssNews() to see new features/changes/bug fixes. - -> glmss2 <- gamlss(y ~ x, sigma.formula = ~x, family = "NO") -GAMLSS-RS iteration 1: Global Deviance = 3844.26 -GAMLSS-RS iteration 2: Global Deviance = 3844.149 -GAMLSS-RS iteration 3: Global Deviance = 3844.149 -> coef(glmss2) -(Intercept) x - 2.110191 2.845264 -> glmss2$sigma.coef -(Intercept) x - 1.031275 -1.062060 -> -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("as.families", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> cleanEx() - -detaching ‘package:gamlss’, ‘package:nlme’, ‘package:gamlss.data’, - ‘package:splines’, ‘package:gamlss.dist’, ‘package:MASS’ - -> nameEx("cvrisk") -> ### * cvrisk -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: cvrisk.mboostLSS -> ### Title: Cross-Validation -> ### Aliases: cvrisk cvrisk.mboostLSS make.grid plot.cvriskLSS -> ### Keywords: models regression -> -> ### ** Examples -> -> ## Data generating process: -> set.seed(1907) -> x1 <- rnorm(1000) -> x2 <- rnorm(1000) -> x3 <- rnorm(1000) -> x4 <- rnorm(1000) -> x5 <- rnorm(1000) -> x6 <- rnorm(1000) -> mu <- exp(1.5 +1 * x1 +0.5 * x2 -0.5 * x3 -1 * x4) -> sigma <- exp(-0.4 * x3 -0.2 * x4 +0.2 * x5 +0.4 * x6) -> y <- numeric(1000) -> for( i in 1:1000) -+ y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) -> dat <- data.frame(x1, x2, x3, x4, x5, x6, y) -> -> ## linear model with y ~ . for both components: 100 boosting iterations -> model <- glmboostLSS(y ~ ., families = NBinomialLSS(), data = dat, -+ control = boost_control(mstop = 100), -+ center = TRUE) -> -> ## set up a grid -> grid <- make.grid(mstop(model), length.out = 5, dense_mu_grid = FALSE) -> plot(grid) -> -> ## No test: -> ### Do not test the following code per default on CRAN as it takes some time to run: -> ### a tiny toy example (5-fold bootsrap with maximum stopping value 100) -> ## (to run it on multiple cores of a Linux or Mac OS computer remove -> ## set papply = mclapply (default) and set mc.nodes to the -> ## appropriate number of nodes) -> cvr <- cvrisk(model, folds = cv(model.weights(model), B = 5), -+ papply = lapply, grid = grid) -Starting cross-validation... -[fold] [current mstop] - [1] [1,1] - [1] [3,1] - [1] [10,1] - [1] [32,1] - [1] [100,1] - [1] [1,3] - [1] [3,3] - [1] [10,3] - [1] [32,3] - [1] [100,3] - [1] [1,10] - [1] [3,10] - [1] [10,10] - [1] [32,10] - [1] [100,10] - [1] [1,32] - [1] [3,32] - [1] [10,32] - [1] [32,32] - [1] [100,32] - [1] [1,100] - [1] [3,100] - [1] [10,100] - [1] [32,100] - [1] [100,100] - [2] [1,1] - [2] [3,1] - [2] [10,1] - [2] [32,1] - [2] [100,1] - [2] [1,3] - [2] [3,3] - [2] [10,3] - [2] [32,3] - [2] [100,3] - [2] [1,10] - [2] [3,10] - [2] [10,10] - [2] [32,10] - [2] [100,10] - [2] [1,32] - [2] [3,32] - [2] [10,32] - [2] [32,32] - [2] [100,32] - [2] [1,100] - [2] [3,100] - [2] [10,100] - [2] [32,100] - [2] [100,100] - [3] [1,1] - [3] [3,1] - [3] [10,1] - [3] [32,1] - [3] [100,1] - [3] [1,3] - [3] [3,3] - [3] [10,3] - [3] [32,3] - [3] [100,3] - [3] [1,10] - [3] [3,10] - [3] [10,10] - [3] [32,10] - [3] [100,10] - [3] [1,32] - [3] [3,32] - [3] [10,32] - [3] [32,32] - [3] [100,32] - [3] [1,100] - [3] [3,100] - [3] [10,100] - [3] [32,100] - [3] [100,100] - [4] [1,1] - [4] [3,1] - [4] [10,1] - [4] [32,1] - [4] [100,1] - [4] [1,3] - [4] [3,3] - [4] [10,3] - [4] [32,3] - [4] [100,3] - [4] [1,10] - [4] [3,10] - [4] [10,10] - [4] [32,10] - [4] [100,10] - [4] [1,32] - [4] [3,32] - [4] [10,32] - [4] [32,32] - [4] [100,32] - [4] [1,100] - [4] [3,100] - [4] [10,100] - [4] [32,100] - [4] [100,100] - [5] [1,1] - [5] [3,1] - [5] [10,1] - [5] [32,1] - [5] [100,1] - [5] [1,3] - [5] [3,3] - [5] [10,3] - [5] [32,3] - [5] [100,3] - [5] [1,10] - [5] [3,10] - [5] [10,10] - [5] [32,10] - [5] [100,10] - [5] [1,32] - [5] [3,32] - [5] [10,32] - [5] [32,32] - [5] [100,32] - [5] [1,100] - [5] [3,100] - [5] [10,100] - [5] [32,100] - [5] [100,100] -> cvr - - Cross-validated risk - glmboostLSS(formula = y ~ ., data = dat, families = NBinomialLSS(), control = boost_control(mstop = 100), center = TRUE) - - 1,1 3,1 10,1 32,1 100,1 1,3 3,3 10,3 -3.302710 3.289003 3.254355 3.201048 3.132957 3.299061 3.285124 3.249949 - 32,3 100,3 1,10 3,10 10,10 32,10 100,10 1,32 -3.195998 3.128614 3.292346 3.277996 3.240225 3.182837 3.117276 3.289440 - 3,32 10,32 32,32 100,32 1,100 3,100 10,100 32,100 -3.273384 3.228145 3.151754 3.088634 3.290803 3.272903 3.222363 3.120687 - 100,100 -3.020682 - - Optimal number of boosting iterations: 100 100 -> ## plot the results -> par(mfrow = c(1, 2)) -> plot(cvr) -> plot(cvr, type = "lines") -> ## extract optimal mstop (here: grid to small) -> mstop(cvr) - mu sigma - 100 100 -> ### END (don't test automatically) -> ## End(No test) -> -> ## No test: -> ### Do not test the following code per default on CRAN as it takes some time to run: -> ### a more realistic example -> grid <- make.grid(c(mu = 400, sigma = 400), dense_mu_grid = FALSE) -> plot(grid) -> cvr <- cvrisk(model, grid = grid) -Starting cross-validation... -[fold] [current mstop] - [2] [1,1] - [2] [2,1] - [2] [4,1] - [2] [7,1] - [2] [14,1] - [1] [1,1] - [1] [2,1] - [1] [4,1] - [1] [7,1] - [2] [28,1] - [1] [14,1] - [1] [28,1] - [2] [54,1] - [1] [54,1] - [2] [106,1] - [1] [106,1] - [2] [206,1] - [1] [206,1] - [2] [400,1] - [2] [1,2] - [2] [2,2] - [2] [4,2] - [2] [7,2] - [2] [14,2] - [1] [400,1] - [1] [1,2] - [1] [2,2] - [2] [28,2] - [1] [4,2] - [1] [7,2] - [1] [14,2] - [2] [54,2] - [1] [28,2] - [1] [54,2] - [2] [106,2] - [1] [106,2] - [2] [206,2] - [1] [206,2] - [2] [400,2] - [2] [1,4] - [2] [2,4] - [2] [4,4] - [2] [7,4] - [2] [14,4] - [2] [28,4] - [2] [54,4] - [1] [400,2] - [1] [1,4] - [1] [2,4] - [1] [4,4] - [1] [7,4] - [1] [14,4] - [2] [106,4] - [1] [28,4] - [1] [54,4] - [1] [106,4] - [2] [206,4] - [1] [206,4] - [2] [400,4] - [2] [1,7] - [2] [2,7] - [2] [4,7] - [2] [7,7] - [2] [14,7] - [2] [28,7] - [1] [400,4] - [2] [54,7] - [1] [1,7] - [1] [2,7] - [1] [4,7] - [1] [7,7] - [1] [14,7] - [2] [106,7] - [1] [28,7] - [1] [54,7] - [2] [206,7] - [1] [106,7] - [1] [206,7] - [2] [400,7] - [2] [1,14] - [2] [2,14] - [2] [4,14] - [2] [7,14] - [2] [14,14] - [2] [28,14] - [2] [54,14] - [1] [400,7] - [1] [1,14] - [1] [2,14] - [1] [4,14] - [1] [7,14] - [1] [14,14] - [1] [28,14] - [2] [106,14] - [1] [54,14] - [2] [206,14] - [1] [106,14] - [1] [206,14] - [2] [400,14] - [2] [1,28] - [2] [2,28] - [2] [4,28] - [1] [400,14] - [2] [7,28] - [1] [1,28] - [2] [14,28] - [1] [2,28] - [2] [28,28] - [1] [4,28] - [2] [54,28] - [1] [7,28] - [2] [106,28] - [1] [14,28] - [1] [28,28] - [1] [54,28] - [2] [206,28] - [1] [106,28] - [1] [206,28] - [2] [400,28] - [2] [1,54] - [1] [400,28] - [2] [2,54] - [1] [1,54] - [2] [4,54] - [1] [2,54] - [2] [7,54] - [1] [4,54] - [1] [7,54] - [2] [14,54] - [1] [14,54] - [2] [28,54] - [1] [28,54] - [2] [54,54] - [1] [54,54] - [2] [106,54] - [1] [106,54] - [2] [206,54] - [1] [206,54] - [2] [400,54] - [1] [400,54] - [2] [1,106] - [1] [1,106] - [2] [2,106] - [1] [2,106] - [2] [4,106] - [1] [4,106] - [2] [7,106] - [1] [7,106] - [2] [14,106] - [1] [14,106] - [2] [28,106] - [1] [28,106] - [1] [54,106] - [2] [54,106] - [1] [106,106] - [2] [106,106] - [1] [206,106] - [2] [206,106] - [1] [400,106] - [2] [400,106] - [1] [1,206] - [2] [1,206] - [1] [2,206] - [2] [2,206] - [2] [4,206] - [1] [4,206] - [1] [7,206] - [2] [7,206] - [2] [14,206] - [1] [14,206] - [2] [28,206] - [1] [28,206] - [2] [54,206] - [1] [54,206] - [2] [106,206] - [1] [106,206] - [2] [206,206] - [2] [400,206] - [1] [206,206] - [1] [400,206] - [2] [1,400] - [1] [1,400] - [2] [2,400] - [1] [2,400] - [2] [4,400] - [1] [4,400] - [2] [7,400] - [1] [7,400] - [1] [14,400] - [2] [14,400] - [1] [28,400] - [2] [28,400] - [1] [54,400] - [2] [54,400] - [1] [106,400] - [2] [106,400] - [1] [206,400] - [2] [206,400] - [1] [400,400] - [3] [1,1] - [3] [2,1] - [3] [4,1] - [3] [7,1] - [3] [14,1] - [3] [28,1] - [3] [54,1] - [3] [106,1] - [2] [400,400] - [4] [1,1] - [4] [2,1] - [4] [4,1] - [4] [7,1] - [4] [14,1] - [4] [28,1] - [4] [54,1] - [4] [106,1] - [3] [400,1] - [3] [1,2] - [3] [2,2] - [3] [4,2] - [3] [7,2] - [3] [14,2] - [3] [28,2] - [4] [206,1] - [3] [54,2] - [3] [106,2] - [3] [206,2] - [4] [400,1] - [4] [1,2] - [4] [2,2] - [4] [4,2] - [4] [7,2] - [4] [14,2] - [4] [28,2] - [4] [54,2] - [4] [106,2] - [3] [400,2] - [3] [1,4] - [3] [2,4] - [3] [4,4] - [3] [7,4] - [3] [14,4] - [3] [28,4] - [4] [206,2] - [3] [54,4] - [3] [106,4] - [4] [400,2] - [4] [1,4] - [4] [2,4] - [4] [4,4] - [4] [7,4] - [4] [14,4] - [4] [28,4] - [4] [54,4] - [4] [106,4] - [4] [206,4] - [3] [400,4] - [3] [1,7] - [3] [2,7] - [3] [4,7] - [3] [7,7] - [3] [14,7] - [3] [28,7] - [3] [54,7] - [3] [106,7] - [4] [400,4] - [4] [1,7] - [3] [206,7] - [4] [2,7] - [4] [4,7] - [4] [7,7] - [4] [14,7] - [4] [28,7] - [4] [54,7] - [4] [106,7] - [3] [400,7] - [3] [1,14] - [3] [2,14] - [3] [4,14] - [3] [7,14] - [4] [206,7] - [3] [14,14] - [3] [28,14] - [3] [54,14] - [3] [106,14] - [4] [400,7] - [3] [206,14] - [4] [1,14] - [4] [2,14] - [4] [4,14] - [4] [7,14] - [4] [14,14] - [4] [28,14] - [4] [54,14] - [3] [400,14] - [4] [106,14] - [3] [1,28] - [3] [2,28] - [3] [4,28] - [4] [206,14] - [3] [7,28] - [3] [14,28] - [3] [28,28] - [3] [54,28] - [3] [106,28] - [3] [206,28] - [4] [400,14] - [4] [1,28] - [4] [2,28] - [4] [4,28] - [4] [7,28] - [3] [400,28] - [4] [14,28] - [4] [28,28] - [4] [54,28] - [3] [1,54] - [4] [106,28] - [3] [2,54] - [4] [206,28] - [3] [4,54] - [3] [7,54] - [3] [14,54] - [4] [400,28] - [3] [28,54] - [4] [1,54] - [3] [54,54] - [4] [2,54] - [3] [106,54] - [4] [4,54] - [4] [7,54] - [3] [206,54] - [4] [14,54] - [4] [28,54] - [4] [54,54] - [3] [400,54] - [4] [106,54] - [4] [206,54] - [3] [1,106] - [3] [2,106] - [4] [400,54] - [3] [4,106] - [4] [1,106] - [3] [7,106] - [4] [2,106] - [3] [14,106] - [4] [4,106] - [3] [28,106] - [4] [7,106] - [3] [54,106] - [3] [106,106] - [4] [14,106] - [3] [206,106] - [4] [28,106] - [3] [400,106] - [4] [54,106] - [4] [106,106] - [4] [206,106] - [3] [1,206] - [4] [400,106] - [3] [2,206] - [4] [1,206] - [3] [4,206] - [4] [2,206] - [3] [7,206] - [4] [4,206] - [3] [14,206] - [4] [7,206] - [3] [28,206] - [4] [14,206] - [3] [54,206] - [4] [28,206] - [3] [106,206] - [4] [54,206] - [3] [206,206] - [4] [106,206] - [3] [400,206] - [4] [206,206] - [4] [400,206] - [3] [1,400] - [4] [1,400] - [3] [2,400] - [4] [2,400] - [3] [4,400] - [4] [4,400] - [3] [7,400] - [4] [7,400] - [3] [14,400] - [4] [14,400] - [3] [28,400] - [4] [28,400] - [3] [54,400] - [4] [54,400] - [3] [106,400] - [4] [106,400] - [3] [206,400] - [3] [400,400] - [5] [1,1] - [5] [2,1] - [5] [4,1] - [5] [7,1] - [5] [14,1] - [5] [28,1] - [4] [206,400] - [5] [54,1] - [5] [106,1] - [5] [206,1] - [5] [400,1] - [5] [1,2] - [5] [2,2] - [5] [4,2] - [5] [7,2] - [5] [14,2] - [4] [400,400] - [5] [28,2] - [6] [1,1] - [6] [2,1] - [6] [4,1] - [6] [7,1] - [6] [14,1] - [5] [54,2] - [6] [28,1] - [5] [106,2] - [6] [54,1] - [6] [106,1] - [5] [206,2] - [6] [206,1] - [5] [400,2] - [5] [1,4] - [5] [2,4] - [5] [4,4] - [5] [7,4] - [6] [400,1] - [6] [1,2] - [6] [2,2] - [6] [4,2] - [6] [7,2] - [6] [14,2] - [5] [54,4] - [6] [28,2] - [6] [54,2] - [6] [106,2] - [5] [106,4] - [6] [206,2] - [5] [206,4] - [6] [400,2] - [6] [1,4] - [6] [2,4] - [6] [4,4] - [6] [7,4] - [5] [400,4] - [5] [1,7] - [5] [2,7] - [6] [14,4] - [5] [4,7] - [5] [7,7] - [5] [14,7] - [5] [28,7] - [6] [54,4] - [5] [54,7] - [6] [106,4] - [5] [106,7] - [6] [206,4] - [5] [206,7] - [6] [400,4] - [6] [1,7] - [6] [2,7] - [5] [400,7] - [6] [4,7] - [5] [1,14] - [6] [7,7] - [6] [14,7] - [5] [2,14] - [6] [28,7] - [5] [4,14] - [5] [7,14] - [6] [54,7] - [5] [14,14] - [5] [28,14] - [6] [106,7] - [5] [54,14] - [5] [106,14] - [6] [206,7] - [5] [206,14] - [6] [400,7] - [6] [1,14] - [6] [2,14] - [6] [4,14] - [6] [7,14] - [6] [14,14] - [5] [400,14] - [6] [28,14] - [6] [54,14] - [5] [1,28] - [5] [2,28] - [6] [106,14] - [5] [4,28] - [5] [7,28] - [5] [14,28] - [5] [28,28] - [6] [206,14] - [5] [54,28] - [5] [106,28] - [5] [206,28] - [6] [400,14] - [6] [1,28] - [6] [2,28] - [6] [4,28] - [5] [400,28] - [6] [7,28] - [6] [14,28] - [5] [1,54] - [6] [28,28] - [5] [2,54] - [6] [54,28] - [6] [106,28] - [5] [4,54] - [6] [206,28] - [5] [7,54] - [5] [14,54] - [5] [28,54] - [5] [54,54] - [6] [400,28] - [5] [106,54] - [6] [1,54] - [6] [2,54] - [5] [206,54] - [6] [4,54] - [6] [7,54] - [5] [400,54] - [6] [14,54] - [6] [28,54] - [6] [54,54] - [5] [1,106] - [6] [106,54] - [6] [206,54] - [5] [2,106] - [5] [4,106] - [6] [400,54] - [5] [7,106] - [6] [1,106] - [5] [14,106] - [6] [2,106] - [5] [28,106] - [5] [54,106] - [6] [4,106] - [5] [106,106] - [6] [7,106] - [5] [206,106] - [6] [14,106] - [5] [400,106] - [6] [28,106] - [6] [54,106] - [6] [106,106] - [5] [1,206] - [6] [206,106] - [6] [400,106] - [5] [2,206] - [6] [1,206] - [5] [4,206] - [6] [2,206] - [5] [7,206] - [6] [4,206] - [5] [14,206] - [6] [7,206] - [5] [28,206] - [6] [14,206] - [5] [54,206] - [6] [28,206] - [5] [106,206] - [6] [54,206] - [5] [206,206] - [6] [106,206] - [5] [400,206] - [6] [206,206] - [6] [400,206] - [5] [1,400] - [6] [1,400] - [5] [2,400] - [6] [2,400] - [5] [4,400] - [6] [4,400] - [5] [7,400] - [6] [7,400] - [5] [14,400] - [6] [14,400] - [5] [28,400] - [6] [28,400] - [5] [54,400] - [6] [54,400] - [5] [106,400] - [6] [106,400] - [5] [206,400] - [5] [400,400] - [7] [1,1] - [7] [2,1] - [7] [4,1] - [7] [7,1] - [7] [14,1] - [6] [206,400] - [7] [28,1] - [7] [54,1] - [7] [106,1] - [7] [206,1] - [6] [400,400] - [8] [1,1] - [8] [2,1] - [8] [4,1] - [8] [7,1] - [8] [14,1] - [8] [28,1] - [7] [400,1] - [7] [1,2] - [7] [2,2] - [7] [4,2] - [7] [7,2] - [7] [14,2] - [8] [54,1] - [7] [28,2] - [7] [54,2] - [7] [106,2] - [8] [106,1] - [7] [206,2] - [8] [206,1] - [7] [400,2] - [8] [400,1] - [8] [1,2] - [8] [2,2] - [8] [4,2] - [7] [4,4] - [7] [7,4] - [7] [14,4] - [8] [28,2] - [7] [28,4] - [8] [54,2] - [7] [54,4] - [8] [106,2] - [7] [106,4] - [8] [206,2] - [7] [206,4] - [8] [400,2] - [8] [1,4] - [7] [400,4] - [8] [2,4] - [8] [4,4] - [7] [1,7] - [8] [7,4] - [8] [14,4] - [7] [2,7] - [7] [4,7] - [8] [28,4] - [7] [7,7] - [7] [14,7] - [7] [28,7] - [7] [54,7] - [8] [106,4] - [7] [106,7] - [8] [206,4] - [7] [206,7] - [8] [400,4] - [8] [1,7] - [8] [2,7] - [8] [4,7] - [8] [7,7] - [8] [14,7] - [8] [28,7] - [8] [54,7] - [7] [400,7] - [7] [1,14] - [8] [106,7] - [7] [2,14] - [7] [4,14] - [7] [7,14] - [7] [14,14] - [7] [28,14] - [7] [54,14] - [8] [206,7] - [7] [106,14] - [7] [206,14] - [8] [400,7] - [8] [1,14] - [8] [2,14] - [8] [4,14] - [8] [7,14] - [8] [14,14] - [8] [28,14] - [8] [54,14] - [7] [400,14] - [8] [106,14] - [7] [1,28] - [7] [2,28] - [7] [4,28] - [8] [206,14] - [7] [7,28] - [7] [14,28] - [7] [28,28] - [7] [54,28] - [7] [106,28] - [8] [400,14] - [7] [206,28] - [8] [1,28] - [8] [2,28] - [8] [4,28] - [8] [7,28] - [8] [14,28] - [8] [28,28] - [8] [54,28] - [7] [400,28] - [8] [106,28] - [7] [1,54] - [8] [206,28] - [7] [2,54] - [7] [4,54] - [7] [7,54] - [8] [400,28] - [7] [14,54] - [8] [1,54] - [7] [28,54] - [7] [54,54] - [8] [2,54] - [7] [106,54] - [8] [4,54] - [7] [206,54] - [8] [7,54] - [8] [14,54] - [8] [28,54] - [8] [54,54] - [8] [106,54] - [7] [400,54] - [8] [206,54] - [7] [1,106] - [7] [2,106] - [8] [400,54] - [7] [4,106] - [8] [1,106] - [7] [7,106] - [7] [14,106] - [8] [2,106] - [8] [4,106] - [7] [28,106] - [8] [7,106] - [7] [54,106] - [7] [106,106] - [8] [14,106] - [7] [206,106] - [8] [28,106] - [7] [400,106] - [8] [54,106] - [8] [106,106] - [8] [206,106] - [7] [1,206] - [8] [400,106] - [7] [2,206] - [8] [1,206] - [7] [4,206] - [8] [2,206] - [7] [7,206] - [8] [4,206] - [7] [14,206] - [8] [7,206] - [7] [28,206] - [8] [14,206] - [7] [54,206] - [8] [28,206] - [7] [106,206] - [7] [206,206] - [8] [54,206] - [7] [400,206] - [8] [106,206] - [8] [206,206] - [8] [400,206] - [7] [1,400] - [8] [1,400] - [7] [2,400] - [8] [2,400] - [7] [4,400] - [8] [4,400] - [7] [7,400] - [8] [7,400] - [7] [14,400] - [8] [14,400] - [7] [28,400] - [8] [28,400] - [7] [54,400] - [8] [54,400] - [7] [106,400] - [7] [206,400] - [8] [106,400] - [7] [400,400] - [9] [1,1] - [9] [2,1] - [9] [4,1] - [9] [7,1] - [9] [14,1] - [9] [28,1] - [9] [54,1] - [8] [206,400] - [9] [106,1] - [9] [206,1] - [9] [400,1] - [9] [1,2] - [9] [2,2] - [9] [4,2] - [9] [7,2] - [9] [14,2] - [9] [28,2] - [8] [400,400] - [10] [1,1] - [10] [2,1] - [9] [54,2] - [10] [7,1] - [10] [14,1] - [9] [106,2] - [10] [28,1] - [9] [206,2] - [10] [54,1] - [10] [106,1] - [9] [400,2] - [9] [1,4] - [9] [2,4] - [10] [206,1] - [9] [7,4] - [9] [14,4] - [9] [28,4] - [9] [54,4] - [9] [106,4] - [9] [206,4] - [10] [400,1] - [10] [1,2] - [10] [2,2] - [10] [4,2] - [10] [7,2] - [10] [14,2] - [10] [28,2] - [10] [54,2] - [10] [106,2] - [9] [400,4] - [9] [1,7] - [9] [2,7] - [9] [4,7] - [9] [7,7] - [9] [14,7] - [10] [206,2] - [9] [28,7] - [9] [54,7] - [9] [106,7] - [10] [400,2] - [10] [1,4] - [10] [2,4] - [10] [4,4] - [10] [7,4] - [10] [14,4] - [9] [206,7] - [10] [28,4] - [10] [54,4] - [10] [106,4] - [10] [206,4] - [9] [400,7] - [9] [1,14] - [9] [2,14] - [9] [4,14] - [9] [7,14] - [9] [14,14] - [9] [28,14] - [9] [54,14] - [10] [400,4] - [10] [1,7] - [10] [2,7] - [10] [4,7] - [10] [7,7] - [10] [14,7] - [10] [28,7] - [10] [54,7] - [9] [206,14] - [10] [106,7] - [10] [206,7] - [9] [400,14] - [9] [1,28] - [9] [2,28] - [9] [4,28] - [10] [400,7] - [10] [1,14] - [10] [2,14] - [9] [14,28] - [10] [4,14] - [10] [7,14] - [9] [28,28] - [10] [14,14] - [10] [28,14] - [10] [54,14] - [9] [106,28] - [10] [106,14] - [9] [206,28] - [9] [400,28] - [10] [400,14] - [10] [1,28] - [9] [1,54] - [10] [2,28] - [10] [4,28] - [10] [7,28] - [9] [2,54] - [10] [14,28] - [10] [28,28] - [10] [54,28] - [9] [4,54] - [10] [106,28] - [9] [7,54] - [10] [206,28] - [9] [14,54] - [9] [28,54] - [9] [54,54] - [10] [400,28] - [9] [106,54] - [10] [1,54] - [9] [206,54] - [10] [2,54] - [10] [4,54] - [10] [7,54] - [9] [400,54] - [10] [14,54] - [10] [28,54] - [9] [1,106] - [10] [54,54] - [10] [106,54] - [9] [2,106] - [10] [206,54] - [9] [4,106] - [10] [400,54] - [9] [7,106] - [10] [1,106] - [9] [14,106] - [10] [2,106] - [9] [28,106] - [10] [4,106] - [9] [54,106] - [9] [106,106] - [10] [7,106] - [9] [206,106] - [10] [14,106] - [9] [400,106] - [10] [28,106] - [10] [54,106] - [10] [106,106] - [9] [1,206] - [10] [206,106] - [10] [400,106] - [9] [2,206] - [10] [1,206] - [9] [4,206] - [10] [2,206] - [9] [7,206] - [10] [4,206] - [9] [14,206] - [10] [7,206] - [9] [28,206] - [10] [14,206] - [9] [54,206] - [10] [28,206] - [9] [106,206] - [10] [54,206] - [9] [206,206] - [10] [106,206] - [9] [400,206] - [10] [206,206] - [10] [400,206] - [9] [1,400] - [10] [1,400] - [9] [2,400] - [10] [2,400] - [9] [4,400] - [10] [4,400] - [9] [7,400] - [10] [7,400] - [9] [14,400] - [10] [14,400] - [9] [28,400] - [9] [54,400] - [10] [28,400] - [10] [54,400] - [9] [106,400] - [9] [206,400] - [10] [106,400] - [9] [400,400] - [11] [1,1] - [11] [2,1] - [11] [4,1] - [11] [7,1] - [11] [14,1] - [11] [28,1] - [10] [206,400] - [11] [54,1] - [11] [106,1] - [11] [206,1] - [11] [400,1] - [11] [1,2] - [11] [2,2] - [11] [4,2] - [11] [7,2] - [11] [14,2] - [11] [28,2] - [10] [400,400] - [12] [1,1] - [12] [2,1] - [12] [4,1] - [12] [7,1] - [11] [54,2] - [12] [14,1] - [12] [28,1] - [12] [54,1] - [12] [106,1] - [11] [106,2] - [11] [206,2] - [12] [206,1] - [11] [400,2] - [11] [1,4] - [11] [2,4] - [11] [4,4] - [12] [400,1] - [12] [1,2] - [12] [2,2] - [12] [4,2] - [12] [7,2] - [12] [14,2] - [11] [28,4] - [12] [28,2] - [11] [54,4] - [12] [54,2] - [12] [106,2] - [11] [106,4] - [12] [206,2] - [11] [206,4] - [11] [400,4] - [11] [1,7] - [11] [2,7] - [11] [4,7] - [11] [7,7] - [11] [14,7] - [11] [28,7] - [11] [54,7] - [12] [400,2] - [12] [1,4] - [12] [2,4] - [12] [4,4] - [12] [7,4] - [12] [14,4] - [12] [28,4] - [12] [54,4] - [12] [106,4] - [11] [206,7] - [12] [206,4] - [11] [400,7] - [11] [1,14] - [11] [2,14] - [11] [4,14] - [11] [7,14] - [12] [400,4] - [11] [14,14] - [12] [1,7] - [11] [28,14] - [12] [2,7] - [12] [4,7] - [12] [7,7] - [12] [14,7] - [11] [54,14] - [12] [28,7] - [12] [54,7] - [11] [106,14] - [12] [106,7] - [11] [206,14] - [12] [206,7] - [11] [400,14] - [11] [1,28] - [11] [2,28] - [11] [4,28] - [12] [400,7] - [12] [1,14] - [11] [7,28] - [11] [14,28] - [12] [2,14] - [11] [28,28] - [12] [4,14] - [12] [7,14] - [12] [14,14] - [12] [28,14] - [11] [54,28] - [12] [54,14] - [11] [106,28] - [12] [106,14] - [11] [206,28] - [12] [206,14] - [11] [400,28] - [12] [400,14] - [11] [1,54] - [12] [1,28] - [12] [2,28] - [12] [4,28] - [12] [7,28] - [11] [4,54] - [12] [14,28] - [12] [28,28] - [11] [7,54] - [12] [54,28] - [12] [106,28] - [11] [14,54] - [11] [28,54] - [12] [206,28] - [11] [54,54] - [11] [106,54] - [11] [206,54] - [12] [400,28] - [12] [1,54] - [12] [2,54] - [11] [400,54] - [12] [4,54] - [11] [1,106] - [12] [7,54] - [12] [14,54] - [12] [28,54] - [11] [2,106] - [12] [54,54] - [12] [106,54] - [11] [4,106] - [11] [7,106] - [12] [400,54] - [11] [14,106] - [12] [1,106] - [11] [28,106] - [12] [2,106] - [11] [54,106] - [11] [106,106] - [11] [206,106] - [12] [7,106] - [11] [400,106] - [12] [14,106] - [12] [28,106] - [11] [1,206] - [12] [54,106] - [12] [106,106] - [12] [206,106] - [11] [2,206] - [12] [400,106] - [11] [4,206] - [12] [1,206] - [11] [7,206] - [12] [2,206] - [11] [14,206] - [12] [4,206] - [11] [28,206] - [12] [7,206] - [11] [54,206] - [12] [14,206] - [11] [106,206] - [11] [206,206] - [12] [28,206] - [11] [400,206] - [12] [54,206] - [12] [106,206] - [12] [206,206] - [11] [1,400] - [12] [400,206] - [11] [2,400] - [12] [1,400] - [11] [4,400] - [12] [2,400] - [11] [7,400] - [12] [4,400] - [11] [14,400] - [12] [7,400] - [11] [28,400] - [12] [14,400] - [11] [54,400] - [12] [28,400] - [11] [106,400] - [12] [54,400] - [12] [106,400] - [11] [206,400] - [11] [400,400] - [13] [1,1] - [13] [2,1] - [13] [4,1] - [13] [7,1] - [13] [14,1] - [13] [28,1] - [13] [54,1] - [13] [106,1] - [13] [206,1] - [12] [400,400] - [14] [1,1] - [14] [2,1] - [14] [4,1] - [14] [7,1] - [14] [14,1] - [14] [28,1] - [13] [400,1] - [13] [1,2] - [13] [2,2] - [13] [4,2] - [14] [54,1] - [13] [7,2] - [13] [14,2] - [13] [28,2] - [13] [54,2] - [14] [106,1] - [13] [106,2] - [14] [206,1] - [13] [206,2] - [13] [400,2] - [13] [1,4] - [13] [2,4] - [13] [4,4] - [13] [7,4] - [13] [14,4] - [13] [28,4] - [13] [54,4] - [14] [400,1] - [14] [1,2] - [14] [2,2] - [14] [4,2] - [14] [7,2] - [14] [14,2] - [14] [28,2] - [14] [54,2] - [14] [106,2] - [13] [206,4] - [14] [206,2] - [13] [400,4] - [13] [1,7] - [13] [2,7] - [13] [4,7] - [13] [7,7] - [13] [14,7] - [13] [28,7] - [13] [54,7] - [14] [400,2] - [14] [1,4] - [14] [2,4] - [14] [4,4] - [14] [7,4] - [14] [14,4] - [13] [106,7] - [14] [28,4] - [14] [54,4] - [13] [206,7] - [14] [106,4] - [14] [206,4] - [13] [400,7] - [13] [1,14] - [13] [2,14] - [13] [4,14] - [13] [7,14] - [13] [14,14] - [13] [28,14] - [14] [400,4] - [13] [54,14] - [14] [1,7] - [14] [2,7] - [14] [4,7] - [14] [7,7] - [14] [14,7] - [13] [106,14] - [14] [28,7] - [14] [54,7] - [14] [106,7] - [13] [206,14] - [14] [206,7] - [13] [400,14] - [13] [1,28] - [13] [2,28] - [13] [4,28] - [14] [400,7] - [14] [1,14] - [13] [7,28] - [14] [2,14] - [14] [4,14] - [13] [14,28] - [14] [7,14] - [14] [14,14] - [13] [28,28] - [14] [28,14] - [14] [54,14] - [13] [54,28] - [14] [106,14] - [13] [106,28] - [14] [206,14] - [13] [206,28] - [14] [400,14] - [14] [1,28] - [13] [400,28] - [14] [2,28] - [14] [4,28] - [13] [1,54] - [14] [14,28] - [14] [28,28] - [13] [2,54] - [14] [54,28] - [14] [106,28] - [13] [4,54] - [13] [7,54] - [14] [206,28] - [13] [14,54] - [13] [28,54] - [14] [400,28] - [13] [54,54] - [13] [106,54] - [14] [1,54] - [13] [206,54] - [14] [2,54] - [14] [4,54] - [14] [7,54] - [13] [400,54] - [14] [14,54] - [14] [28,54] - [14] [54,54] - [13] [1,106] - [14] [106,54] - [14] [206,54] - [13] [2,106] - [13] [4,106] - [14] [400,54] - [13] [7,106] - [14] [1,106] - [14] [2,106] - [13] [14,106] - [14] [4,106] - [13] [54,106] - [14] [7,106] - [13] [106,106] - [14] [14,106] - [13] [206,106] - [14] [28,106] - [13] [400,106] - [14] [54,106] - [14] [106,106] - [14] [206,106] - [13] [1,206] - [14] [400,106] - [13] [2,206] - [14] [1,206] - [13] [4,206] - [14] [2,206] - [14] [4,206] - [13] [7,206] - [14] [7,206] - [13] [14,206] - [14] [14,206] - [13] [28,206] - [14] [28,206] - [13] [54,206] - [14] [54,206] - [13] [106,206] - [14] [106,206] - [14] [206,206] - [13] [400,206] - [14] [400,206] - [13] [1,400] - [14] [1,400] - [13] [2,400] - [14] [2,400] - [13] [4,400] - [14] [4,400] - [13] [7,400] - [14] [7,400] - [13] [14,400] - [14] [14,400] - [13] [28,400] - [14] [28,400] - [13] [54,400] - [14] [54,400] - [13] [106,400] - [14] [106,400] - [13] [206,400] - [14] [206,400] - [13] [400,400] - [15] [1,1] - [15] [2,1] - [15] [4,1] - [15] [7,1] - [15] [14,1] - [15] [28,1] - [15] [54,1] - [14] [400,400] - [16] [1,1] - [16] [2,1] - [16] [4,1] - [16] [7,1] - [16] [14,1] - [16] [28,1] - [16] [54,1] - [15] [206,1] - [16] [106,1] - [16] [206,1] - [15] [400,1] - [15] [1,2] - [15] [2,2] - [15] [4,2] - [15] [7,2] - [15] [14,2] - [15] [28,2] - [16] [1,2] - [16] [2,2] - [16] [4,2] - [16] [7,2] - [16] [14,2] - [15] [54,2] - [16] [28,2] - [16] [54,2] - [15] [106,2] - [16] [106,2] - [15] [206,2] - [16] [206,2] - [15] [400,2] - [15] [1,4] - [15] [2,4] - [15] [4,4] - [15] [7,4] - [15] [14,4] - [16] [400,2] - [16] [1,4] - [16] [2,4] - [16] [4,4] - [16] [7,4] - [16] [14,4] - [15] [54,4] - [16] [28,4] - [16] [54,4] - [15] [106,4] - [15] [206,4] - [16] [106,4] - [16] [206,4] - [15] [400,4] - [15] [1,7] - [15] [2,7] - [15] [4,7] - [15] [7,7] - [15] [14,7] - [15] [28,7] - [15] [54,7] - [15] [106,7] - [16] [400,4] - [16] [1,7] - [16] [2,7] - [16] [4,7] - [16] [7,7] - [16] [14,7] - [16] [28,7] - [16] [54,7] - [15] [206,7] - [16] [106,7] - [16] [206,7] - [15] [400,7] - [15] [1,14] - [15] [2,14] - [15] [4,14] - [15] [7,14] - [16] [400,7] - [15] [14,14] - [15] [28,14] - [16] [2,14] - [15] [54,14] - [16] [4,14] - [16] [7,14] - [16] [14,14] - [15] [106,14] - [16] [28,14] - [16] [54,14] - [15] [206,14] - [16] [106,14] - [16] [206,14] - [15] [400,14] - [15] [1,28] - [15] [2,28] - [15] [4,28] - [16] [400,14] - [15] [7,28] - [16] [1,28] - [15] [14,28] - [16] [2,28] - [15] [54,28] - [16] [4,28] - [15] [106,28] - [16] [14,28] - [16] [28,28] - [15] [206,28] - [16] [54,28] - [16] [106,28] - [16] [206,28] - [15] [400,28] - [15] [1,54] - [16] [400,28] - [15] [2,54] - [16] [1,54] - [15] [4,54] - [16] [2,54] - [15] [7,54] - [16] [4,54] - [15] [14,54] - [16] [7,54] - [16] [14,54] - [15] [28,54] - [16] [28,54] - [15] [54,54] - [16] [54,54] - [15] [106,54] - [16] [106,54] - [15] [206,54] - [16] [206,54] - [15] [400,54] - [16] [400,54] - [15] [1,106] - [16] [1,106] - [15] [2,106] - [16] [2,106] - [15] [4,106] - [16] [4,106] - [15] [7,106] - [16] [7,106] - [15] [14,106] - [16] [14,106] - [15] [28,106] - [15] [54,106] - [16] [28,106] - [15] [106,106] - [16] [54,106] - [15] [206,106] - [16] [106,106] - [16] [206,106] - [15] [400,106] - [16] [400,106] - [15] [1,206] - [16] [1,206] - [15] [2,206] - [16] [2,206] - [15] [4,206] - [16] [4,206] - [15] [7,206] - [16] [7,206] - [15] [14,206] - [16] [14,206] - [15] [28,206] - [16] [28,206] - [15] [54,206] - [16] [54,206] - [15] [106,206] - [16] [106,206] - [15] [206,206] - [16] [206,206] - [15] [400,206] - [16] [400,206] - [15] [1,400] - [16] [1,400] - [15] [2,400] - [16] [2,400] - [15] [4,400] - [16] [4,400] - [15] [7,400] - [16] [7,400] - [15] [14,400] - [16] [14,400] - [15] [28,400] - [16] [28,400] - [16] [54,400] - [15] [54,400] - [16] [106,400] - [15] [106,400] - [16] [206,400] - [15] [206,400] - [16] [400,400] - [18] [1,1] - [18] [2,1] - [18] [4,1] - [18] [7,1] - [18] [14,1] - [18] [28,1] - [18] [54,1] - [15] [400,400] - [18] [106,1] - [17] [1,1] - [17] [2,1] - [17] [4,1] - [17] [7,1] - [17] [14,1] - [17] [28,1] - [18] [206,1] - [17] [54,1] - [17] [106,1] - [18] [400,1] - [18] [1,2] - [18] [2,2] - [18] [4,2] - [18] [7,2] - [18] [14,2] - [18] [28,2] - [17] [206,1] - [18] [54,2] - [18] [106,2] - [18] [206,2] - [17] [400,1] - [17] [1,2] - [17] [2,2] - [17] [4,2] - [17] [7,2] - [17] [14,2] - [17] [28,2] - [17] [54,2] - [17] [106,2] - [18] [400,2] - [18] [1,4] - [18] [2,4] - [18] [4,4] - [18] [7,4] - [18] [14,4] - [17] [206,2] - [18] [28,4] - [18] [54,4] - [18] [106,4] - [18] [206,4] - [17] [400,2] - [17] [1,4] - [17] [2,4] - [17] [4,4] - [17] [7,4] - [17] [14,4] - [17] [28,4] - [17] [54,4] - [17] [106,4] - [18] [400,4] - [18] [1,7] - [18] [2,7] - [18] [4,7] - [18] [7,7] - [18] [14,7] - [18] [28,7] - [17] [206,4] - [18] [54,7] - [18] [106,7] - [18] [206,7] - [17] [400,4] - [17] [1,7] - [17] [2,7] - [17] [4,7] - [17] [7,7] - [17] [14,7] - [17] [28,7] - [17] [54,7] - [17] [106,7] - [18] [400,7] - [18] [1,14] - [18] [2,14] - [17] [206,7] - [18] [4,14] - [18] [7,14] - [18] [14,14] - [18] [28,14] - [18] [54,14] - [18] [106,14] - [17] [400,7] - [17] [1,14] - [18] [206,14] - [17] [2,14] - [17] [4,14] - [17] [7,14] - [17] [14,14] - [17] [28,14] - [17] [54,14] - [17] [106,14] - [18] [400,14] - [18] [1,28] - [17] [206,14] - [18] [2,28] - [18] [4,28] - [18] [7,28] - [18] [14,28] - [18] [28,28] - [18] [54,28] - [17] [400,14] - [18] [106,28] - [17] [1,28] - [17] [2,28] - [17] [4,28] - [18] [206,28] - [17] [7,28] - [17] [14,28] - [17] [28,28] - [17] [54,28] - [17] [106,28] - [18] [400,28] - [17] [206,28] - [18] [1,54] - [18] [2,54] - [18] [4,54] - [17] [400,28] - [18] [7,54] - [17] [1,54] - [18] [14,54] - [17] [2,54] - [18] [28,54] - [18] [54,54] - [17] [4,54] - [18] [106,54] - [17] [7,54] - [18] [206,54] - [17] [14,54] - [17] [28,54] - [17] [54,54] - [18] [400,54] - [17] [106,54] - [17] [206,54] - [18] [1,106] - [18] [2,106] - [17] [400,54] - [18] [4,106] - [17] [1,106] - [18] [7,106] - [17] [2,106] - [18] [14,106] - [17] [4,106] - [18] [28,106] - [17] [7,106] - [18] [54,106] - [18] [106,106] - [17] [14,106] - [18] [206,106] - [17] [28,106] - [18] [400,106] - [17] [54,106] - [17] [106,106] - [18] [1,206] - [17] [206,106] - [17] [400,106] - [18] [2,206] - [17] [1,206] - [18] [4,206] - [17] [2,206] - [18] [7,206] - [17] [4,206] - [18] [14,206] - [17] [7,206] - [18] [28,206] - [18] [54,206] - [17] [14,206] - [18] [106,206] - [17] [28,206] - [18] [206,206] - [18] [400,206] - [17] [54,206] - [17] [106,206] - [17] [206,206] - [18] [1,400] - [17] [400,206] - [18] [2,400] - [17] [1,400] - [17] [2,400] - [18] [4,400] - [17] [4,400] - [18] [7,400] - [17] [7,400] - [18] [14,400] - [17] [14,400] - [18] [28,400] - [17] [28,400] - [18] [54,400] - [17] [54,400] - [18] [106,400] - [17] [106,400] - [18] [206,400] - [17] [206,400] - [18] [400,400] - [20] [1,1] - [20] [2,1] - [20] [4,1] - [20] [7,1] - [20] [14,1] - [20] [28,1] - [20] [54,1] - [17] [400,400] - [19] [1,1] - [19] [2,1] - [19] [4,1] - [19] [7,1] - [20] [106,1] - [19] [14,1] - [19] [28,1] - [19] [54,1] - [19] [106,1] - [20] [206,1] - [19] [206,1] - [20] [400,1] - [20] [1,2] - [20] [2,2] - [20] [4,2] - [20] [7,2] - [20] [14,2] - [20] [28,2] - [20] [54,2] - [19] [400,1] - [19] [1,2] - [19] [2,2] - [19] [4,2] - [19] [7,2] - [19] [14,2] - [20] [106,2] - [19] [28,2] - [19] [54,2] - [20] [206,2] - [19] [106,2] - [19] [206,2] - [20] [400,2] - [20] [1,4] - [20] [2,4] - [20] [4,4] - [20] [7,4] - [20] [14,4] - [20] [28,4] - [20] [54,4] - [20] [106,4] - [19] [400,2] - [19] [1,4] - [19] [2,4] - [19] [4,4] - [19] [7,4] - [19] [14,4] - [19] [28,4] - [20] [206,4] - [19] [54,4] - [19] [106,4] - [19] [206,4] - [20] [400,4] - [20] [1,7] - [19] [400,4] - [20] [2,7] - [19] [1,7] - [20] [4,7] - [19] [2,7] - [20] [7,7] - [20] [14,7] - [19] [4,7] - [19] [7,7] - [20] [28,7] - [19] [14,7] - [19] [28,7] - [20] [54,7] - [19] [54,7] - [20] [106,7] - [19] [106,7] - [19] [206,7] - [20] [206,7] - [19] [400,7] - [20] [400,7] - [19] [1,14] - [20] [1,14] - [19] [2,14] - [20] [2,14] - [19] [4,14] - [20] [4,14] - [19] [7,14] - [20] [7,14] - [19] [14,14] - [20] [14,14] - [19] [28,14] - [20] [28,14] - [19] [54,14] - [20] [54,14] - [19] [106,14] - [20] [106,14] - [20] [206,14] - [19] [206,14] - [20] [400,14] - [20] [1,28] - [19] [400,14] - [20] [2,28] - [19] [1,28] - [20] [4,28] - [20] [7,28] - [19] [4,28] - [20] [14,28] - [19] [7,28] - [20] [28,28] - [19] [14,28] - [20] [54,28] - [19] [28,28] - [19] [54,28] - [20] [106,28] - [19] [106,28] - [20] [206,28] - [19] [206,28] - [20] [400,28] - [20] [1,54] - [19] [400,28] - [19] [1,54] - [19] [2,54] - [20] [4,54] - [19] [4,54] - [20] [7,54] - [19] [7,54] - [20] [14,54] - [19] [14,54] - [20] [28,54] - [19] [28,54] - [20] [54,54] - [19] [54,54] - [20] [106,54] - [19] [106,54] - [19] [206,54] - [20] [206,54] - [20] [400,54] - [19] [400,54] - [19] [1,106] - [20] [1,106] - [19] [2,106] - [20] [2,106] - [19] [4,106] - [20] [4,106] - [20] [7,106] - [19] [7,106] - [20] [14,106] - [19] [14,106] - [20] [28,106] - [19] [28,106] - [20] [54,106] - [19] [54,106] - [20] [106,106] - [19] [106,106] - [20] [206,106] - [19] [206,106] - [20] [400,106] - [19] [400,106] - [20] [1,206] - [19] [1,206] - [20] [2,206] - [19] [2,206] - [20] [4,206] - [19] [4,206] - [20] [7,206] - [19] [7,206] - [20] [14,206] - [19] [14,206] - [20] [28,206] - [19] [28,206] - [20] [54,206] - [19] [54,206] - [20] [106,206] - [19] [106,206] - [20] [206,206] - [19] [206,206] - [20] [400,206] - [19] [400,206] - [20] [1,400] - [19] [1,400] - [20] [2,400] - [19] [2,400] - [20] [4,400] - [19] [4,400] - [20] [7,400] - [19] [7,400] - [20] [14,400] - [19] [14,400] - [19] [28,400] - [20] [28,400] - [19] [54,400] - [20] [54,400] - [19] [106,400] - [20] [106,400] - [19] [206,400] - [20] [206,400] - [19] [400,400] - [21] [1,1] - [21] [2,1] - [21] [4,1] - [21] [7,1] - [21] [14,1] - [20] [400,400] - [21] [28,1] - [22] [1,1] - [22] [2,1] - [22] [4,1] - [22] [7,1] - [22] [14,1] - [21] [54,1] - [22] [28,1] - [22] [54,1] - [21] [106,1] - [22] [106,1] - [21] [206,1] - [22] [206,1] - [21] [400,1] - [21] [1,2] - [21] [2,2] - [21] [4,2] - [21] [7,2] - [21] [14,2] - [22] [400,1] - [22] [1,2] - [21] [28,2] - [22] [2,2] - [22] [4,2] - [22] [7,2] - [22] [14,2] - [21] [54,2] - [22] [28,2] - [22] [54,2] - [21] [106,2] - [22] [106,2] - [21] [206,2] - [22] [206,2] - [21] [400,2] - [21] [1,4] - [21] [2,4] - [21] [4,4] - [21] [7,4] - [21] [14,4] - [21] [28,4] - [21] [54,4] - [22] [400,2] - [22] [1,4] - [22] [2,4] - [21] [106,4] - [22] [7,4] - [22] [14,4] - [22] [28,4] - [22] [54,4] - [21] [206,4] - [22] [106,4] - [22] [206,4] - [21] [400,4] - [21] [1,7] - [21] [2,7] - [21] [4,7] - [21] [7,7] - [21] [14,7] - [21] [28,7] - [21] [54,7] - [21] [106,7] - [22] [400,4] - [22] [1,7] - [21] [206,7] - [22] [2,7] - [22] [4,7] - [22] [7,7] - [22] [14,7] - [22] [28,7] - [22] [54,7] - [22] [106,7] - [21] [400,7] - [21] [1,14] - [22] [206,7] - [21] [2,14] - [21] [4,14] - [21] [7,14] - [21] [14,14] - [21] [28,14] - [21] [54,14] - [21] [106,14] - [22] [400,7] - [22] [1,14] - [22] [2,14] - [22] [4,14] - [22] [7,14] - [22] [14,14] - [22] [28,14] - [21] [206,14] - [22] [54,14] - [22] [106,14] - [22] [206,14] - [21] [400,14] - [21] [1,28] - [21] [2,28] - [21] [4,28] - [21] [7,28] - [22] [400,14] - [21] [14,28] - [22] [1,28] - [21] [28,28] - [22] [2,28] - [22] [4,28] - [21] [106,28] - [22] [7,28] - [22] [14,28] - [22] [28,28] - [22] [54,28] - [21] [206,28] - [22] [106,28] - [22] [206,28] - [21] [400,28] - [22] [400,28] - [21] [1,54] - [22] [1,54] - [21] [2,54] - [22] [2,54] - [21] [4,54] - [22] [4,54] - [21] [7,54] - [22] [14,54] - [21] [14,54] - [22] [28,54] - [21] [28,54] - [21] [54,54] - [22] [54,54] - [21] [106,54] - [22] [106,54] - [21] [206,54] - [22] [206,54] - [21] [400,54] - [22] [400,54] - [21] [1,106] - [22] [1,106] - [21] [2,106] - [22] [2,106] - [21] [4,106] - [22] [4,106] - [21] [7,106] - [22] [7,106] - [21] [14,106] - [22] [14,106] - [21] [28,106] - [21] [54,106] - [22] [28,106] - [21] [106,106] - [22] [54,106] - [21] [206,106] - [22] [106,106] - [21] [400,106] - [22] [206,106] - [22] [400,106] - [21] [1,206] - [22] [1,206] - [21] [2,206] - [21] [4,206] - [22] [2,206] - [21] [7,206] - [22] [4,206] - [21] [14,206] - [22] [7,206] - [21] [28,206] - [22] [14,206] - [21] [54,206] - [22] [28,206] - [21] [106,206] - [22] [54,206] - [21] [206,206] - [22] [106,206] - [21] [400,206] - [22] [206,206] - [22] [400,206] - [21] [1,400] - [22] [1,400] - [21] [2,400] - [22] [2,400] - [21] [4,400] - [22] [4,400] - [22] [7,400] - [21] [7,400] - [22] [14,400] - [21] [14,400] - [21] [28,400] - [22] [28,400] - [21] [54,400] - [22] [54,400] - [21] [106,400] - [22] [106,400] - [21] [206,400] - [22] [206,400] - [21] [400,400] - [23] [1,1] - [23] [2,1] - [23] [4,1] - [23] [7,1] - [23] [14,1] - [23] [28,1] - [22] [400,400] - [24] [1,1] - [23] [54,1] - [24] [2,1] - [24] [4,1] - [24] [7,1] - [24] [14,1] - [24] [28,1] - [23] [106,1] - [24] [54,1] - [24] [106,1] - [23] [206,1] - [24] [206,1] - [23] [400,1] - [23] [1,2] - [23] [2,2] - [23] [4,2] - [23] [7,2] - [24] [400,1] - [24] [1,2] - [23] [14,2] - [24] [2,2] - [24] [4,2] - [24] [7,2] - [23] [28,2] - [24] [14,2] - [24] [28,2] - [23] [54,2] - [24] [54,2] - [23] [106,2] - [24] [106,2] - [23] [206,2] - [24] [206,2] - [23] [400,2] - [23] [1,4] - [23] [2,4] - [23] [4,4] - [23] [7,4] - [23] [14,4] - [23] [28,4] - [23] [54,4] - [24] [400,2] - [24] [1,4] - [24] [2,4] - [24] [4,4] - [24] [7,4] - [24] [14,4] - [24] [28,4] - [23] [106,4] - [24] [54,4] - [24] [106,4] - [23] [206,4] - [24] [206,4] - [23] [400,4] - [24] [400,4] - [24] [1,7] - [23] [1,7] - [23] [2,7] - [24] [4,7] - [23] [4,7] - [24] [7,7] - [23] [7,7] - [24] [14,7] - [23] [14,7] - [24] [28,7] - [23] [28,7] - [24] [54,7] - [23] [54,7] - [24] [106,7] - [23] [106,7] - [24] [206,7] - [23] [206,7] - [24] [400,7] - [23] [400,7] - [24] [1,14] - [23] [1,14] - [24] [2,14] - [23] [2,14] - [24] [4,14] - [24] [7,14] - [23] [4,14] - [24] [14,14] - [23] [7,14] - [24] [28,14] - [23] [14,14] - [23] [28,14] - [24] [54,14] - [23] [54,14] - [24] [106,14] - [23] [106,14] - [24] [206,14] - [23] [206,14] - [24] [400,14] - [23] [400,14] - [24] [1,28] - [23] [1,28] - [24] [2,28] - [23] [2,28] - [24] [4,28] - [23] [4,28] - [24] [7,28] - [23] [7,28] - [24] [14,28] - [24] [28,28] - [23] [14,28] - [24] [54,28] - [23] [28,28] - [23] [54,28] - [24] [106,28] - [23] [106,28] - [24] [206,28] - [23] [206,28] - [24] [400,28] - [23] [400,28] - [24] [1,54] - [23] [1,54] - [24] [2,54] - [23] [2,54] - [24] [4,54] - [23] [4,54] - [24] [7,54] - [23] [7,54] - [24] [14,54] - [23] [14,54] - [24] [28,54] - [23] [28,54] - [24] [54,54] - [23] [54,54] - [24] [106,54] - [23] [106,54] - [24] [206,54] - [23] [206,54] - [23] [400,54] - [24] [400,54] - [23] [1,106] - [24] [1,106] - [23] [2,106] - [24] [2,106] - [23] [4,106] - [24] [4,106] - [23] [7,106] - [24] [7,106] - [23] [14,106] - [24] [14,106] - [23] [28,106] - [24] [28,106] - [23] [54,106] - [24] [54,106] - [23] [106,106] - [24] [106,106] - [23] [206,106] - [24] [206,106] - [23] [400,106] - [24] [400,106] - [23] [1,206] - [24] [1,206] - [24] [2,206] - [23] [2,206] - [24] [4,206] - [23] [4,206] - [24] [7,206] - [23] [7,206] - [23] [14,206] - [24] [14,206] - [23] [28,206] - [24] [28,206] - [23] [54,206] - [24] [54,206] - [23] [106,206] - [24] [106,206] - [23] [206,206] - [24] [206,206] - [23] [400,206] - [24] [400,206] - [23] [1,400] - [24] [1,400] - [23] [2,400] - [24] [2,400] - [23] [4,400] - [24] [4,400] - [23] [7,400] - [24] [7,400] - [24] [14,400] - [23] [14,400] - [23] [28,400] - [24] [28,400] - [23] [54,400] - [24] [54,400] - [23] [106,400] - [24] [106,400] - [23] [206,400] - [24] [206,400] - [23] [400,400] - [24] [400,400] - [25] [1,1] - [25] [2,1] - [25] [4,1] - [25] [7,1] - [25] [14,1] - [25] [28,1] - [25] [54,1] - [25] [106,1] - [25] [206,1] - [25] [400,1] - [25] [1,2] - [25] [2,2] - [25] [4,2] - [25] [7,2] - [25] [14,2] - [25] [28,2] - [25] [54,2] - [25] [106,2] - [25] [206,2] - [25] [400,2] - [25] [1,4] - [25] [2,4] - [25] [4,4] - [25] [7,4] - [25] [14,4] - [25] [28,4] - [25] [54,4] - [25] [106,4] - [25] [206,4] - [25] [400,4] - [25] [1,7] - [25] [2,7] - [25] [4,7] - [25] [7,7] - [25] [14,7] - [25] [28,7] - [25] [54,7] - [25] [106,7] - [25] [206,7] - [25] [400,7] - [25] [1,14] - [25] [2,14] - [25] [4,14] - [25] [7,14] - [25] [14,14] - [25] [28,14] - [25] [54,14] - [25] [106,14] - [25] [206,14] - [25] [400,14] - [25] [1,28] - [25] [2,28] - [25] [4,28] - [25] [7,28] - [25] [14,28] - [25] [28,28] - [25] [54,28] - [25] [106,28] - [25] [206,28] - [25] [400,28] - [25] [1,54] - [25] [2,54] - [25] [4,54] - [25] [7,54] - [25] [14,54] - [25] [28,54] - [25] [54,54] - [25] [106,54] - [25] [206,54] - [25] [400,54] - [25] [1,106] - [25] [2,106] - [25] [4,106] - [25] [7,106] - [25] [14,106] - [25] [28,106] - [25] [54,106] - [25] [106,106] - [25] [206,106] - [25] [400,106] - [25] [1,206] - [25] [2,206] - [25] [4,206] - [25] [7,206] - [25] [14,206] - [25] [28,206] - [25] [54,206] - [25] [106,206] - [25] [206,206] - [25] [400,206] - [25] [1,400] - [25] [2,400] - [25] [4,400] - [25] [7,400] - [25] [14,400] - [25] [28,400] - [25] [54,400] - [25] [106,400] - [25] [206,400] - [25] [400,400] -> mstop(cvr) - mu sigma - 400 400 -> ## set model to optimal values: -> mstop(model) <- mstop(cvr) -> ### END (don't test automatically) -> ## End(No test) -> -> ### Other grids: -> plot(make.grid(mstop(model), length.out = 3, dense_mu_grid = FALSE)) -> plot(make.grid(c(mu = 400, sigma = 400), log = FALSE, dense_mu_grid = FALSE)) -> plot(make.grid(c(mu = 400, sigma = 400), length.out = 4, -+ min = 100, log = FALSE, dense_mu_grid = FALSE)) -> -> -> ### Now use dense mu grids -> # standard grid -> plot(make.grid(c(mu = 100, sigma = 100), dense = FALSE), -+ pch = 20, col = "red") -> # dense grid for all mstop_mu values greater than mstop_sigma -> grid <- make.grid(c(mu = 100, sigma = 100)) -> points(grid, pch = 20, cex = 0.2) -> abline(0,1) -> -> # now with three parameters -> grid <- make.grid(c(mu = 100, sigma = 100, df = 30), -+ length.out = c(5, 5, 2), dense = FALSE) -> densegrid <- make.grid(c(mu = 100, sigma = 100, df = 30), -+ length.out = c(5, 5, 2)) -> par(mfrow = c(1,2)) -> # first for df = 1 -> plot(grid[grid$df == 1, 1:2], main = "df = 1", pch = 20, col = "red") -> abline(0,1) -> abline(v = 1) -> # now expand grid for all mu values greater the corresponding sigma -> # value (i.e. below the bisecting line) and above df (i.e. 1) -> points(densegrid[densegrid$df == 1, 1:2], pch = 20, cex = 0.2) -> -> # now for df = 30 -> plot(grid[grid$df == 30, 1:2], main = "df = 30", pch = 20, col = "red") -> abline(0,1) -> abline(v = 30) -> # now expand grid for all mu values greater the corresponding sigma -> # value (i.e. below the bisecting line) and above df (i.e. 30) -> points(densegrid[densegrid$df == 30, 1:2], pch = 20, cex = 0.2) -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("cvrisk", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> graphics::par(get("par.postscript", pos = 'CheckExEnv')) -> cleanEx() -> nameEx("families") -> ### * families -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: Families -> ### Title: Families for GAMLSS models -> ### Aliases: Families families GaussianLSS GaussianMu GaussianSigma -> ### GammaLSS GammaMu GammaSigma BetaLSS BetaMu BetaPhi NBinomialLSS -> ### NBinomialMu NBinomialSigma StudentTLSS StudentTMu StudentTSigma -> ### StudentTDf LogNormalLSS LogNormalMu LogNormalSigma WeibullLSS -> ### WeibullMu WeibullSigma LogLogLSS LogLogMu LogLogSigma ZIPoLSS ZINBLSS -> ### options stab_ngrad stabilize_ngrad stabilize_ngradient -> ### Keywords: models distributions -> -> ### ** Examples -> -> ## Example to define a new distribution: -> ## Students t-distribution with two parameters, df and mu: -> -> ## sub-Family for mu -> ## -> generate object of the class family from the package mboost -> newStudentTMu <- function(mu, df){ -+ -+ # loss is negative log-Likelihood, f is the parameter to be fitted with -+ # id link -> f = mu -+ loss <- function(df, y, f) { -+ -1 * (lgamma((df + 1)/2) - lgamma(1/2) - -+ lgamma(df/2) - 0.5 * log(df) - -+ (df + 1)/2 * log(1 + (y - f)^2/(df ))) -+ } -+ # risk is sum of loss -+ risk <- function(y, f, w = 1) { -+ sum(w * loss(y = y, f = f, df = df)) -+ } -+ # ngradient is the negative derivate w.r.t. mu -+ ngradient <- function(y, f, w = 1) { -+ (df + 1) * (y - f)/(df + (y - f)^2) -+ } -+ -+ # use the Family constructor of mboost -+ Family(ngradient = ngradient, risk = risk, loss = loss, -+ response = function(f) f, -+ name = "new Student's t-distribution: mu (id link)") -+ } -> -> ## sub-Family for df -> newStudentTDf <- function(mu, df){ -+ -+ # loss is negative log-Likelihood, f is the parameter to be fitted with -+ # log-link: exp(f) = df -+ loss <- function( mu, y, f) { -+ -1 * (lgamma((exp(f) + 1)/2) - lgamma(1/2) - -+ lgamma(exp(f)/2) - 0.5 * f - -+ (exp(f) + 1)/2 * log(1 + (y - mu)^2/(exp(f) ))) -+ } -+ # risk is sum of loss -+ risk <- function(y, f, w = 1) { -+ sum(w * loss(y = y, f = f, mu = mu)) -+ } -+ # ngradient is the negative derivate w.r.t. df -+ ngradient <- function(y, f, w = 1) { -+ exp(f)/2 * (digamma((exp(f) + 1)/2) - digamma(exp(f)/2)) - -+ 0.5 - (exp(f)/2 * log(1 + (y - mu)^2 / (exp(f) )) - -+ (y - mu)^2 / (1 + (y - mu)^2 / exp(f)) * (exp(-f) + 1)/2) -+ } -+ # use the Family constructor of mboost -+ Family(ngradient = ngradient, risk = risk, loss = loss, -+ response = function(f) exp(f), -+ name = "Student's t-distribution: df (log link)") -+ } -> -> ## families object for new distribution -> newStudentT <- Families(mu= newStudentTMu(mu=mu, df=df), -+ df=newStudentTDf(mu=mu, df=df)) -> -> ## No test: -> ### Do not test the following code per default on CRAN as it takes some time to run: -> ### usage of the new Student's t distribution: -> library(gamlss) ## required for rTF -Loading required package: splines -Loading required package: gamlss.data -Loading required package: gamlss.dist -Loading required package: MASS - -Attaching package: ‘gamlss.dist’ - -The following object is masked from ‘package:mboost’: - - Family - -Loading required package: nlme - ********** GAMLSS Version 4.3-8 ********** -For more on GAMLSS look at http://www.gamlss.org/ -Type gamlssNews() to see new features/changes/bug fixes. - -> set.seed(1907) -> n <- 5000 -> x1 <- runif(n) -> x2 <- runif(n) -> mu <- 2 -1*x1 - 3*x2 -> df <- exp(1 + 0.5*x1 ) -> y <- rTF(n = n, mu = mu, nu = df) -> -> ## model fitting -> model <- glmboostLSS(y ~ x1 + x2, families = newStudentT, -+ control = boost_control(mstop = 100), -+ center = TRUE) -> ## shrinked effect estimates -> coef(model, off2int = TRUE) -$mu -(Intercept) x1 x2 - 2.0013497 -0.9745979 -2.9987269 - -$df -(Intercept) x1 - 1.0798780 0.1213042 - -> -> ## compare to pre-defined three parametric t-distribution: -> model2 <- glmboostLSS(y ~ x1 + x2, families = StudentTLSS(), -+ control = boost_control(mstop = 100), -+ center = TRUE) -> coef(model2, off2int = TRUE) -$mu -(Intercept) x1 x2 - 1.9900788 -0.9658828 -2.9889112 - -$sigma -(Intercept) x1 x2 - 0.01314517 -0.02731268 0.03867761 - -$df -(Intercept) x1 - 1.3213044 0.1913091 - -> -> ## with effect on sigma: -> sigma <- 3+ 1*x2 -> y <- rTF(n = n, mu = mu, nu = df, sigma=sigma) -> model3 <- glmboostLSS(y ~ x1 + x2, families = StudentTLSS(), -+ control = boost_control(mstop = 100), -+ center = TRUE) -> coef(model3, off2int = TRUE) -$mu -(Intercept) x2 - 0.5625243 -1.1556618 - -$sigma -(Intercept) x1 x2 - 1.17619100 -0.09742086 0.32657481 - -$df -(Intercept) x1 x2 - 1.14269183 0.33422503 -0.02387359 - -> ## End(No test) -> -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("families", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> cleanEx() - -detaching ‘package:gamlss’, ‘package:nlme’, ‘package:gamlss.dist’, - ‘package:MASS’, ‘package:gamlss.data’, ‘package:splines’ - -> nameEx("gamboostLSS-package") -> ### * gamboostLSS-package -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: gamboostLSS-package -> ### Title: Boosting algorithms for GAMLSS -> ### Aliases: gamboostLSS-package -> ### Keywords: package -> -> ### ** Examples -> -> # Generate covariates -> x1 <- runif(100) -> x2 <- runif(100) -> eta_mu <- 2 - 2*x1 -> eta_sigma <- -1 + 2*x2 -> -> # Generate response: Negative Binomial Distribution -> y <- numeric(100) -> for( i in 1:100) y[i] <- rnbinom(1, size=exp(eta_sigma[i]), mu=exp(eta_mu[i])) -> -> # Model fitting, 300 boosting steps, same formula for both distribution parameters -> mod1 <- glmboostLSS( y ~ x1 + x2, families=NBinomialLSS(), -+ control=boost_control(mstop=300), center = TRUE) -> -> # Shrinked effect estimates -> coef(mod1, off2int=TRUE) -$mu -(Intercept) x1 x2 - 2.3629274 -1.7170135 -0.7735303 - -$sigma -(Intercept) x1 x2 - -0.3578293 -0.7798073 1.8236518 - -> -> # Empirical risk with respect to mu -> plot(risk(mod1)$mu) -> -> # Empirical risk with respect to sigma -> plot(risk(mod1)$sigma) -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("gamboostLSS-package", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> cleanEx() -> nameEx("india") -> ### * india -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: india -> ### Title: Malnutrition of Children in India (DHS, 1998-99) -> ### Aliases: india india.bnd -> ### Keywords: datasets -> -> ### ** Examples -> -> if (require("BayesX")) { -+ ## plot distribution of stunting in India -+ drawmap(india, map = india.bnd, regionvar = "mcdist", plotvar = "stunting") -+ } -Loading required package: BayesX -Loading required package: shapefiles -Loading required package: foreign - -Attaching package: ‘shapefiles’ - -The following objects are masked from ‘package:foreign’: - - read.dbf, write.dbf - -Note: Function plotsurf depends on akima which has - a restricted licence that explicitly forbids commercial use. - akima is therefore disabled by default and may be enabled by - akimaPermit(). Calling this function includes your agreement to - akima`s licence restrictions. -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("india", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> cleanEx() - -detaching ‘package:BayesX’, ‘package:shapefiles’, ‘package:foreign’ - -> nameEx("mboostLSS") -> ### * mboostLSS -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: mboostLSS -> ### Title: Fitting GAMLSS by Boosting -> ### Aliases: mboostLSS blackboostLSS glmboostLSS gamboostLSS mboostLSS_fit -> ### Keywords: models nonlinear fitting -> -> ### ** Examples -> -> -> ### Data generating process: -> set.seed(1907) -> x1 <- rnorm(1000) -> x2 <- rnorm(1000) -> x3 <- rnorm(1000) -> x4 <- rnorm(1000) -> x5 <- rnorm(1000) -> x6 <- rnorm(1000) -> mu <- exp(1.5 +1 * x1 +0.5 * x2 -0.5 * x3 -1 * x4) -> sigma <- exp(-0.4 * x3 -0.2 * x4 +0.2 * x5 +0.4 * x6) -> y <- numeric(1000) -> for( i in 1:1000) -+ y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) -> dat <- data.frame(x1, x2, x3, x4, x5, x6, y) -> -> ### linear model with y ~ . for both components: 400 boosting iterations -> model <- glmboostLSS(y ~ ., families = NBinomialLSS(), data = dat, -+ control = boost_control(mstop = 400), -+ center = TRUE) -> coef(model, off2int = TRUE) -$mu -(Intercept) x1 x2 x3 x4 - 1.6393421 0.9521780 0.4673261 -0.4553980 -0.8812656 - -$sigma -(Intercept) x1 x2 x3 x4 x5 --0.21020051 0.18090759 0.03140974 -0.36216484 -0.27645489 0.13696242 - x6 - 0.32951815 - -> -> -> ### estimate model with different formulas for mu and sigma: -> names(NBinomialLSS()) # names of the family -[1] "mu" "sigma" -> -> ## No test: -> ### Do not test the following code per default on CRAN as it takes some time to run: -> # Note: Multiple formulas must be specified via a _named list_ -> # where the names correspond to the names of the distribution parameters -> # in the family (see above) -> model2 <- glmboostLSS(formula = list(mu = y ~ x1 + x2 + x3 + x4, -+ sigma = y ~ x3 + x4 + x5 + x6), -+ families = NBinomialLSS(), data = dat, -+ control = boost_control(mstop = 400, trace = TRUE), -+ center = TRUE) -[ 1] ...................................... -- risk: 3102.966 -[ 41] ...................................... -- risk: 3026.774 -[ 81] ...................................... -- risk: 2963.095 -[ 121] ...................................... -- risk: 2901.378 -[ 161] ...................................... -- risk: 2841.725 -[ 201] ...................................... -- risk: 2788.547 -[ 241] ...................................... -- risk: 2746.665 -[ 281] ...................................... -- risk: 2717.919 -[ 321] ...................................... -- risk: 2700.384 -[ 361] ...................................... -Final risk: 2690.598 -> coef(model2, off2int = TRUE) -$mu -(Intercept) x1 x2 x3 x4 - 1.6068970 0.9754679 0.4773532 -0.4662399 -0.8897124 - -$sigma -(Intercept) x3 x4 x5 x6 - -0.1230354 -0.3630657 -0.2697535 0.1403489 0.3301615 - -> ### END (don't test automatically) -> ## End(No test) -> -> -> ### Offset needs to be specified via the arguments of families object: -> model <- glmboostLSS(y ~ ., data = dat, -+ families = NBinomialLSS(mu = mean(mu), -+ sigma = mean(sigma)), -+ control = boost_control(mstop = 10), -+ center = TRUE) -> # Note: mu-offset = log(mean(mu)) and sigma-offset = log(mean(sigma)) -> # as we use a log-link in both families -> coef(model) -$mu -(Intercept) x1 x4 --0.00644371 0.32790393 -0.22505852 -attr(,"offset") -[1] 2.843104 - -$sigma -(Intercept) - -0.6069266 -attr(,"offset") -[1] 0.1828927 - -> log(mean(mu)) -[1] 2.843104 -> log(mean(sigma)) -[1] 0.1828927 -> -> ## No test: -> ### Do not test the following code per default on CRAN as it takes some time to run: -> ### use different mstop values for the two distribution parameters -> ### (two-dimensional early stopping) -> ### the number of iterations is passed to boost_control via a named list -> model3 <- glmboostLSS(formula = list(mu = y ~ x1 + x2 + x3 + x4, -+ sigma = y ~ x3 + x4 + x5 + x6), -+ families = NBinomialLSS(), data = dat, -+ control = boost_control(mstop = list(mu = 400, -+ sigma = 300), -+ trace = TRUE), -+ center = TRUE) -[ 1] ...................................... -- risk: 3102.966 -[ 41] ...................................... -- risk: 3026.774 -[ 81] ...................................... -- risk: 2963.095 -[ 121] ...................................... -- risk: 2901.378 -[ 161] ...................................... -- risk: 2841.725 -[ 201] ...................................... -- risk: 2788.547 -[ 241] ...................................... -- risk: 2746.665 -[ 281] ...................................... -- risk: 2721.225 -[ 321] ...................................... -- risk: 2709.597 -[ 361] ...................................... -Final risk: 2703.712 -> coef(model3, off2int = TRUE) -$mu -(Intercept) x1 x2 x3 x4 - 1.6111180 0.9718734 0.4694390 -0.4644485 -0.8799773 - -$sigma -(Intercept) x3 x4 x5 x6 --0.29089309 -0.36306567 -0.26975349 0.06302647 0.23897680 - -> -> ### Alternatively we can change mstop of model2: -> # here it is assumed that the first element in the vector corresponds to -> # the first distribution parameter of model2 etc. -> mstop(model2) <- c(400, 300) -Model first reduced to mstop = 300. -Now continue ... -[ 301] ...................................... -- risk: 2714.448 -[ 341] ...................................... -- risk: 2706.16 -[ 381] .................. -Final risk: 2703.712 -> par(mfrow = c(1,2)) -> plot(model2, xlim = c(0, max(mstop(model2)))) -> ## all.equal(coef(model2), coef(model3)) # same! -> ### END (don't test automatically) -> ## End(No test) -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("mboostLSS", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> graphics::par(get("par.postscript", pos = 'CheckExEnv')) -> cleanEx() -> nameEx("methods") -> ### * methods -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: methods -> ### Title: Methods for mboostLSS -> ### Aliases: print.mboostLSS summary.mboostLSS coef.mboostLSS -> ### coef.glmboostLSS risk risk.mboostLSS [.mboostLSS mstop.mboostLSS -> ### mstop.oobag mstop.cvriskLSS selected selected.mboostLSS -> ### fitted.mboostLSS predict.mboostLSS predint PI plot.glmboostLSS -> ### plot.gamboostLSS plot.predint update.mboostLSS model.weights -> ### model.weights.default model.weights.mboostLSS -> ### Keywords: methods -> -> ### ** Examples -> -> -> ### generate data -> set.seed(1907) -> x1 <- rnorm(1000) -> x2 <- rnorm(1000) -> x3 <- rnorm(1000) -> x4 <- rnorm(1000) -> x5 <- rnorm(1000) -> x6 <- rnorm(1000) -> mu <- exp(1.5 + x1^2 +0.5 * x2 - 3 * sin(x3) -1 * x4) -> sigma <- exp(-0.2 * x4 +0.2 * x5 +0.4 * x6) -> y <- numeric(1000) -> for( i in 1:1000) -+ y[i] <- rnbinom(1, size = sigma[i], mu = mu[i]) -> dat <- data.frame(x1, x2, x3, x4, x5, x6, y) -> -> ### fit a model -> model <- gamboostLSS(y ~ ., families = NBinomialLSS(), data = dat, -+ control = boost_control(mstop = 100)) -> -> ## No test: -> ### Do not test the following line per default on CRAN as it takes some time to run: -> ### use a model with more iterations for a better fit -> mstop(model) <- 400 -> ## End(No test) -> ### extract coefficients -> coef(model) -$mu -$mu$`bbs(x1, df = dfbase)` - 1 2 3 4 5 6 - 3.58171139 2.47642513 1.38321567 0.35846954 -0.55844450 -1.37386804 - 7 8 9 10 11 12 --2.06458712 -2.59383111 -2.94780872 -3.13830905 -3.18456719 -3.09471615 - 13 14 15 16 17 18 --2.86320001 -2.46725579 -1.87824927 -1.08842591 -0.09273062 1.10805073 - 19 20 21 22 23 24 - 2.48864870 4.00437945 5.60292622 7.22757798 8.84769996 10.46670845 - -$mu$`bbs(x2, df = dfbase)` - 1 2 3 4 5 6 --0.587567018 -0.597235489 -0.606895359 -0.616493825 -0.625795262 -0.634226162 - 7 8 9 10 11 12 --0.640764144 -0.643706523 -0.640665097 -0.629114205 -0.606465892 -0.565608617 - 13 14 15 16 17 18 --0.499359388 -0.406250941 -0.289077229 -0.151094932 -0.001816165 0.145180788 - 19 20 21 22 23 24 - 0.286945776 0.419084241 0.545588456 0.669020116 0.789859912 0.910388836 - -$mu$`bbs(x3, df = dfbase)` - 1 2 3 4 5 6 - 0.56795274 0.55780411 0.54748652 0.53585628 0.51985234 0.49117077 - 7 8 9 10 11 12 - 0.42717980 0.28842829 0.05046406 -0.25478976 -0.54504698 -0.75532084 - 13 14 15 16 17 18 --0.86898074 -0.89962648 -0.87265488 -0.81495209 -0.74603751 -0.67649672 - 19 20 21 22 23 24 --0.61055474 -0.54837543 -0.48890118 -0.43106752 -0.37389397 -0.31679225 - -$mu$`bbs(x4, df = dfbase)` - 1 2 3 4 5 6 - 2.567451544 2.183750845 1.800221518 1.415979616 1.034193922 0.667283578 - 7 8 9 10 11 12 - 0.322037905 0.009307943 -0.257545411 -0.481058705 -0.669711734 -0.813301926 - 13 14 15 16 17 18 --0.899364082 -0.932976652 -0.928286940 -0.899492000 -0.856040251 -0.804129859 - 19 20 21 22 23 24 --0.747632885 -0.688917493 -0.629440065 -0.569818844 -0.510251318 -0.450694813 - -attr(,"offset") -[1] 8.987845 - -$sigma -$sigma$`bbs(x1, df = dfbase)` - 1 2 3 4 5 6 - 0.89659893 0.78713824 0.67616360 0.55710969 0.42730638 0.29198962 - 7 8 9 10 11 12 - 0.16213560 0.05105498 -0.03122623 -0.07636368 -0.07847080 -0.03347975 - 13 14 15 16 17 18 - 0.05806291 0.17903227 0.30635650 0.42810619 0.53761725 0.62880999 - 19 20 21 22 23 24 - 0.69997365 0.75391415 0.79637610 0.83506324 0.87429112 0.91365873 - -$sigma$`bbs(x2, df = dfbase)` - 1 2 3 4 5 6 --0.563658099 -0.511757632 -0.459777813 -0.407331656 -0.354135638 -0.300469789 - 7 8 9 10 11 12 --0.248309055 -0.199527201 -0.154491030 -0.108894039 -0.058401175 -0.002441743 - 13 14 15 16 17 18 - 0.056485633 0.113495345 0.164241662 0.204929795 0.235290786 0.264020513 - 19 20 21 22 23 24 - 0.296512365 0.333895128 0.373456407 0.413559904 0.453779441 0.494022639 - -$sigma$`bbs(x3, df = dfbase)` - 1 2 3 4 5 6 --0.06993609 0.21499858 0.50028302 0.78648040 1.06468531 1.31096130 - 7 8 9 10 11 12 - 1.49064677 1.57871832 1.56759726 1.44135824 1.19071516 0.83344537 - 13 14 15 16 17 18 - 0.42510438 0.03477713 -0.30056403 -0.55740737 -0.72441644 -0.78900239 - 19 20 21 22 23 24 --0.75566343 -0.65077256 -0.49956583 -0.32729936 -0.14808084 0.03192021 - -$sigma$`bbs(x4, df = dfbase)` - 1 2 3 4 5 6 - 0.96287395 0.92067646 0.87872609 0.83856810 0.80135245 0.76642932 - 7 8 9 10 11 12 - 0.73502975 0.69991232 0.65251688 0.58964226 0.51238783 0.41489277 - 13 14 15 16 17 18 - 0.29149880 0.14358469 -0.01622096 -0.18308842 -0.36174266 -0.55165256 - 19 20 21 22 23 24 --0.75216843 -0.96121405 -1.17697566 -1.39582787 -1.61463881 -1.83317154 - -$sigma$`bbs(x5, df = dfbase)` - 1 2 3 4 5 6 --0.35133403 -0.31818178 -0.28487218 -0.25048316 -0.21414472 -0.17551639 - 7 8 9 10 11 12 --0.13478066 -0.09043638 -0.04036516 0.01140995 0.05490236 0.08804387 - 13 14 15 16 17 18 - 0.11539467 0.13861908 0.15950497 0.17917571 0.19811973 0.21841061 - 19 20 21 22 23 24 - 0.23971872 0.26186474 0.28466756 0.30781904 0.33074669 0.35356977 - -$sigma$`bbs(x6, df = dfbase)` - 1 2 3 4 5 --0.2844651880 -0.2186158355 -0.1534117880 -0.0928846917 -0.0448736951 - 6 7 8 9 10 --0.0144611066 -0.0007836747 0.0043527943 0.0116311707 0.0272086244 - 11 12 13 14 15 - 0.0517831869 0.0848199173 0.1248441166 0.1671483807 0.2026641167 - 16 17 18 19 20 - 0.2336020503 0.2661041115 0.3023380856 0.3417998069 0.3836024077 - 21 22 23 24 - 0.4268453691 0.4711745653 0.5160781652 0.5610761947 - -attr(,"offset") -[1] -2.427222 - -> -> ### only for distribution parameter mu -> coef(model, parameter = "mu") -$`bbs(x1, df = dfbase)` - 1 2 3 4 5 6 - 3.58171139 2.47642513 1.38321567 0.35846954 -0.55844450 -1.37386804 - 7 8 9 10 11 12 --2.06458712 -2.59383111 -2.94780872 -3.13830905 -3.18456719 -3.09471615 - 13 14 15 16 17 18 --2.86320001 -2.46725579 -1.87824927 -1.08842591 -0.09273062 1.10805073 - 19 20 21 22 23 24 - 2.48864870 4.00437945 5.60292622 7.22757798 8.84769996 10.46670845 - -$`bbs(x2, df = dfbase)` - 1 2 3 4 5 6 --0.587567018 -0.597235489 -0.606895359 -0.616493825 -0.625795262 -0.634226162 - 7 8 9 10 11 12 --0.640764144 -0.643706523 -0.640665097 -0.629114205 -0.606465892 -0.565608617 - 13 14 15 16 17 18 --0.499359388 -0.406250941 -0.289077229 -0.151094932 -0.001816165 0.145180788 - 19 20 21 22 23 24 - 0.286945776 0.419084241 0.545588456 0.669020116 0.789859912 0.910388836 - -$`bbs(x3, df = dfbase)` - 1 2 3 4 5 6 - 0.56795274 0.55780411 0.54748652 0.53585628 0.51985234 0.49117077 - 7 8 9 10 11 12 - 0.42717980 0.28842829 0.05046406 -0.25478976 -0.54504698 -0.75532084 - 13 14 15 16 17 18 --0.86898074 -0.89962648 -0.87265488 -0.81495209 -0.74603751 -0.67649672 - 19 20 21 22 23 24 --0.61055474 -0.54837543 -0.48890118 -0.43106752 -0.37389397 -0.31679225 - -$`bbs(x4, df = dfbase)` - 1 2 3 4 5 6 - 2.567451544 2.183750845 1.800221518 1.415979616 1.034193922 0.667283578 - 7 8 9 10 11 12 - 0.322037905 0.009307943 -0.257545411 -0.481058705 -0.669711734 -0.813301926 - 13 14 15 16 17 18 --0.899364082 -0.932976652 -0.928286940 -0.899492000 -0.856040251 -0.804129859 - 19 20 21 22 23 24 --0.747632885 -0.688917493 -0.629440065 -0.569818844 -0.510251318 -0.450694813 - -attr(,"offset") -[1] 8.987845 -> -> ### only for covariate x1 -> coef(model, which = "x1") -$mu -$mu$`bbs(x1, df = dfbase)` - 1 2 3 4 5 6 - 3.58171139 2.47642513 1.38321567 0.35846954 -0.55844450 -1.37386804 - 7 8 9 10 11 12 --2.06458712 -2.59383111 -2.94780872 -3.13830905 -3.18456719 -3.09471615 - 13 14 15 16 17 18 --2.86320001 -2.46725579 -1.87824927 -1.08842591 -0.09273062 1.10805073 - 19 20 21 22 23 24 - 2.48864870 4.00437945 5.60292622 7.22757798 8.84769996 10.46670845 - -attr(,"offset") -[1] 8.987845 - -$sigma -$sigma$`bbs(x1, df = dfbase)` - 1 2 3 4 5 6 - 0.89659893 0.78713824 0.67616360 0.55710969 0.42730638 0.29198962 - 7 8 9 10 11 12 - 0.16213560 0.05105498 -0.03122623 -0.07636368 -0.07847080 -0.03347975 - 13 14 15 16 17 18 - 0.05806291 0.17903227 0.30635650 0.42810619 0.53761725 0.62880999 - 19 20 21 22 23 24 - 0.69997365 0.75391415 0.79637610 0.83506324 0.87429112 0.91365873 - -attr(,"offset") -[1] -2.427222 - -> -> -> ### plot complete model -> par(mfrow = c(4, 3)) -> plot(model) -> ### plot first parameter only -> par(mfrow = c(2, 3)) -> plot(model, parameter = "mu") -> ### now plot only effect of x3 of both parameters -> par(mfrow = c(1, 2)) -> plot(model, which = "x3") -> ### first component second parameter (sigma) -> par(mfrow = c(1, 1)) -> plot(model, which = 1, parameter = 2) -> -> ## No test: -> ### Do not test the following code per default on CRAN as it takes some time to run: -> ### plot marginal prediction interval -> pi <- predint(model, pi = 0.9, which = "x1") -> pi <- predint(model, pi = c(0.8, 0.9), which = "x1") -> plot(pi, log = "y") # warning as some y values are below 0 -Warning in xy.coords(x, y, xlabel, ylabel, log) : - 229 y values <= 0 omitted from logarithmic plot -> ## here it would be better to plot x1 against -> ## sqrt(y) and sqrt(pi) -> -> ### set model to mstop = 300 (one-dimensional) -> mstop(model) <- 300 -> ### END (don't test automatically) -> ## End(No test) -> -> par(mfrow = c(2, 2)) -> plot(risk(model, parameter = "mu")[[1]]) -> plot(risk(model, parameter = "sigma")[[1]]) -> -> ## No test: -> ### Do not test the following code per default on CRAN as it takes some time to run: -> ### get back to orignal fit -> mstop(model) <- 400 -> plot(risk(model, parameter = "mu")[[1]]) -> plot(risk(model, parameter = "sigma")[[1]]) -> -> ### use different mstop values for the components -> mstop(model) <- c(100, 200) -> ## same as -> mstop(model) <- c(mu = 100, sigma = 200) -> ## or -> mstop(model) <- list(mu = 100, sigma = 200) -> ## or -> mstop(model) <- list(100, 200) -> -> plot(risk(model, parameter = "mu")[[1]]) -> plot(risk(model, parameter = "sigma")[[1]]) -> ### END (don't test automatically) -> ## End(No test) -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("methods", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> graphics::par(get("par.postscript", pos = 'CheckExEnv')) -> cleanEx() -> nameEx("weighted_median") -> ### * weighted_median -> -> flush(stderr()); flush(stdout()) -> -> base::assign(".ptime", proc.time(), pos = "CheckExEnv") -> ### Name: weighted.median -> ### Title: Weighted Median -> ### Aliases: weighted.median -> ### Keywords: methods -> -> ### ** Examples -> -> -> ## compute the weighted median with case weights -> x <- c(1, 2, 3, 4) -> w <- c(0, 1, 2, 3) -> weighted.median(x, w) -[1] 3.5 -> -> ## compute the weighted median with arbitrary weights -> x <- rnorm(100) -> w <- runif(100) -> weighted.median(x, w) -[1] 0.1532533 -> -> -> -> -> base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") -> base::cat("weighted_median", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") -> ### *