From db6c581cbc4eb30a3cf141ec85bd369a9f146184 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Fri, 3 Jan 2025 13:06:56 -0500 Subject: [PATCH 01/19] Renamed functions and parameters, documentation fixes --- DESCRIPTION | 2 +- NAMESPACE | 2 +- NEWS.md | 61 +++++++++++++------ R/Log_Likelihood.R | 12 ++-- R/PrestoGP_CreateU_Multivariate.R | 45 +++++++++----- R/PrestoGP_Full.R | 4 +- R/PrestoGP_Model.R | 47 ++++++++------ R/PrestoGP_Multivariate_Vecchia.R | 16 ++--- R/PrestoGP_Util_Functions.R | 6 +- R/PrestoGP_Vecchia.R | 12 ++-- man/PrestoGPModel-class.Rd | 5 +- man/createUMultivariate.Rd | 6 +- ...m.sequence.Rd => create_param_sequence.Rd} | 42 +++++++++---- man/prestogp_fit-PrestoGPModel-method.Rd | 19 ++++-- man/vecchia_Mlikelihood.Rd | 6 +- man/vecchia_Mprediction.Rd | 6 +- tests/testthat/test-Log_Likelihood.R | 18 +++--- .../test-PrestoGP_CreateU_Multivariate.R | 8 +-- tests/testthat/test-PrestoGP_Model.R | 6 +- ...test-PrestoGP_Multivariate_Vecchia_Model.R | 30 ++++----- tests/testthat/test-PrestoGP_Univariate.R | 30 ++++----- 21 files changed, 231 insertions(+), 152 deletions(-) rename man/{create.param.sequence.Rd => create_param_sequence.Rd} (68%) diff --git a/DESCRIPTION b/DESCRIPTION index edeff54..4c4dfbe 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9039 +Version: 0.2.0.9040 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NAMESPACE b/NAMESPACE index d581ac2..956b887 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,8 +8,8 @@ export(PrestoGPModel) export(VecchiaModel) export(as_label) export(as_name) -export(create.param.sequence) export(createUMultivariate) +export(create_param_sequence) export(enquo) export(enquos) export(get_Y) diff --git a/NEWS.md b/NEWS.md index f6e86bd..fbd659e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,42 +1,67 @@ +# PrestoGP 0.2.0.9040 (2025-1-3) + +## BREAKING CHANGES + +* The function `create.param.sequence` has been renamed to be + `create_param_sequence` for consistency with other function names + +* The parameter `apanasovich` has been renamed `common_scale` + throughout the package + +## MINOR IMPROVEMENTS + +* Tests were updated to reflect the new `common_scale` parameter and + the `create_param_sequence` function + +* Fixed some formatting issues in NEWS.md + +## DOCUMENTATION FIXES + +* The documentation for `create_param_seqence` was updated to clarify + how to extract/assign scale parameters when there is more than one + scale parameter per outcome + +* The documentation for `PrestoGP-Model-class` and `prestogp_fit` has + been updated to reflect the new `common_scale` parameter + # PrestoGP 0.2.0.9039 (2024-12-26) ## MINOR IMPROVEMENTS - * Rewrote some tests that were failing on some verions of R +* Rewrote some tests that were failing on some verions of R # PrestoGP 0.2.0.9038 (2024-12-23) ## NEW FEATURES - * Added the method `get_Y` to extract the Y values (including the imputed - Y values) from a PrestoGP model +* Added the method `get_Y` to extract the Y values (including the + imputed Y values) from a PrestoGP model - * Added the method `get_linear_model` to extract the fitted cv.glmnet object - from a PrestoGP model +* Added the method `get_linear_model` to extract the fitted cv.glmnet + object from a PrestoGP model - * Added the method `plot_beta` to plot the glide path of the - regression coefficients +* Added the method `plot_beta` to plot the glide path of the + regression coefficients ## MINOR IMPROVEMENTS - * Added a NEWS.md file to track changes in each update +* Added a NEWS.md file to track changes in each update - * Modified the `show` method to not print zero betas +* Modified the `show` method to not print zero betas - * Modified `prestogp_predict` to retun predictions in the form of a - list for multivariate models +* Modified `prestogp_predict` to retun predictions in the form of a + list for multivariate models ## BUG FIXES - * Fixed a bug in the intercept calculation in `get_beta` +* Fixed a bug in the intercept calculation in `get_beta` - * Fixed a bug where multivariate models with no variable names for X were - being assigned arbitrary variable names +* Fixed a bug where multivariate models with no variable names for X + were being assigned arbitrary variable names ## DOCUMENTATION FIXES - * Updated the documention in `PrestoGPModel-class` to reflect that the - Y_train slot is updated to contain imputed values during model - fitting +* Updated the documention in `PrestoGPModel-class` to reflect that the + Y_train slot is updated to contain imputed values during model fitting - * Added documentation for all new methods +* Added documentation for all new methods diff --git a/R/Log_Likelihood.R b/R/Log_Likelihood.R index 6ad10e0..2636966 100644 --- a/R/Log_Likelihood.R +++ b/R/Log_Likelihood.R @@ -67,14 +67,14 @@ negloglik.full <- function(logparams, d, y, param.seq) { #' @param vecchia.approx A Vecchia object returned by #' \code{\link{vecchia_Mspecify}}. #' @param covparams Vector of covariance parameters. See -#' \code{\link{create.param.sequence}} or the examples below for details +#' \code{\link{create_param_sequence}} or the examples below for details #' about the format of this vector. #' #' @return The log likelihood implied by the multivariate Vecchia #' approximation. #' #' @seealso \code{\link[GPvecchia]{vecchia_likelihood}}, -#' \code{\link{vecchia_Mspecify}}, \code{\link{create.param.sequence}} +#' \code{\link{vecchia_Mspecify}}, \code{\link{create_param_sequence}} #' #' @references #' \itemize{ @@ -92,7 +92,7 @@ negloglik.full <- function(logparams, d, y, param.seq) { #' locsm[[1]] <- locsm[[2]] <- locs #' soil.va <- vecchia_Mspecify(locsm, m=10) #' -#' pseq <- create.param.sequence(2) +#' pseq <- create_param_sequence(2) #' # Initialize the vector of covariance parameters #' params <- rep(NA, pseq[5,2]) #' # Sigma parameters: @@ -132,7 +132,7 @@ mvnegloglik <- function(logparams, vecchia.approx, y, param.seq, P) { # in the list # y : multivariate outcome, each out outcome in a separate entry in a list # param.seq: The vector of parameter index sequences created by the function - # create.param.sequence - Used to identify the beginning and end + # create_param_sequence - Used to identify the beginning and end # index locations of each parameter. # P <- length(y) @@ -159,7 +159,7 @@ mvnegloglik_ST <- function(logparams, vecchia.approx, y, param.seq, P, scaling, # in the list # y : multivariate outcome, each out outcome in a separate entry in a list # param.seq: The vector of parameter index sequences created by the function - # create.param.sequence - Used to identify the beginning and end + # create_param_sequence - Used to identify the beginning and end # index locations of each parameter. # P <- length(y) @@ -200,7 +200,7 @@ mvnegloglik.full <- function(logparams, locs, y, param.seq) { # in the list # y : multivariate outcome, each out outcome in a separate entry in a list # param.seq: The vector of parameter index sequences created by the function - # create.param.sequence - Used to identify the beginning and end + # create_param_sequence - Used to identify the beginning and end # index locations of each parameter. # P <- length(y) diff --git a/R/PrestoGP_CreateU_Multivariate.R b/R/PrestoGP_CreateU_Multivariate.R index 2757f42..ba7deee 100644 --- a/R/PrestoGP_CreateU_Multivariate.R +++ b/R/PrestoGP_CreateU_Multivariate.R @@ -6,6 +6,12 @@ #' @param P Number of outcome variables #' @param ns Number of scale parameters #' +#' @details This function is intended for advanced users who want to specify +#' the input Matern parameters for functions such as +#' \code{\link{vecchia_Mlikelihood}} or \code{\link{createUMultivariate}}. +#' To extract the Matern parameters from a fitted PrestoGP model, it is +#' strongly recommended to use \code{link{get_theta}} instead. +#' #' @return A matrix with five rows and two columns as described below: #' \describe{ #' \item{Row 1:}{Starting and ending indices for the sigma parameter(s)} @@ -40,7 +46,7 @@ #' # fit separate scale parameters for location and elevation #' soil.vm2 <- prestogp_fit(soil.vm2, y2, X2, locs2, scaling = c(1, 1, 2)) #' -#' pseq <- create.param.sequence(1, 2) +#' pseq <- create_param_sequence(1, 2) #' soil2.params <- soil.vm2@covparams #' # sigma #' soil2.params[pseq[1,1]:pseq[1,2]] @@ -52,25 +58,36 @@ #' soil2.params[pseq[4,1]:pseq[4,2]] #' #' # Multivariate model -#' data(soil) -#' soil <- soil[!is.na(soil[,5]),] # remove rows with NA's #' ym <- list() -#' ym[[1]] <- soil[,5] # predict two nitrogen concentration levels -#' ym[[2]] <- soil[,7] +#' ym[[1]] <- soil250[,4] # predict sand/silt portion of the sample +#' ym[[2]] <- soil250[,5] +#' ym[[3]] <- soil250[,6] #' Xm <- list() -#' Xm[[1]] <- Xm[[2]] <- as.matrix(soil[,c(4,6,8,9)]) +#' Xm[[1]] <- Xm[[2]] <- Xm[[3]] <- as.matrix(soil250[,7:22]) #' locsm <- list() -#' locsm[[1]] <- locsm[[2]] <- as.matrix(soil[,1:2]) +#' locsm[[1]] <- locsm[[2]] <- locsm[[3]] <- as.matrix(soil250[,1:3]) #' #' soil.mvm <- new("MultivariateVecchiaModel", n_neighbors = 10) #' soil.mvm <- prestogp_fit(soil.mvm, ym, Xm, locsm) #' -#' pseq <- create.param.sequence(2, 1) +#' pseq <- create_param_sequence(3, 2) #' soil.params <- soil.mvm@covparams #' # sigmas #' soil.params[pseq[1,1]:pseq[1,2]] #' # scale parameters -#' soil.params[pseq[2,1]:pseq[2,2]] +#' scale.seq <- pseq[2,1]:pseq[2,2] +#' # scale parameter for location, outcome 1 +#' soil.params[scale.seq[1]] +#' # scale parameter for elevation, outcome 1 +#' soil.params[scale.seq[2]] +#' # scale parameter for location, outcome 2 +#' soil.params[scale.seq[3]] +#' # scale parameter for elevation, outcome 2 +#' soil.params[scale.seq[4]] +#' # scale parameter for location, outcome 3 +#' soil.params[scale.seq[5]] +#' # scale parameter for elevation, outcome 3 +#' soil.params[scale.seq[6]] #' # smoothness parameters #' soil.params[pseq[3,1]:pseq[3,2]] #' # nuggets @@ -79,7 +96,7 @@ #' soil.corr <- diag(2) / 2 #' soil.corr[upper.tri(soil.corr)] <- soil.params[pseq[5,1]:pseq[5,2]] #' soil.corr <- soil.corr + t(soil.corr) -create.param.sequence <- function(P, ns = 1) { +create_param_sequence <- function(P, ns = 1) { nk <- choose(P, 2) if (nk == 0) { nk <- 1 # univariate case @@ -465,7 +482,7 @@ vecchia_Mspecify <- function(locs.list, m, locs.list.pred = NULL, #' #' @param vec.approx Object returned by \code{\link{vecchia_Mspecify}}. #' @param params Vector of covariance parameters. See -#' \code{\link{create.param.sequence}} or the examples below for details +#' \code{\link{create_param_sequence}} or the examples below for details #' about the format of this vector. #' @param cov_func The function used to compute the covariance between two #' observations. Defaults to a Matern model. @@ -481,7 +498,7 @@ vecchia_Mspecify <- function(locs.list, m, locs.list.pred = NULL, #' objects required for other functions. #' #' @seealso \code{\link[GPvecchia]{createU}}, \code{\link{vecchia_Mspecify}}, -#' \code{\link{create.param.sequence}} +#' \code{\link{create_param_sequence}} #' #' @references #' \itemize{ @@ -504,7 +521,7 @@ vecchia_Mspecify <- function(locs.list, m, locs.list.pred = NULL, #' locsm[[1]] <- locsm[[2]] <- locs #' soil.va <- vecchia_Mspecify(locsm, m=10) #' -#' pseq <- create.param.sequence(2) +#' pseq <- create_param_sequence(2) #' # Initialize the vector of covariance parameters #' params <- rep(NA, pseq[5,2]) #' # Sigma parameters: @@ -531,7 +548,7 @@ createUMultivariate <- function(vec.approx, params, cov_func = NULL) { n <- nrow(olocs) ondx <- vec.approx$ondx - param.seq <- create.param.sequence(P) + param.seq <- create_param_sequence(P) param.sequence.begin <- param.seq[, 1] param.sequence.end <- param.seq[, 2] diff --git a/R/PrestoGP_Full.R b/R/PrestoGP_Full.R index 50512d0..a538cb5 100644 --- a/R/PrestoGP_Full.R +++ b/R/PrestoGP_Full.R @@ -44,7 +44,7 @@ setMethod("compute_residuals", "FullModel", function(model, Y, Y.hat) { }) setMethod("estimate_theta", "FullModel", function(model, locs, optim.control, method) { - if (model@apanasovich) { + if (model@common_scale) { full.result <- optim( par = model@logparams, fn = negloglik.full, @@ -78,7 +78,7 @@ setMethod("transform_data", "FullModel", function(model, Y, X) { n <- nrow(model@Y_train) params <- model@covparams locs.scaled <- scale_locs(model, model@locs_train)[[1]] - if (!model@apanasovich) { + if (!model@common_scale) { param.seq <- model@param_sequence Omega.full <- params[1] * Matern(rdist(locs.scaled), range = 1, diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index d4258c0..aa0b0e7 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -47,10 +47,9 @@ setOldClass("cv.glmnet") #' @slot scaling The indices of the scale parameters. See #' \code{link{prestogp_fit}}. #' @slot nscale The number of scale parameters in the model. -#' @slot apanasovich Should the Apanasovich covariance model be used? See -#' References. +#' @slot common_scale Do all columns of locs have the same scale parameter? #' @slot param_sequence Records the indices of the various Matern parameters. -#' See \code{\link{create.param.sequence}}. +#' See \code{\link{create_param_sequence}}. #' #' @seealso \code{\link{VecchiaModel-class}}, \code{\link{FullModel-class}}, #' \code{\link{MultivariateVecchiaModel-class}}, \code{\link{prestogp_fit}} @@ -96,7 +95,7 @@ PrestoGPModel <- setClass("PrestoGPModel", alpha = "numeric", # the alpha ratio of ridge to lasso penalty scaling = "numeric", # the indices of the scale parameters, nscale = "numeric", # the number of scale parameters - apanasovich = "logical", # should the Apanasovich model be used + common_scale = "logical", # is there a common scale parameter? param_sequence = "matrix", # maps the indices of the various Matern parameters logparams = "numeric" # transformed version of the Matern parameters ) @@ -165,7 +164,7 @@ setGeneric("plot_beta", function(model, ...) standardGeneric("plot_beta")) setGeneric( "prestogp_fit", function(model, Y, X, locs, Y.names = NULL, X.names = NULL, scaling = NULL, - apanasovich = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, + common_scale = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, max_iters = 100, center.y = NULL, impute.y = FALSE, lod = NULL, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), @@ -742,9 +741,9 @@ setMethod( #' measure, the value of scaling would be c(1, 1, 2). The length of scaling #' must match the number of columns of locs. If it is not specified, all #' columns of locs will have a common scale parameter. -#' @param apanasovich Should the multivariate Matern model described in -#' Apanasovich et al. (2012) be used? Defaults to TRUE if there is only one -#' scale parameter for each outcome and FALSE otherwise. +#' @param common_scale Do all columsn of locs have a common scales parameter? +#' See Details for the effects of this parameter. Defaults to TRUE if there +#' is only one scale parameter for each outcome and FALSE otherwise. #' @param covparams The initial covariance parameters estimate (optional). #' @param beta.hat The initial beta parameters estimates (optional). #' @param tol The model is considered converged when error is not less than @@ -784,6 +783,16 @@ setMethod( #' @param parallel Should cv.glmnet use parallel "foreach" to fit each fold? #' Defaults to FALSE. See \code{\link[glmnet]{cv.glmnet}}. #' +#' @details If common_scale is TRUE, multivariate models will use the Matern +#' cross-covariance function described in Apanasovich et al. (2012). This +#' model can only be used if each outcome has only a single scale parameter. +#' If common_scale is FALSE, each column of locs will be divded by the +#' corresponding element of scaling, and the cross-covariance will be computed +#' under the assumption that all scale parameters are equal to 1. For +#' univariate models, the Vecchia approximation will not be recomputed in +#' each iteration of the model fitting procedure if common_scale is TRUE, +#' but the parameter is otherwise ignored. +#' #' @return A PrestoGPModel object with slots updated based on the results of #' the model fitting procedure. See \code{\link{PrestoGPModel-class}} for #' details. @@ -859,7 +868,7 @@ setMethod( setMethod( "prestogp_fit", "PrestoGPModel", function(model, Y, X, locs, Y.names = NULL, X.names = NULL, scaling = NULL, - apanasovich = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, + common_scale = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, max_iters = 100, center.y = NULL, impute.y = FALSE, lod = NULL, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), @@ -923,20 +932,20 @@ setMethod( stop("scaling must consist of sequential integers starting at 1") } } - if (is.null(apanasovich)) { + if (is.null(common_scale)) { if (nscale == 1) { - apanasovich <- TRUE + common_scale <- TRUE } else { - apanasovich <- FALSE + common_scale <- FALSE } } - if (apanasovich & nscale > 1) { - stop("Apanasovich models require a common scale parameter") + if (common_scale & nscale > 1) { + stop("common_scale must be FALSE if there are multiple scale parameters") } model@scaling <- scaling model@nscale <- nscale - model@apanasovich <- apanasovich - if (model@apanasovich & (length(model@locs_train) > 1)) { + model@common_scale <- common_scale + if (model@common_scale & (length(model@locs_train) > 1)) { model@locs_train <- eliminate_dupes(model@locs_train)$locs } if (!is.null(covparams)) { @@ -1012,7 +1021,7 @@ setMethod( } } # transform data to iid - if (!model@apanasovich) { + if (!model@common_scale) { model <- specify(model) } @@ -1182,7 +1191,7 @@ setMethod("calc_covparams", "PrestoGPModel", function(model, locs, Y, covparams) } else { P <- length(locs) } - pseq <- create.param.sequence(P, model@nscale) + pseq <- create_param_sequence(P, model@nscale) if (is.null(covparams)) { col.vars <- rep(NA, P) D.sample.bar <- rep(NA, model@nscale * P) @@ -1259,7 +1268,7 @@ setMethod("calc_covparams", "PrestoGPModel", function(model, locs, Y, covparams) #' @return a matrix with scaled locations #' @noRd setMethod("scale_locs", "PrestoGPModel", function(model, locs) { - if (model@apanasovich) { + if (model@common_scale) { return(locs) } else { locs.out <- locs diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index f8106b3..e22984e 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -76,7 +76,7 @@ setMethod("prestogp_predict", "MultivariateVecchiaModel", locs.train.scaled <- scale_locs(model, model@locs_train) locs.scaled <- scale_locs(model, locs) - if (model@apanasovich & (length(model@locs_train) > 1)) { + if (model@common_scale & (length(model@locs_train) > 1)) { locs.nd <- eliminate_dupes(locs.train.scaled, locs.scaled) locs.train.scaled <- locs.nd$locs locs.scaled <- locs.nd$locs.pred @@ -88,7 +88,7 @@ setMethod("prestogp_predict", "MultivariateVecchiaModel", ) ## carry out prediction - if (!model@apanasovich) { + if (!model@common_scale) { params <- model@covparams param.seq <- model@param_sequence pred <- vecchia_Mprediction(res, vec.approx.test, @@ -343,7 +343,7 @@ setMethod("impute_y", "MultivariateVecchiaModel", function(model) { all.obs <- all.obs[-(1:nl)] } - if (model@apanasovich & (length(model@locs_train) > 1)) { + if (model@common_scale & (length(model@locs_train) > 1)) { locs.nd <- eliminate_dupes(locs.otr, locs.otst) locs.otr <- locs.nd$locs locs.otst <- locs.nd$locs.pred @@ -355,7 +355,7 @@ setMethod("impute_y", "MultivariateVecchiaModel", function(model) { ) ## carry out prediction - if (!model@apanasovich) { + if (!model@common_scale) { params <- model@covparams param.seq <- model@param_sequence pred <- vecchia_Mprediction(res, vec.approx.test, @@ -385,7 +385,7 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, params <- model@covparams param.seq <- model@param_sequence P <- length(model@locs_train) - if (!model@apanasovich) { + if (!model@common_scale) { olocs.scaled <- vecchia.approx$locsord for (i in 1:vecchia.approx$P) { for (j in 1:model@nscale) { @@ -523,7 +523,7 @@ setMethod("specify", "MultivariateVecchiaModel", function(model) { locs <- model@locs_train locs.scaled <- scale_locs(model, locs) model@vecchia_approx <- vecchia_Mspecify(locs.scaled, model@n_neighbors) - if (!model@apanasovich) { + if (!model@common_scale) { olocs.scaled <- model@vecchia_approx$locsord for (i in seq_along(locs)) { for (j in 1:model@nscale) { @@ -548,7 +548,7 @@ setMethod("specify", "MultivariateVecchiaModel", function(model) { #' @noRd setMethod("estimate_theta", "MultivariateVecchiaModel", function(model, locs, optim.control, method) { P <- length(locs) - if (model@apanasovich) { + if (model@common_scale) { vecchia.result <- optim( par = model@logparams, fn = mvnegloglik, @@ -582,7 +582,7 @@ setMethod("estimate_theta", "MultivariateVecchiaModel", function(model, locs, op setMethod("transform_data", "MultivariateVecchiaModel", function(model, Y, X) { vecchia.approx <- model@vecchia_approx - if (!model@apanasovich) { + if (!model@common_scale) { params <- model@covparams param.seq <- model@param_sequence olocs.scaled <- vecchia.approx$locsord diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index a2f2d41..f5edfb5 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -227,7 +227,7 @@ revMat <- function(mat) { #' @param vecchia.approx A Vecchia object returned by #' \code{\link{vecchia_Mspecify}}. #' @param covparms Vector of covariance parameters. See -#' \code{\link{create.param.sequence}} or the examples below for details +#' \code{\link{create_param_sequence}} or the examples below for details #' about the format of this vector. #' @param var.exact Should prediction variances by computed exactly, or is a #' (faster) approximation acceptable? See @@ -240,7 +240,7 @@ revMat <- function(mat) { #' unobserved locations. See \code{\link[GPvecchia]{vecchia_prediction}}. #' #' @seealso \code{\link[GPvecchia]{vecchia_prediction}}, -#' \code{\link{vecchia_Mspecify}}, \code{\link{create.param.sequence}} +#' \code{\link{vecchia_Mspecify}}, \code{\link{create_param_sequence}} #' #' @references #' \itemize{ @@ -264,7 +264,7 @@ revMat <- function(mat) { #' locsp[[2]] <- locsp[[2]] - 0.5 #' soil.vap <- vecchia_Mspecify(locsm, m=10, locs.list.pred=locsp) #' -#' pseq <- create.param.sequence(2) +#' pseq <- create_param_sequence(2) #' # Initialize the vector of covariance parameters #' params <- rep(NA, pseq[5,2]) #' # Sigma parameters: diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 2de181e..08a2937 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -69,7 +69,7 @@ setMethod("prestogp_predict", "VecchiaModel", vec.approx.test <- vecchia_specify(locs.train.scaled, m, locs.pred = locs.scaled, ordering.pred = ordering.pred, pred.cond = pred.cond) ## carry out prediction - if (!model@apanasovich) { + if (!model@common_scale) { pred <- vecchia_prediction( res, vec.approx.test, @@ -218,7 +218,7 @@ setMethod("impute_y", "VecchiaModel", function(model) { ordering.pred = "obspred", pred.cond = "independent") ## carry out prediction - if (!model@apanasovich) { + if (!model@common_scale) { pred <- vecchia_prediction( res, vec.approx.test, @@ -246,7 +246,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, miss <- !model@Y_obs vecchia.approx <- model@vecchia_approx params <- model@covparams - if (!model@apanasovich) { + if (!model@common_scale) { vecchia.approx$locsord <- scale_locs( model, list(vecchia.approx$locsord) @@ -340,7 +340,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, setMethod("specify", "VecchiaModel", function(model) { locs.scaled <- scale_locs(model, model@locs_train) model@vecchia_approx <- vecchia_specify(locs.scaled[[1]], model@n_neighbors) - if (!model@apanasovich) { + if (!model@common_scale) { olocs.scaled <- model@vecchia_approx$locsord for (j in 1:model@nscale) { olocs.scaled[, model@scaling == j] <- olocs.scaled[, model@scaling == j] * @@ -361,7 +361,7 @@ setMethod("specify", "VecchiaModel", function(model) { #' @return a model with an updated covariance parameters estimate #' @noRd setMethod("estimate_theta", "VecchiaModel", function(model, locs, optim.control, method) { - if (model@apanasovich) { + if (model@common_scale) { vecchia.result <- optim( par = model@logparams, fn = negloglik_vecchia, @@ -404,7 +404,7 @@ setMethod("estimate_theta", "VecchiaModel", function(model, locs, optim.control, setMethod("transform_data", "VecchiaModel", function(model, Y, X) { vecchia.approx <- model@vecchia_approx params <- model@covparams - if (!model@apanasovich) { + if (!model@common_scale) { vecchia.approx$locsord <- scale_locs( model, list(vecchia.approx$locsord) diff --git a/man/PrestoGPModel-class.Rd b/man/PrestoGPModel-class.Rd index e1ba7e4..195c3e5 100644 --- a/man/PrestoGPModel-class.Rd +++ b/man/PrestoGPModel-class.Rd @@ -77,11 +77,10 @@ approximation. Ignored for full models.} \item{\code{nscale}}{The number of scale parameters in the model.} -\item{\code{apanasovich}}{Should the Apanasovich covariance model be used? See -References.} +\item{\code{common_scale}}{Do all columns of locs have the same scale parameter?} \item{\code{param_sequence}}{Records the indices of the various Matern parameters. -See \code{\link{create.param.sequence}}.} +See \code{\link{create_param_sequence}}.} }} \examples{ diff --git a/man/createUMultivariate.Rd b/man/createUMultivariate.Rd index 5611e04..8d3e092 100644 --- a/man/createUMultivariate.Rd +++ b/man/createUMultivariate.Rd @@ -10,7 +10,7 @@ createUMultivariate(vec.approx, params, cov_func = NULL) \item{vec.approx}{Object returned by \code{\link{vecchia_Mspecify}}.} \item{params}{Vector of covariance parameters. See -\code{\link{create.param.sequence}} or the examples below for details +\code{\link{create_param_sequence}} or the examples below for details about the format of this vector.} \item{cov_func}{The function used to compute the covariance between two @@ -42,7 +42,7 @@ locsm <- list() locsm[[1]] <- locsm[[2]] <- locs soil.va <- vecchia_Mspecify(locsm, m=10) -pseq <- create.param.sequence(2) +pseq <- create_param_sequence(2) # Initialize the vector of covariance parameters params <- rep(NA, pseq[5,2]) # Sigma parameters: @@ -71,5 +71,5 @@ approximations of Gaussian processes", Statistical Science (2021) } \seealso{ \code{\link[GPvecchia]{createU}}, \code{\link{vecchia_Mspecify}}, -\code{\link{create.param.sequence}} +\code{\link{create_param_sequence}} } diff --git a/man/create.param.sequence.Rd b/man/create_param_sequence.Rd similarity index 68% rename from man/create.param.sequence.Rd rename to man/create_param_sequence.Rd index fd95847..c2346d1 100644 --- a/man/create.param.sequence.Rd +++ b/man/create_param_sequence.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/PrestoGP_CreateU_Multivariate.R -\name{create.param.sequence} -\alias{create.param.sequence} +\name{create_param_sequence} +\alias{create_param_sequence} \title{Extract specific Matern parameters from a parameter sequence} \usage{ -create.param.sequence(P, ns = 1) +create_param_sequence(P, ns = 1) } \arguments{ \item{P}{Number of outcome variables} @@ -25,6 +25,13 @@ A matrix with five rows and two columns as described below: This function is used to obtain specific Matern parameters (e.g., range or smoothness) from the covparams slot of a PrestoGPModel object. } +\details{ +This function is intended for advanced users who want to specify +the input Matern parameters for functions such as +\code{\link{vecchia_Mlikelihood}} or \code{\link{createUMultivariate}}. +To extract the Matern parameters from a fitted PrestoGP model, it is +strongly recommended to use \code{link{get_theta}} instead. +} \examples{ # Space/elevation model data(soil250, package="geoR") @@ -37,7 +44,7 @@ soil.vm2 <- new("VecchiaModel", n_neighbors = 10) # fit separate scale parameters for location and elevation soil.vm2 <- prestogp_fit(soil.vm2, y2, X2, locs2, scaling = c(1, 1, 2)) -pseq <- create.param.sequence(1, 2) +pseq <- create_param_sequence(1, 2) soil2.params <- soil.vm2@covparams # sigma soil2.params[pseq[1,1]:pseq[1,2]] @@ -49,25 +56,36 @@ soil2.params[pseq[3,1]:pseq[3,2]] soil2.params[pseq[4,1]:pseq[4,2]] # Multivariate model -data(soil) -soil <- soil[!is.na(soil[,5]),] # remove rows with NA's ym <- list() -ym[[1]] <- soil[,5] # predict two nitrogen concentration levels -ym[[2]] <- soil[,7] +ym[[1]] <- soil250[,4] # predict sand/silt portion of the sample +ym[[2]] <- soil250[,5] +ym[[3]] <- soil250[,6] Xm <- list() -Xm[[1]] <- Xm[[2]] <- as.matrix(soil[,c(4,6,8,9)]) +Xm[[1]] <- Xm[[2]] <- Xm[[3]] <- as.matrix(soil250[,7:22]) locsm <- list() -locsm[[1]] <- locsm[[2]] <- as.matrix(soil[,1:2]) +locsm[[1]] <- locsm[[2]] <- locsm[[3]] <- as.matrix(soil250[,1:3]) soil.mvm <- new("MultivariateVecchiaModel", n_neighbors = 10) soil.mvm <- prestogp_fit(soil.mvm, ym, Xm, locsm) -pseq <- create.param.sequence(2, 1) +pseq <- create_param_sequence(3, 2) soil.params <- soil.mvm@covparams # sigmas soil.params[pseq[1,1]:pseq[1,2]] # scale parameters -soil.params[pseq[2,1]:pseq[2,2]] +scale.seq <- pseq[2,1]:pseq[2,2] +# scale parameter for location, outcome 1 +soil.params[scale.seq[1]] +# scale parameter for elevation, outcome 1 +soil.params[scale.seq[2]] +# scale parameter for location, outcome 2 +soil.params[scale.seq[3]] +# scale parameter for elevation, outcome 2 +soil.params[scale.seq[4]] +# scale parameter for location, outcome 3 +soil.params[scale.seq[5]] +# scale parameter for elevation, outcome 3 +soil.params[scale.seq[6]] # smoothness parameters soil.params[pseq[3,1]:pseq[3,2]] # nuggets diff --git a/man/prestogp_fit-PrestoGPModel-method.Rd b/man/prestogp_fit-PrestoGPModel-method.Rd index c15216a..6cb404f 100644 --- a/man/prestogp_fit-PrestoGPModel-method.Rd +++ b/man/prestogp_fit-PrestoGPModel-method.Rd @@ -13,7 +13,7 @@ Y.names = NULL, X.names = NULL, scaling = NULL, - apanasovich = NULL, + common_scale = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, @@ -56,9 +56,9 @@ measure, the value of scaling would be c(1, 1, 2). The length of scaling must match the number of columns of locs. If it is not specified, all columns of locs will have a common scale parameter.} -\item{apanasovich}{Should the multivariate Matern model described in -Apanasovich et al. (2012) be used? Defaults to TRUE if there is only one -scale parameter for each outcome and FALSE otherwise.} +\item{common_scale}{Do all columsn of locs have a common scales parameter? +See Details for the effects of this parameter. Defaults to TRUE if there +is only one scale parameter for each outcome and FALSE otherwise.} \item{covparams}{The initial covariance parameters estimate (optional).} @@ -122,6 +122,17 @@ details. This method fits a PrestoGP model given a set of locations and predictor and outcome variables. } +\details{ +If common_scale is TRUE, multivariate models will use the Matern +cross-covariance function described in Apanasovich et al. (2012). This +model can only be used if each outcome has only a single scale parameter. +If common_scale is FALSE, each column of locs will be divded by the +corresponding element of scaling, and the cross-covariance will be computed +under the assumption that all scale parameters are equal to 1. For +univariate models, the Vecchia approximation will not be recomputed in +each iteration of the model fitting procedure if common_scale is TRUE, +but the parameter is otherwise ignored. +} \examples{ data(soil) soil <- soil[!is.na(soil[,5]),] # remove rows with NA's diff --git a/man/vecchia_Mlikelihood.Rd b/man/vecchia_Mlikelihood.Rd index 507cf48..edc209f 100644 --- a/man/vecchia_Mlikelihood.Rd +++ b/man/vecchia_Mlikelihood.Rd @@ -13,7 +13,7 @@ vecchia_Mlikelihood(z, vecchia.approx, covparams) \code{\link{vecchia_Mspecify}}.} \item{covparams}{Vector of covariance parameters. See -\code{\link{create.param.sequence}} or the examples below for details +\code{\link{create_param_sequence}} or the examples below for details about the format of this vector.} } \value{ @@ -31,7 +31,7 @@ locsm <- list() locsm[[1]] <- locsm[[2]] <- locs soil.va <- vecchia_Mspecify(locsm, m=10) -pseq <- create.param.sequence(2) +pseq <- create_param_sequence(2) # Initialize the vector of covariance parameters params <- rep(NA, pseq[5,2]) # Sigma parameters: @@ -56,5 +56,5 @@ approximations of Gaussian processes", Statistical Science (2021) } \seealso{ \code{\link[GPvecchia]{vecchia_likelihood}}, -\code{\link{vecchia_Mspecify}}, \code{\link{create.param.sequence}} +\code{\link{vecchia_Mspecify}}, \code{\link{create_param_sequence}} } diff --git a/man/vecchia_Mprediction.Rd b/man/vecchia_Mprediction.Rd index 32992f0..c865942 100644 --- a/man/vecchia_Mprediction.Rd +++ b/man/vecchia_Mprediction.Rd @@ -19,7 +19,7 @@ vecchia_Mprediction( \code{\link{vecchia_Mspecify}}.} \item{covparms}{Vector of covariance parameters. See -\code{\link{create.param.sequence}} or the examples below for details +\code{\link{create_param_sequence}} or the examples below for details about the format of this vector.} \item{var.exact}{Should prediction variances by computed exactly, or is a @@ -50,7 +50,7 @@ locsp[[1]] <- locsp[[1]] + 0.5 locsp[[2]] <- locsp[[2]] - 0.5 soil.vap <- vecchia_Mspecify(locsm, m=10, locs.list.pred=locsp) -pseq <- create.param.sequence(2) +pseq <- create_param_sequence(2) # Initialize the vector of covariance parameters params <- rep(NA, pseq[5,2]) # Sigma parameters: @@ -78,5 +78,5 @@ Biological and Environmental Statistics (2020) 25:383-414. } \seealso{ \code{\link[GPvecchia]{vecchia_prediction}}, -\code{\link{vecchia_Mspecify}}, \code{\link{create.param.sequence}} +\code{\link{vecchia_Mspecify}}, \code{\link{create_param_sequence}} } diff --git a/tests/testthat/test-Log_Likelihood.R b/tests/testthat/test-Log_Likelihood.R index 061485d..8d1814a 100644 --- a/tests/testthat/test-Log_Likelihood.R +++ b/tests/testthat/test-Log_Likelihood.R @@ -11,7 +11,7 @@ test_that("negloglik_vecchia", { y <- as.vector(y) logparams <- create.initial.values.flex(0.9, 0.5, 0.5, 0.1, 1, 1) - pseq <- create.param.sequence(1) + pseq <- create_param_sequence(1) vec.approx <- vecchia_specify(locs, 5) LL.vecchia <- negloglik_vecchia(logparams, y, vec.approx, pseq) expect_equal(194.75, LL.vecchia, tolerance = 1e-2) @@ -52,7 +52,7 @@ test_that("negloglik_vecchia_ST", { y <- as.vector(y) logparams <- create.initial.values.flex(0.9, c(2, 3), 0.5, 0.1, 1, 1) - pseq <- create.param.sequence(1, 2) + pseq <- create_param_sequence(1, 2) vec.approx <- vecchia_specify(locs, 5) LL.vecchia <- negloglik_vecchia_ST( logparams, y, vec.approx, pseq, @@ -61,7 +61,7 @@ test_that("negloglik_vecchia_ST", { expect_equal(284.73, LL.vecchia, tolerance = 1e-2) logparams2 <- create.initial.values.flex(0.9, 1, 0.5, 0.1, 1, 1) - pseq2 <- create.param.sequence(1) + pseq2 <- create_param_sequence(1) vec.approx2 <- vec.approx vec.approx2$locsord[, 1:2] <- vec.approx$locsord[, 1:2] / 2 vec.approx2$locsord[, 3] <- vec.approx$locsord[, 3] / 3 @@ -97,7 +97,7 @@ test_that("negloglik.full", { ) d <- rdist(locs) - pseq <- create.param.sequence(1) + pseq <- create_param_sequence(1) res.optim.NM <- optim( par = params.init, fn = negloglik.full, d = d, y = y, @@ -159,7 +159,7 @@ test_that("negloglik_full_ST", { y <- as.vector(y) logparams <- create.initial.values.flex(0.9, c(2, 3), 0.5, 0.1, 1, 1) - pseq <- create.param.sequence(1, 2) + pseq <- create_param_sequence(1, 2) LL.full <- negloglik_full_ST( logparams, locs, y, pseq, c(1, 1, 2), 2 @@ -167,7 +167,7 @@ test_that("negloglik_full_ST", { expect_equal(286.84, LL.full, tolerance = 1e-2) logparams2 <- create.initial.values.flex(0.9, 1, 0.5, 0.1, 1, 1) - pseq2 <- create.param.sequence(1) + pseq2 <- create_param_sequence(1) locs2 <- locs locs2[, 1:2] <- locs[, 1:2] / 2 locs2[, 3] <- locs[, 3] / 3 @@ -190,7 +190,7 @@ test_that("mvnegloglik", { cov_mat, P ) - pseq <- create.param.sequence(P) + pseq <- create_param_sequence(P) vec.approx <- vecchia_Mspecify(locs.list, 25) neg_likelihood <- mvnegloglik( logparams, vec.approx, @@ -212,7 +212,7 @@ test_that("mvnegloglik_ST", { cov_mat, P ) - pseq <- create.param.sequence(P, 2) + pseq <- create_param_sequence(P, 2) vec.approx <- vecchia_Mspecify(locs.list, 25) neg_likelihood <- mvnegloglik_ST( logparams, vec.approx, @@ -271,7 +271,7 @@ test_that("mvnegloglik_ST", { test_that("mvnegloglik.full", { source("sim_multivariate_lik.R") - pseq <- create.param.sequence(3) + pseq <- create_param_sequence(3) param.marg.var <- 0.9 * unlist(lapply(y.list, var)) param.marg.scale <- rep(1, 3) diff --git a/tests/testthat/test-PrestoGP_CreateU_Multivariate.R b/tests/testthat/test-PrestoGP_CreateU_Multivariate.R index 9c98a09..76e1d4b 100644 --- a/tests/testthat/test-PrestoGP_CreateU_Multivariate.R +++ b/tests/testthat/test-PrestoGP_CreateU_Multivariate.R @@ -1,5 +1,5 @@ -test_that("create.param.sequence", { - seq <- create.param.sequence(1) +test_that("create_param_sequence", { + seq <- create_param_sequence(1) colnames(seq) <- NULL expect_equal(2, ncol(seq)) expect_equal(5, nrow(seq)) @@ -9,7 +9,7 @@ test_that("create.param.sequence", { expect_equal(c(4, 4), seq[4, ]) expect_equal(c(5, 5), seq[5, ]) - seq <- create.param.sequence(3) + seq <- create_param_sequence(3) colnames(seq) <- NULL expect_equal(2, ncol(seq)) expect_equal(5, nrow(seq)) @@ -19,7 +19,7 @@ test_that("create.param.sequence", { expect_equal(c(10, 12), seq[4, ]) expect_equal(c(13, 15), seq[5, ]) - seq <- create.param.sequence(3, 2) + seq <- create_param_sequence(3, 2) colnames(seq) <- NULL expect_equal(2, ncol(seq)) expect_equal(5, nrow(seq)) diff --git a/tests/testthat/test-PrestoGP_Model.R b/tests/testthat/test-PrestoGP_Model.R index 8e26824..6fa5570 100644 --- a/tests/testthat/test-PrestoGP_Model.R +++ b/tests/testthat/test-PrestoGP_Model.R @@ -70,15 +70,15 @@ test_that("scaling not sequential", { ) }) -test_that("Invalid Apanasovich model", { +test_that("common_scale=TRUE with multiple scale paraemters", { source("sim_vecchia_small.R") pgp.model1 <- new("VecchiaModel") expect_error( prestogp_fit(pgp.model1, y, X, locs, scaling = 1:2, - apanasovich = TRUE + common_scale = TRUE ), - "Apanasovich models require a common scale parameter" + "common_scale must be FALSE if there are multiple scale parameters" ) }) diff --git a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R index 54a41b3..f297b6d 100644 --- a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R +++ b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R @@ -264,7 +264,7 @@ test_that("Simulated dataset multivariate spatial", { c("x2_1", "x2_2", "x2_3", "x2_4", "x2_5", "x2_6", "x2_7", "x2_8", "x2_9", "x2_10"), c("x3_1", "x3_2", "x3_3", "x3_4", "x3_5", "x3_6", "x3_7", "x3_8", "x3_9", "x3_10")), - scaling = c(1, 1), apanasovich = TRUE, quiet = TRUE, + scaling = c(1, 1), common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -379,7 +379,7 @@ test_that("Simulated dataset multivariate spatial", { pgp.mmodel2 <- new("MultivariateVecchiaModel", n_neighbors = 25) pgp.mmodel2 <- prestogp_fit(pgp.mmodel2, y.list.na, X.st, locs.list, - scaling = c(1, 1), apanasovich = TRUE, quiet = TRUE, + scaling = c(1, 1), common_scale = TRUE, quiet = TRUE, impute.y = TRUE, optim.control = list(trace = 0, maxit = 5000, reltol = 1e-3)) beta.out2 <- get_beta(pgp.mmodel2) @@ -442,7 +442,7 @@ test_that("Simulated dataset multivariate spatial", { # Missing data with lod pgp.mmodel3 <- new("MultivariateVecchiaModel", n_neighbors = 25) pgp.mmodel3 <- prestogp_fit(pgp.mmodel3, y.list.lod, X.st, locs.list, - scaling = c(1, 1), apanasovich = TRUE, verbose = TRUE, + scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, impute.y = TRUE, lod = lod.cut, optim.control = list(trace = 0, maxit = 5000, reltol = 1e-3)) beta.out3 <- get_beta(pgp.mmodel3) @@ -575,7 +575,7 @@ test_that("Invalid locs input for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -593,7 +593,7 @@ test_that("Invalid X input for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -611,7 +611,7 @@ test_that("locs/X length mismatch for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -629,7 +629,7 @@ test_that("locs/locs_train length mismatch", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -650,7 +650,7 @@ test_that("locs not a matrix for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -674,7 +674,7 @@ test_that("ncol(locs) != ncol(locs_train)", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -698,7 +698,7 @@ test_that("X not a matrix for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -717,7 +717,7 @@ test_that("nrow(X) != nrow(locs) for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -736,7 +736,7 @@ test_that("ncol(X) != ncol(X_train) for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -755,7 +755,7 @@ test_that("m too small for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -773,7 +773,7 @@ test_that("m too large for prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -793,7 +793,7 @@ test_that("Simulated dataset multivariate spatial prediction", { pgp.mmodel1 <- prestogp_fit(pgp.mmodel1, y.list.otr, X.st.otr, locs.list.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 diff --git a/tests/testthat/test-PrestoGP_Univariate.R b/tests/testthat/test-PrestoGP_Univariate.R index ef5ccf3..3557bc2 100644 --- a/tests/testthat/test-PrestoGP_Univariate.R +++ b/tests/testthat/test-PrestoGP_Univariate.R @@ -146,7 +146,7 @@ test_that("Simulated dataset spatial", { pgp.model1 <- new("VecchiaModel", n_neighbors = 25) pgp.model1 <- prestogp_fit(pgp.model1, y, X, locs, Y.names = "test", X.names = c("x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10"), - scaling = c(1, 1), apanasovich = TRUE, quiet = TRUE, + scaling = c(1, 1), common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -207,7 +207,7 @@ test_that("Simulated dataset spatial", { pgp.model2 <- new("FullModel") pgp.model2 <- prestogp_fit(pgp.model2, y, X, locs, - scaling = c(1, 1), apanasovich = TRUE, quiet = TRUE, verbose = TRUE, + scaling = c(1, 1), common_scale = TRUE, quiet = TRUE, verbose = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -251,7 +251,7 @@ test_that("Simulated dataset spatial", { pgp.model3 <- new("VecchiaModel", n_neighbors = 25) pgp.model3 <- prestogp_fit(pgp.model3, y.na, X, locs, - scaling = c(1, 1), apanasovich = TRUE, quiet = FALSE, + scaling = c(1, 1), common_scale = TRUE, quiet = FALSE, impute.y = TRUE, optim.control = list( trace = 0, maxit = 5000, @@ -278,7 +278,7 @@ test_that("Simulated dataset spatial", { pgp.model4 <- new("VecchiaModel", n_neighbors = 25) pgp.model4 <- prestogp_fit(pgp.model4, y.na.lod, X, locs, - scaling = c(1, 1), apanasovich = TRUE, verbose = TRUE, + scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, impute.y = TRUE, lod = lod.cut, optim.control = list( trace = 0, maxit = 5000, @@ -305,7 +305,7 @@ test_that("Simulated dataset spatiotemporal", { pgp.model1 <- new("VecchiaModel", n_neighbors = 25) pgp.model1 <- prestogp_fit(pgp.model1, Y, X, locs, scaling = c(1, 1, 2), - apanasovich = FALSE, quiet = TRUE, + common_scale = FALSE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -354,7 +354,7 @@ test_that("Simulated dataset spatiotemporal", { pgp.model2 <- new("FullModel", n_neighbors = 25) pgp.model2 <- prestogp_fit(pgp.model2, y, X, locs, scaling = c(1, 1, 2), - apanasovich = FALSE, quiet = TRUE, + common_scale = FALSE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -397,7 +397,7 @@ test_that("Invalid locs input for prediction", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -415,7 +415,7 @@ test_that("Invalid X input for prediction", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -433,7 +433,7 @@ test_that("ncol(locs) != ncol(locs_train)", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -452,7 +452,7 @@ test_that("nrow(X) != nrow(locs) for prediction", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -471,7 +471,7 @@ test_that("ncol(X) != ncol(X_train) for prediction", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -490,7 +490,7 @@ test_that("m too small for prediction", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -508,7 +508,7 @@ test_that("full prediction not implemented", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -526,7 +526,7 @@ test_that("m too large for prediction", { pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -543,7 +543,7 @@ test_that("Simulated spatial prediction", { pgp.model1 <- new("VecchiaModel", n_neighbors = 25) pgp.model1 <- prestogp_fit(pgp.model1, y.otr, X.otr, locs.otr, scaling = c(1, 1), - apanasovich = TRUE, quiet = TRUE, + common_scale = TRUE, quiet = TRUE, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 From c405919b5a3e050eb89869703cca77fe671b49e9 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Tue, 7 Jan 2025 12:38:43 -0500 Subject: [PATCH 02/19] Adaptive lasso --- DESCRIPTION | 2 +- NEWS.md | 11 ++++++++ R/PrestoGP_Model.R | 31 +++++++++++++++-------- man/prestogp_fit-PrestoGPModel-method.Rd | 8 +++++- tests/testthat/test-PrestoGP_Univariate.R | 22 ++++++++++++++++ 5 files changed, 61 insertions(+), 13 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4c4dfbe..dcbc414 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9040 +Version: 0.2.0.9041 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NEWS.md b/NEWS.md index fbd659e..80f3114 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,14 @@ +# PrestoGP 0.2.0.9041 (2025-1-7) + +## NEW FEATURES + +* Added the option `adaptive` to `prestogp_fit` to allow fitting an + adaptive lasso model + +## MINOR IMPROVEMENTS + +* Eliminated some redundant code in `estimate_betas` + # PrestoGP 0.2.0.9040 (2025-1-3) ## BREAKING CHANGES diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index aa0b0e7..9df6340 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -169,7 +169,7 @@ setGeneric( quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, - parallel = FALSE) { + parallel = FALSE, adaptive = FALSE) { standardGeneric("prestogp_fit") } ) @@ -264,7 +264,7 @@ setGeneric("specify", function(model, ...) standardGeneric("specify")) setGeneric("compute_residuals", function(model, Y, Y.hat, family) standardGeneric("compute_residuals")) setGeneric("transform_data", function(model, Y, X) standardGeneric("transform_data")) setGeneric("estimate_theta", function(model, locs, optim.control, method) standardGeneric("estimate_theta")) -setGeneric("estimate_betas", function(model, family, nfolds, foldid, parallel, lodv) standardGeneric("estimate_betas")) +setGeneric("estimate_betas", function(model, family, nfolds, foldid, parallel, adaptive) standardGeneric("estimate_betas")) setGeneric("impute_y", function(model) standardGeneric("impute_y")) setGeneric("impute_y_lod", function(model, lod, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel, verbose) standardGeneric("impute_y_lod")) setGeneric("compute_error", function(model, y, X) standardGeneric("compute_error")) @@ -782,6 +782,8 @@ setMethod( #' cross-validation. See \code{\link[glmnet]{cv.glmnet}}. #' @param parallel Should cv.glmnet use parallel "foreach" to fit each fold? #' Defaults to FALSE. See \code{\link[glmnet]{cv.glmnet}}. +#' @param adaptive Should adaptive lasso be used? See Zou (2006) for details. +#' Defaults to FALSE. #' #' @details If common_scale is TRUE, multivariate models will use the Matern #' cross-covariance function described in Apanasovich et al. (2012). This @@ -808,6 +810,8 @@ setMethod( #' \item Messier, K.P. and Katzfuss, M. "Scalable penalized spatiotemporal #' land-use regression for ground-level nitrogen dioxide", The Annals of #' Applied Statistics (2021) 15(2):688-710. +#' \item Zou, H. "The adaptive lasso and its oracle properties", Journal of +#' the American Statistical Association (2006) 101(476):1418-1429. #' } #' #' @aliases prestogp_fit @@ -873,7 +877,7 @@ setMethod( quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), family = c("gaussian", "binomial"), - nfolds = 10, foldid = NULL, parallel = FALSE) { + nfolds = 10, foldid = NULL, parallel = FALSE, adaptive = FALSE) { if (quiet & verbose) { verbose <- FALSE } @@ -1040,7 +1044,8 @@ setMethod( cat("Estimating beta...", "\n") } model <- transform_data(model, model@Y_train, model@X_train) - model <- estimate_betas(model, family, nfolds, foldid, parallel, lodv) + model <- estimate_betas(model, family, nfolds, foldid, parallel, + adaptive) if (!quiet) { cat("Estimation of beta complete", "\n") if (verbose) { @@ -1101,16 +1106,20 @@ setMethod( #' @return A model with updated coefficients #' @noRd setMethod("estimate_betas", "PrestoGPModel", function(model, family, nfolds, - foldid, parallel, lodv) { - if (min(lodv) < Inf) { - model@linear_model <- cv.glmnet(as.matrix(model@X_tilde), - as.matrix(model@y_tilde), alpha = model@alpha, family = family, + foldid, parallel, adaptive) { + if (adaptive) { + ridge.model <- cv.glmnet(as.matrix(model@X_tilde), + as.matrix(model@y_tilde), alpha = 0, family = family, nfolds = nfolds, foldid = foldid, parallel = parallel) + pen.factor <- 1 / abs(as.numeric(coef(ridge.model, + s = ridge.model$lambda.min))[-1]) } else { - model@linear_model <- cv.glmnet(as.matrix(model@X_tilde), - as.matrix(model@y_tilde), alpha = model@alpha, family = family, - nfolds = nfolds, foldid = foldid, parallel = parallel) + pen.factor <- rep(1, ncol(model@X_tilde)) } + model@linear_model <- cv.glmnet(as.matrix(model@X_tilde), + as.matrix(model@y_tilde), alpha = model@alpha, family = family, + nfolds = nfolds, foldid = foldid, parallel = parallel, + penalty.factor = pen.factor) idmin <- which(model@linear_model$lambda == model@linear_model$lambda.min) semin <- model@linear_model$cvm[idmin] + model@linear_model$cvsd[idmin] lambda_1se <- max(model@linear_model$lambda[model@linear_model$cvm <= semin]) diff --git a/man/prestogp_fit-PrestoGPModel-method.Rd b/man/prestogp_fit-PrestoGPModel-method.Rd index 6cb404f..d2e4263 100644 --- a/man/prestogp_fit-PrestoGPModel-method.Rd +++ b/man/prestogp_fit-PrestoGPModel-method.Rd @@ -28,7 +28,8 @@ family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, - parallel = FALSE + parallel = FALSE, + adaptive = FALSE ) } \arguments{ @@ -112,6 +113,9 @@ cross-validation. See \code{\link[glmnet]{cv.glmnet}}.} \item{parallel}{Should cv.glmnet use parallel "foreach" to fit each fold? Defaults to FALSE. See \code{\link[glmnet]{cv.glmnet}}.} + +\item{adaptive}{Should adaptive lasso be used? See Zou (2006) for details. +Defaults to FALSE.} } \value{ A PrestoGPModel object with slots updated based on the results of @@ -194,6 +198,8 @@ of components", Journal of the American Statistical Association (2012) \item Messier, K.P. and Katzfuss, M. "Scalable penalized spatiotemporal land-use regression for ground-level nitrogen dioxide", The Annals of Applied Statistics (2021) 15(2):688-710. +\item Zou, H. "The adaptive lasso and its oracle properties", Journal of +the American Statistical Association (2006) 101(476):1418-1429. } } \seealso{ diff --git a/tests/testthat/test-PrestoGP_Univariate.R b/tests/testthat/test-PrestoGP_Univariate.R index 3557bc2..e517821 100644 --- a/tests/testthat/test-PrestoGP_Univariate.R +++ b/tests/testthat/test-PrestoGP_Univariate.R @@ -296,6 +296,28 @@ test_that("Simulated dataset spatial", { expect_equal(params.out[2], params.out3[2], tolerance = 0.8) expect_equal(params.out[3], params.out3[3], tolerance = 0.7) expect_equal(params.out[4], params.out3[4], tolerance = 1) + + # Adaptive lasso fit + pgp.model5 <- new("VecchiaModel") + pgp.model5 <- prestogp_fit(pgp.model5, y, X, locs, + scaling = c(1, 1), common_scale = TRUE, quiet = TRUE, adaptive = TRUE, + optim.control = list( + trace = 0, maxit = 5000, + reltol = 1e-3 + ) + ) + beta.out5 <- get_beta(pgp.model5) + params.out5 <- pgp.model5@covparams + + # Adaptive and non-adaptive fits should be approximately equal + expect_equal(as.numeric(beta.out[[2]]), as.numeric(beta.out5[[2]]), + tolerance = 0.005) + expect_equal(as.numeric(beta.out[[1]]), as.numeric(beta.out5[[1]]), + tolerance = 0.05) + expect_equal(params.out[1], params.out5[1], tolerance = 0.9) + expect_equal(params.out[2] - params.out5[2], 0, tolerance = 0.2) + expect_equal(params.out[3], params.out5[3], tolerance = 0.3) + expect_equal(params.out[4], params.out5[4], tolerance = 0.2) }) test_that("Simulated dataset spatiotemporal", { From 6ee742fb4b6553c4945345f56a2f85f337d2fbd9 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Tue, 14 Jan 2025 18:03:25 -0500 Subject: [PATCH 03/19] Relaxed lasso --- DESCRIPTION | 2 +- NEWS.md | 18 +++++++++ R/PrestoGP_Model.R | 46 +++++++++++------------ R/PrestoGP_Multivariate_Vecchia.R | 12 +++--- R/PrestoGP_Vecchia.R | 12 +++--- man/PrestoGPModel-class.Rd | 3 -- man/prestogp_fit-PrestoGPModel-method.Rd | 8 +++- tests/testthat/test-PrestoGP_Univariate.R | 20 ++++++++++ 8 files changed, 81 insertions(+), 40 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index dcbc414..d576bad 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9041 +Version: 0.2.0.9042 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NEWS.md b/NEWS.md index 80f3114..3936aad 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,21 @@ +# PrestoGP 0.2.0.9042 (2025-1-14) + +## BREAKING CHANGES + +* The slot `lambda_1se_idx` has been removed from the `PrestoGPModel` + superclass + +## NEW FEATURES + +* Added the option `relax` to `prestogp_fit` to allow fitting a + relaxed lasso model + +## MINOR IMPROVEMENTS + +* Eliminated the type checking on the `linear_model` slot in the + `PrestoGPModel` superclass, which will allow new types of regression + models (e.g., relaxed lasso, SCAD, MCP) + # PrestoGP 0.2.0.9041 (2025-1-7) ## NEW FEATURES diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index 9df6340..542fe16 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -1,5 +1,3 @@ -setOldClass("cv.glmnet") - #' PrestoGPModel superclass #' #' This is the superclass for PrestoGP models. All other types of PrestoGP @@ -13,8 +11,6 @@ setOldClass("cv.glmnet") #' @slot logparams A numeric vector containing the transformed versions of the #' Matern parameters (used internally for likelihood calculations). #' @slot beta A column matrix containing the regression coefficients. -#' @slot lambda_1se_idx Stores the index of the optimal tuning parameter for -#' the glmnet model. See \code{\link[glmnet]{glmnet}}. #' @slot vecchia_approx The output of the Vecchia specify function. See #' \code{\link[GPvecchia]{vecchia_specify}} and \code{\link{vecchia_Mspecify}}. #' @slot X_train A matrix containing the original predictors. This will be a @@ -75,12 +71,11 @@ PrestoGPModel <- setClass("PrestoGPModel", slots = list( covparams = "numeric", beta = "matrix", # "numeric", #the beta matrix - lambda_1se_idx = "numeric", # "list", #the index of the best model vecchia_approx = "list", # the output of vecchia_specify y_tilde = "dgeMatrix", # iid transformed dependent variables matrix X_tilde = "dgeMatrix", # iid transformed independent variables matrix res = "numeric", # residuals - linear_model = "cv.glmnet", # the linear model + linear_model = "ANY", # the linear model X_train = "matrix", # the original independent variable matrix Y_train = "matrix", # the original dependent variable matrix X_ndx = "numeric", # used to map X_train to elements of the original X's @@ -169,7 +164,7 @@ setGeneric( quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, - parallel = FALSE, adaptive = FALSE) { + parallel = FALSE, adaptive = FALSE, relax = FALSE) { standardGeneric("prestogp_fit") } ) @@ -264,7 +259,7 @@ setGeneric("specify", function(model, ...) standardGeneric("specify")) setGeneric("compute_residuals", function(model, Y, Y.hat, family) standardGeneric("compute_residuals")) setGeneric("transform_data", function(model, Y, X) standardGeneric("transform_data")) setGeneric("estimate_theta", function(model, locs, optim.control, method) standardGeneric("estimate_theta")) -setGeneric("estimate_betas", function(model, family, nfolds, foldid, parallel, adaptive) standardGeneric("estimate_betas")) +setGeneric("estimate_betas", function(model, family, nfolds, foldid, parallel, adaptive, relax) standardGeneric("estimate_betas")) setGeneric("impute_y", function(model) standardGeneric("impute_y")) setGeneric("impute_y_lod", function(model, lod, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel, verbose) standardGeneric("impute_y_lod")) setGeneric("compute_error", function(model, y, X) standardGeneric("compute_error")) @@ -784,6 +779,8 @@ setMethod( #' Defaults to FALSE. See \code{\link[glmnet]{cv.glmnet}}. #' @param adaptive Should adaptive lasso be used? See Zou (2006) for details. #' Defaults to FALSE. +#' @param relax Should relaxed lasso be used? See Meinshausen (2007) for +#' details. Defaults to FALSE. #' #' @details If common_scale is TRUE, multivariate models will use the Matern #' cross-covariance function described in Apanasovich et al. (2012). This @@ -807,6 +804,8 @@ setMethod( #' cross-covariance functions for multivariate random fields with any number #' of components", Journal of the American Statistical Association (2012) #' 107(497):180-193. +#' \item Meinshausen, N. "Relaxed lasso", Computational Statistics and Data +#' Analysis (2007) 52(1):374-393. #' \item Messier, K.P. and Katzfuss, M. "Scalable penalized spatiotemporal #' land-use regression for ground-level nitrogen dioxide", The Annals of #' Applied Statistics (2021) 15(2):688-710. @@ -877,7 +876,8 @@ setMethod( quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), family = c("gaussian", "binomial"), - nfolds = 10, foldid = NULL, parallel = FALSE, adaptive = FALSE) { + nfolds = 10, foldid = NULL, parallel = FALSE, adaptive = FALSE, + relax = FALSE) { if (quiet & verbose) { verbose <- FALSE } @@ -988,9 +988,9 @@ setMethod( cat("Estimating initial beta...", "\n") } beta0.glmnet <- cv.glmnet(model@X_train, model@Y_train, - parallel = parallel, foldid = foldid) + parallel = parallel, foldid = foldid, relax = relax) beta.hat <- as.matrix(predict(beta0.glmnet, - type = "coefficients", s = beta0.glmnet$lambda.1se)) + type = "coefficients", s = "lambda.1se", gamma = "gamma.1se")) if (!quiet) { cat("Estimation of initial beta complete", "\n") } @@ -1045,7 +1045,7 @@ setMethod( } model <- transform_data(model, model@Y_train, model@X_train) model <- estimate_betas(model, family, nfolds, foldid, parallel, - adaptive) + adaptive, relax) if (!quiet) { cat("Estimation of beta complete", "\n") if (verbose) { @@ -1064,6 +1064,7 @@ setMethod( model@linear_model, newx = model@X_train, s = "lambda.1se", + gamma = "gamma.1se", type = "response") ) if (sum(!model@Y_obs) > 0 & sum(lodv < Inf) == 0) { @@ -1106,7 +1107,7 @@ setMethod( #' @return A model with updated coefficients #' @noRd setMethod("estimate_betas", "PrestoGPModel", function(model, family, nfolds, - foldid, parallel, adaptive) { + foldid, parallel, adaptive, relax) { if (adaptive) { ridge.model <- cv.glmnet(as.matrix(model@X_tilde), as.matrix(model@y_tilde), alpha = 0, family = family, @@ -1119,11 +1120,7 @@ setMethod("estimate_betas", "PrestoGPModel", function(model, family, nfolds, model@linear_model <- cv.glmnet(as.matrix(model@X_tilde), as.matrix(model@y_tilde), alpha = model@alpha, family = family, nfolds = nfolds, foldid = foldid, parallel = parallel, - penalty.factor = pen.factor) - idmin <- which(model@linear_model$lambda == model@linear_model$lambda.min) - semin <- model@linear_model$cvm[idmin] + model@linear_model$cvsd[idmin] - lambda_1se <- max(model@linear_model$lambda[model@linear_model$cvm <= semin]) - model@lambda_1se_idx <- which(model@linear_model$lambda == lambda_1se) + penalty.factor = pen.factor, relax = relax) invisible(model) }) @@ -1168,16 +1165,19 @@ setMethod("compute_error", "PrestoGPModel", function(model) { # beta.iter <- as.numeric(coef(model@linear_model)) # beta.iter <- do.call(cbind, coef(model@linear_model)) - ### Lambdas - lambda.iter <- model@linear_model$lambda[model@lambda_1se_idx] - ### Get SCAD penalty values # LL.vecchia.beta <- SCAD_Penalty_Loglike(beta.iter,lambda.iter) ### Compute log-likelihood # error <- model@LL_Vecchia_krig + LL.vecchia.beta[model@lambda_1se_idx[[1]]] - error <- model@LL_Vecchia_krig + glmnet_penalty(beta.iter, lambda.iter, model@alpha) - + if (is.null(model@linear_model$relaxed)) { + error <- model@LL_Vecchia_krig + glmnet_penalty(beta.iter, + model@linear_model$lambda.1se, model@alpha) + } else { + error <- model@LL_Vecchia_krig + glmnet_penalty(beta.iter, + model@linear_model$relaxed$lambda.1se * + model@linear_model$relaxed$gamma.1se, model@alpha) + } # Min error (stopping criterion) is the log-likelihood error }) diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index e22984e..553d8cc 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -67,9 +67,11 @@ setMethod("prestogp_predict", "MultivariateVecchiaModel", } # Vecchia prediction at new locations - Vecchia.Pred <- predict(model@linear_model, newx = X, s = model@linear_model$lambda[model@lambda_1se_idx]) + Vecchia.Pred <- predict(model@linear_model, newx = X, s = "lambda.1se", + gamma = "gamma.1se") # Vecchia trend prediction at observed data - Vecchia.hat <- predict(model@linear_model, newx = model@X_train, s = model@linear_model$lambda[model@lambda_1se_idx]) + Vecchia.hat <- predict(model@linear_model, newx = model@X_train, + s = "lambda.1se", gamma = "gamma.1se") # Test set prediction res <- model@Y_train - Vecchia.hat @@ -322,11 +324,9 @@ setMethod("check_input_pred", "MultivariateVecchiaModel", function(model, X, loc setMethod("impute_y", "MultivariateVecchiaModel", function(model) { Vecchia.Pred <- predict(model@linear_model, - newx = model@X_train[!model@Y_obs, ], - s = model@linear_model$lambda[model@lambda_1se_idx]) + newx = model@X_train[!model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") Vecchia.hat <- predict(model@linear_model, - newx = model@X_train[model@Y_obs, ], - s = model@linear_model$lambda[model@lambda_1se_idx]) + newx = model@X_train[model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") # Test set prediction res <- model@Y_train[model@Y_obs] - Vecchia.hat diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 08a2937..b2e6004 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -56,10 +56,12 @@ setMethod("prestogp_predict", "VecchiaModel", # Vecchia prediction at new locations # Vecchia.Pred <- predict(model@Vecchia_SCAD_fit[[1]], X = X, which = model@lambda_1se_idx[[1]]) - Vecchia.Pred <- predict(model@linear_model, newx = X, s = model@linear_model$lambda[model@lambda_1se_idx]) + Vecchia.Pred <- predict(model@linear_model, newx = X, s = "lambda.1se", + gamma = "gamma.1se") # Vecchia trend prediction at observed data # Vecchia.hat <- predict(model@Vecchia_SCAD_fit[[1]], X = model@X_train, which = model@lambda_1se_idx[[1]]) - Vecchia.hat <- predict(model@linear_model, newx = model@X_train, s = model@linear_model$lambda[model@lambda_1se_idx]) + Vecchia.hat <- predict(model@linear_model, newx = model@X_train, + s = "lambda.1se", gamma = "gamma.1se") # Test set prediction res <- model@Y_train - Vecchia.hat @@ -202,11 +204,9 @@ setMethod("check_input_pred", "VecchiaModel", function(model, X, locs) { setMethod("impute_y", "VecchiaModel", function(model) { Vecchia.Pred <- predict(model@linear_model, - newx = model@X_train[!model@Y_obs, ], - s = model@linear_model$lambda[model@lambda_1se_idx]) + newx = model@X_train[!model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") Vecchia.hat <- predict(model@linear_model, - newx = model@X_train[model@Y_obs, ], - s = model@linear_model$lambda[model@lambda_1se_idx]) + newx = model@X_train[model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") # Test set prediction res <- model@Y_train[model@Y_obs] - Vecchia.hat diff --git a/man/PrestoGPModel-class.Rd b/man/PrestoGPModel-class.Rd index 195c3e5..02664c0 100644 --- a/man/PrestoGPModel-class.Rd +++ b/man/PrestoGPModel-class.Rd @@ -23,9 +23,6 @@ Matern parameters (used internally for likelihood calculations).} \item{\code{beta}}{A column matrix containing the regression coefficients.} -\item{\code{lambda_1se_idx}}{Stores the index of the optimal tuning parameter for -the glmnet model. See \code{\link[glmnet]{glmnet}}.} - \item{\code{vecchia_approx}}{The output of the Vecchia specify function. See \code{\link[GPvecchia]{vecchia_specify}} and \code{\link{vecchia_Mspecify}}.} diff --git a/man/prestogp_fit-PrestoGPModel-method.Rd b/man/prestogp_fit-PrestoGPModel-method.Rd index d2e4263..96f5e0f 100644 --- a/man/prestogp_fit-PrestoGPModel-method.Rd +++ b/man/prestogp_fit-PrestoGPModel-method.Rd @@ -29,7 +29,8 @@ nfolds = 10, foldid = NULL, parallel = FALSE, - adaptive = FALSE + adaptive = FALSE, + relax = FALSE ) } \arguments{ @@ -116,6 +117,9 @@ Defaults to FALSE. See \code{\link[glmnet]{cv.glmnet}}.} \item{adaptive}{Should adaptive lasso be used? See Zou (2006) for details. Defaults to FALSE.} + +\item{relax}{Should relaxed lasso be used? See Meinshausen (2007) for +details. Defaults to FALSE.} } \value{ A PrestoGPModel object with slots updated based on the results of @@ -195,6 +199,8 @@ soil.vm2 <- prestogp_fit(soil.vm2, y2, X2, locs2, scaling = c(1, 1, 2)) cross-covariance functions for multivariate random fields with any number of components", Journal of the American Statistical Association (2012) 107(497):180-193. +\item Meinshausen, N. "Relaxed lasso", Computational Statistics and Data +Analysis (2007) 52(1):374-393. \item Messier, K.P. and Katzfuss, M. "Scalable penalized spatiotemporal land-use regression for ground-level nitrogen dioxide", The Annals of Applied Statistics (2021) 15(2):688-710. diff --git a/tests/testthat/test-PrestoGP_Univariate.R b/tests/testthat/test-PrestoGP_Univariate.R index e517821..d49fc19 100644 --- a/tests/testthat/test-PrestoGP_Univariate.R +++ b/tests/testthat/test-PrestoGP_Univariate.R @@ -318,6 +318,26 @@ test_that("Simulated dataset spatial", { expect_equal(params.out[2] - params.out5[2], 0, tolerance = 0.2) expect_equal(params.out[3], params.out5[3], tolerance = 0.3) expect_equal(params.out[4], params.out5[4], tolerance = 0.2) + + # Relaxed lasso fit + pgp.model6 <- new("VecchiaModel") + pgp.model6 <- prestogp_fit(pgp.model6, y, X, locs, + scaling = c(1, 1), common_scale = TRUE, quiet = TRUE, relax = TRUE, + optim.control = list( + trace = 0, maxit = 5000, + reltol = 1e-3 + ) + ) + beta.out6 <- get_beta(pgp.model6) + params.out6 <- pgp.model6@covparams + + expect_equal(as.numeric(beta.out6[[1]]), c(0.98, 1.04, 1.0, 1.02, rep(0, 6)), + tolerance = 0.006) + expect_equal(as.numeric(beta.out6[[2]] - mean(y)), 0.002, tolerance = 0.002) + expect_equal(params.out6[1], 1.5, tolerance = 0.2) + expect_equal(params.out6[2] - 0.4, 0, tolerance = 0.04) + expect_equal(params.out6[3] - 0.57, 0, tolerance = 0.05) + expect_equal(params.out6[4], 2.0, tolerance = 0.1) }) test_that("Simulated dataset spatiotemporal", { From 1cab9af7692852cb3e8bb6505bc6d9b2251a7dbd Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Wed, 29 Jan 2025 10:19:35 -0500 Subject: [PATCH 04/19] Faster imputation --- DESCRIPTION | 4 +- NAMESPACE | 1 - R/PrestoGP-package.R | 1 - R/PrestoGP_Multivariate_Vecchia.R | 65 +++++++------------------ R/PrestoGP_Util_Functions.R | 79 +++++++++++++++++++++++++++++++ R/PrestoGP_Vecchia.R | 29 +++++++----- 6 files changed, 114 insertions(+), 65 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d576bad..6e8e08b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9042 +Version: 0.2.0.9043 Authors@R: c( person(given = "Eric", family = "Bair", @@ -39,7 +39,7 @@ Imports: Matrix, methods, truncnorm, - nntmvn + TruncatedNormal License: GPL-3 Encoding: UTF-8 VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index 956b887..f626d5e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -41,7 +41,6 @@ importFrom(methods,callNextMethod) importFrom(methods,is) importFrom(methods,new) importFrom(methods,validObject) -importFrom(nntmvn,rtmvn_snn) importFrom(rlang,":=") importFrom(rlang,.data) importFrom(rlang,as_label) diff --git a/R/PrestoGP-package.R b/R/PrestoGP-package.R index bfd39ac..9012b0e 100644 --- a/R/PrestoGP-package.R +++ b/R/PrestoGP-package.R @@ -15,6 +15,5 @@ #' @importFrom dplyr %>% #' @importFrom truncnorm rtruncnorm etruncnorm #' @importFrom RANN nn2 -#' @importFrom nntmvn rtmvn_snn ## usethis namespace: end NULL diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index 553d8cc..175418b 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -404,51 +404,20 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, locs.scaled <- scale_locs(model, model@locs_train) locs.all <- NULL - nugget.seq <- NULL - ndx <- list() + y_ndx <- NULL for (i in seq_len(P)) { locs.all <- rbind(locs.all, locs.scaled[[i]]) - nugget.seq <- c(nugget.seq, rep(params[param.seq[4, 1] + i - 1], - nrow(model@locs_train[[i]]))) - ndx[[i]] <- seq_len(nrow(locs.scaled[[i]])) - if (i > 1) { - last.ndx <- ndx[[i - 1]] - ndx[[i]] <- ndx[[i]] + last.ndx[length(last.ndx)] - } + y_ndx <- c(y_ndx, rep(i, nrow(locs.scaled[[i]]))) } locs.nn <- nn2(locs.all, k = model@n_neighbors)$nn.idx - sigma <- params[param.seq[1, 1]:param.seq[1, 2]] - rangep <- params[param.seq[2, 1]:param.seq[2, 2]] - smoothness <- params[param.seq[3, 1]:param.seq[3, 2]] - - rho <- params[param.seq[5, 1]:param.seq[5, 2]] - rho.mat <- matrix(0, nrow = P, ncol = P) - rho.mat[upper.tri(rho.mat, diag = FALSE)] <- rho - rho.mat <- rho.mat + t(rho.mat) - diag(rho.mat) <- 1 - - Sigma.hat <- matrix(nrow = nrow(locs.all), ncol = nrow(locs.all)) - for (i in seq_len(P)) { - for (j in i:P) { - smooth.ii <- smoothness[i] - smooth.jj <- smoothness[j] - smooth.ij <- (smooth.ii + smooth.jj) / 2 - alpha.ii <- 1 / rangep[i] - alpha.jj <- 1 / rangep[j] - alpha.ij <- sqrt((alpha.ii^2 + alpha.jj^2) / 2) - Sigma.hat[ndx[[i]], ndx[[j]]] <- rho.mat[i, j] * sqrt(sigma[i]) * - sqrt(sigma[j]) * alpha.ii^smooth.ii * alpha.jj^smooth.jj * - gamma(smooth.ij) / (alpha.ij^(2 * smooth.ij) * - sqrt(gamma(smooth.ii) * gamma(smooth.jj))) * - Matern(rdist(locs.scaled[[i]], locs.scaled[[j]]), - alpha = alpha.ij, smoothness = smooth.ij) - if (i != j) { - Sigma.hat[ndx[[j]], ndx[[i]]] <- t(Sigma.hat[ndx[[i]], ndx[[j]]]) - } - } + Sigma.hat <- array(dim = c(nrow(locs.all), nrow(locs.all), sum(is.na(y)))) + k <- 1 + for (i in which(is.na(y))) { + Sigma.hat[, , k] <- MMatern_cov(locs.all[locs.nn[i, ], , drop = FALSE], + y_ndx[locs.nn[i, ]], params, P) + k <- k + 1 } - Sigma.hat <- Sigma.hat + nugget.seq * diag(nrow = nrow(Sigma.hat)) cur.coef <- as.vector(model@beta) last.coef <- rep(Inf, ncol(X) + 1) @@ -462,17 +431,15 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, coef.mat <- matrix(nrow = n.mi, ncol = (ncol(X) + 1)) if (parallel) { yi <- foreach(i = seq_len(n.mi), .combine = cbind) %dopar% { - out <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, - covmat = Sigma.hat) + out <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) out + yhat.ni } } else { yi <- matrix(nrow = length(yhat.ni), ncol = n.mi) for (i in seq_len(n.mi)) { - yi[, i] <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, - covmat = Sigma.hat) + yi[, i] <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) yi[, i] <- yi[, i] + yhat.ni } } @@ -499,8 +466,8 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, if (parallel) { y.na.mat <- foreach(i = seq_len(100), .combine = rbind) %dopar% { - yi <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, covmat = Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) yi <- yi + yhat.ni yi[miss] } @@ -508,8 +475,8 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, y.na.mat <- matrix(nrow = 100, ncol = sum(miss)) for (i in seq_len(100)) { - yi <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, covmat = Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) yi <- yi + yhat.ni y.na.mat[i, ] <- yi[miss] } diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index f5edfb5..d81ffa5 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -388,3 +388,82 @@ lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, y.impute <- etruncnorm(b = lod, mean = miss.means, sd = cur.sd) return(list(coef = cur.coef, y.impute = y.impute)) } + +MMatern_cov <- function(locs, y_ndx, covparams, P) { + param.seq <- create_param_sequence(P) + sigma <- covparams[param.seq[1, 1]:param.seq[1, 2]] + rangep <- covparams[param.seq[2, 1]:param.seq[2, 2]] + smoothness <- covparams[param.seq[3, 1]:param.seq[3, 2]] + nuggets <- covparams[param.seq[4, 1]:param.seq[4, 2]] + + rho <- covparams[param.seq[5, 1]:param.seq[5, 2]] + rho.mat <- matrix(0, nrow = P, ncol = P) + rho.mat[upper.tri(rho.mat, diag = FALSE)] <- rho + rho.mat <- rho.mat + t(rho.mat) + diag(rho.mat) <- 1 + + Sigma.hat <- matrix(nrow = nrow(locs), ncol = nrow(locs)) + for (i in seq_len(P)) { + for (j in i:P) { + which.i <- which(y_ndx == i) + which.j <- which(y_ndx == j) + if (sum(which.i) > 0 && sum(which.j) > 0) { + smooth.ii <- smoothness[i] + smooth.jj <- smoothness[j] + smooth.ij <- (smooth.ii + smooth.jj) / 2 + alpha.ii <- 1 / rangep[i] + alpha.jj <- 1 / rangep[j] + alpha.ij <- sqrt((alpha.ii^2 + alpha.jj^2) / 2) + Sigma.hat[which.i, which.j] <- rho.mat[i, j] * sqrt(sigma[i]) * + sqrt(sigma[j]) * alpha.ii^smooth.ii * alpha.jj^smooth.jj * + gamma(smooth.ij) / (alpha.ij^(2 * smooth.ij) * + sqrt(gamma(smooth.ii) * gamma(smooth.jj))) * + Matern(rdist(locs[which.i, drop = FALSE], + locs[which.j, drop = FALSE]), + alpha = alpha.ij, smoothness = smooth.ij) + if (i != j) { + Sigma.hat[which.j, which.i] <- t(Sigma.hat[which.i, which.j]) + } else { + Sigma.hat[which.i, which.i] <- Sigma.hat[which.i, which.i] + + nuggets[i] * diag(nrow = sum(which.i)) + } + } + } + } + return(Sigma.hat) +} + +rtmvn_snn2 <- function(y, cens_lb, cens_ub, mask_cens, NN, cov_array) { + ind_cens <- which(mask_cens) + k <- 1 + for (i in ind_cens) { + NN_row <- NN[i, ] + covmat_sub <- cov_array[, , k] + k <- k + 1 + mask_cens_sub <- mask_cens[NN_row] + y_sub <- y[NN_row] + cens_lb_sub <- cens_lb[NN_row] + cens_ub_sub <- cens_ub[NN_row] + n_cens_sub <- sum(mask_cens_sub) + if (n_cens_sub == length(NN_row)) { + cond_covmat_sub_cens <- covmat_sub + cond_mean_sub_cens <- rep(0, n_cens_sub) + } else { + tmp_mat <- covmat_sub[mask_cens_sub, !mask_cens_sub] %*% + solve(covmat_sub[!mask_cens_sub, !mask_cens_sub]) + cond_covmat_sub_cens <- covmat_sub[mask_cens_sub, mask_cens_sub] - + tmp_mat %*% covmat_sub[!mask_cens_sub, mask_cens_sub] + cond_covmat_sub_cens[lower.tri(cond_covmat_sub_cens)] <- + t(cond_covmat_sub_cens)[lower.tri(cond_covmat_sub_cens)] + cond_mean_sub_cens <- as.vector(tmp_mat %*% y_sub[!mask_cens_sub]) + } + samp_cens_sub <- t(TruncatedNormal::rtmvnorm( + 1, cond_mean_sub_cens, + cond_covmat_sub_cens, + cens_lb_sub[mask_cens_sub], cens_ub_sub[mask_cens_sub] + )) + y[i] <- samp_cens_sub[1] + mask_cens[i] <- FALSE + } + y +} diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index b2e6004..780c6ce 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -256,8 +256,15 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, locs.scaled <- scale_locs(model, model@locs_train)[[1]] locs.nn <- nn2(locs.scaled, k = model@n_neighbors + 1)$nn.idx - Sigma.hat <- params[1] * Matern(rdist(locs.scaled), range = params[2], - smoothness = params[3]) + params[4] * diag(nrow = nrow(locs.scaled)) + + Sigma.hat <- array(dim = c(nrow(locs.scaled), nrow(locs.scaled), + sum(is.na(y)))) + k <- 1 + for (i in which(is.na(y))) { + Sigma.hat[, , k] <- MMatern_cov(locs.scaled[locs.nn[i, ], , drop = FALSE], + rep(1, ncol(locs.nn)), params, 1) + k <- k + 1 + } cur.coef <- as.vector(model@beta) last.coef <- rep(Inf, ncol(X) + 1) @@ -271,17 +278,15 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, coef.mat <- matrix(nrow = n.mi, ncol = (ncol(X) + 1)) if (parallel) { yi <- foreach(i = seq_len(n.mi), .combine = cbind) %dopar% { - out <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, - covmat = Sigma.hat) + out <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) out + yhat.ni } } else { yi <- matrix(nrow = length(yhat.ni), ncol = n.mi) for (i in seq_len(n.mi)) { - yi[, i] <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, - covmat = Sigma.hat) + yi[, i] <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) yi[, i] <- yi[, i] + yhat.ni } } @@ -309,8 +314,8 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, if (parallel) { y.na.mat <- foreach(i = seq_len(100), .combine = rbind) %dopar% { - yi <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, covmat = Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) yi <- yi + yhat.ni yi[miss] } @@ -318,8 +323,8 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, y.na.mat <- matrix(nrow = 100, ncol = sum(miss)) for (i in seq_len(100)) { - yi <- rtmvn_snn(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, covmat = Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), + rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) yi <- yi + yhat.ni y.na.mat[i, ] <- yi[miss] } From d5c24277518f3bc3a71d496f1d9afc968f8e0d8b Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Wed, 29 Jan 2025 10:24:57 -0500 Subject: [PATCH 05/19] Faster imputation --- NEWS.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/NEWS.md b/NEWS.md index 3936aad..4448e8b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,13 @@ +# PrestoGP 0.2.0.9043 (2025-1-29) + +## BUG FIXES + +* Imputation code has been rewritten to avoid computing the full + covariance matrix, resulting in a huge performance improvement + +* The nntmvn package dependency has been removed to fix errors caused + by a recent update + # PrestoGP 0.2.0.9042 (2025-1-14) ## BREAKING CHANGES From 9f7d6784110ce3abf2f5966e624091ced0edcdec Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Fri, 7 Mar 2025 13:47:57 -0500 Subject: [PATCH 06/19] New penalties, bug fixes --- DESCRIPTION | 6 +- NAMESPACE | 1 + NEWS.md | 38 ++ R/Log_Likelihood.R | 6 +- R/PrestoGP-package.R | 2 +- R/PrestoGP_Model.R | 251 ++++++---- R/PrestoGP_Multivariate_Vecchia.R | 72 ++- R/PrestoGP_Util_Functions.R | 91 ++-- R/PrestoGP_Vecchia.R | 72 ++- man/PrestoGPModel-class.Rd | 11 +- man/get_linear_model-PrestoGPModel-method.Rd | 10 +- man/plot_beta-PrestoGPModel-method.Rd | 7 +- man/prestogp_fit-PrestoGPModel-method.Rd | 53 +- src/createUMC.cpp | 1 + tests/testthat/sim_multivariate_big_st2.RData | Bin 0 -> 255125 bytes tests/testthat/sim_vecchia_pred.RData | Bin 0 -> 216330 bytes tests/testthat/test-PrestoGP_Model.R | 36 ++ ...test-PrestoGP_Multivariate_Vecchia_Model.R | 456 ++++++++++++++---- tests/testthat/test-PrestoGP_Univariate.R | 275 ++++++++--- 19 files changed, 1005 insertions(+), 383 deletions(-) create mode 100644 tests/testthat/sim_multivariate_big_st2.RData create mode 100644 tests/testthat/sim_vecchia_pred.RData diff --git a/DESCRIPTION b/DESCRIPTION index 6e8e08b..a13d196 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9043 +Version: 0.2.0.9044 Authors@R: c( person(given = "Eric", family = "Bair", @@ -39,7 +39,8 @@ Imports: Matrix, methods, truncnorm, - TruncatedNormal + TruncatedNormal, + ncvreg License: GPL-3 Encoding: UTF-8 VignetteBuilder: knitr @@ -62,6 +63,7 @@ Suggests: knitr, GpGp, geoR, + doParallel, testthat (>= 3.0.0) Config/testthat/edition: 3 URL: https://niehs.github.io/PrestoGP/, https://github.com/NIEHS/PrestoGP diff --git a/NAMESPACE b/NAMESPACE index f626d5e..a688e18 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -33,6 +33,7 @@ import(MASS) import(Matrix) import(fields) import(glmnet) +import(ncvreg) importFrom(RANN,nn2) importFrom(dplyr,"%>%") importFrom(foreach,"%dopar%") diff --git a/NEWS.md b/NEWS.md index 4448e8b..697610a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,41 @@ +# PrestoGP 0.2.0.9044 + +## BREAKING CHANGES + +* Removed the `relax` parameter from `prestogp_fit` + +* All glmnet-based models now use lambda.min (rather than lambda.1se) to + choose the optimal value of lambda + +## NEW FEATURES + +* Added the parameter `penalty` to `prestogp_fit` to specify the type of + penalized regression (relaxed lasso, SCAD, and MCP) + +* Added the parameter `alpha` to `prestogp_fit` to change the alpha parameter + in glmnet/ncvreg (which can be used to fit ridge regression or elastic + net models) + +## MINOR IMPROVEMENTS + +* Subsampling is no longer used to calculate the initial estimates of the + scale parameters in `calc_covparams` + +* Fixed an issue where the C++ code displayed repeated warnings when an + estimated submatrix was nearly numerically singular + +* Many new tests were added to test the new penalties + +## BUG FIXES + +* Fixed an issue where initial scale parameter estimates were sometimes set + to 0 due to subsampling + +* Fixed an issue where likelihood calculations could crash if the estimated + U matrix is numerically singular + +* Fixed an issue where imputed values were not being updated properly + # PrestoGP 0.2.0.9043 (2025-1-29) ## BUG FIXES diff --git a/R/Log_Likelihood.R b/R/Log_Likelihood.R index 2636966..48c9545 100644 --- a/R/Log_Likelihood.R +++ b/R/Log_Likelihood.R @@ -110,7 +110,11 @@ negloglik.full <- function(logparams, d, y, param.seq) { vecchia_Mlikelihood <- function(z, vecchia.approx, covparams) { U.obj <- createUMultivariate(vecchia.approx, covparams) vecchia_likelihood_U <- getFromNamespace("vecchia_likelihood_U", "GPvecchia") - vecchia_likelihood_U(z, U.obj) + res <- try(junk <- vecchia_likelihood_U(z, U.obj), silent = TRUE) + if (inherits(res, "try-error")) { + junk <- -1 * Inf + } + return(junk) } diff --git a/R/PrestoGP-package.R b/R/PrestoGP-package.R index 9012b0e..3a4106c 100644 --- a/R/PrestoGP-package.R +++ b/R/PrestoGP-package.R @@ -2,7 +2,7 @@ "_PACKAGE" ## usethis namespace: start -#' @import GPvecchia Matrix fields MASS glmnet +#' @import GPvecchia Matrix fields MASS glmnet ncvreg #' @importFrom foreach %dopar% #' @importFrom foreach foreach #' @importFrom methods callNextMethod diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index 542fe16..6b08e6e 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -30,8 +30,11 @@ #' @slot locs_train A list containing the location coordinates. Each element #' of the list corresponds to a different outcome. (The list will have length #' 1 for univariate models.) -#' @slot linear_model The glmnet model. See \code{\link[glmnet]{glmnet}} and -#' \code{\link[glmnet]{cv.glmnet}}. +#' @slot penalty The type of penalized regression used. Should be one +#' of "lasso", "relaxed", "MCP", or "SCAD". +#' @slot linear_model The glmnet or ncvreg model. See +#' \code{\link[glmnet]{glmnet}}, \code{\link[ncvreg]{ncvreg}}, +#' \code{\link[glmnet]{cv.glmnet}}, and \code{\link[ncvreg]{cv.ncvreg}}. #' @slot converged Did the model fitting process converge (boolean)? #' @slot LL_Vecchia_krig The value of the negative log likelihood function #' after optimization. @@ -39,7 +42,8 @@ #' @slot n_neighbors Number of neighbors to condition on for the Vecchia #' approximation. Ignored for full models. #' @slot min_m Minimum permissible number of neighbors. -#' @slot alpha Parameter alpha for glmnet. See \code{\link[glmnet]{glmnet}}. +#' @slot alpha Parameter alpha for glmnet or ncvreg. See +#' \code{\link[glmnet]{glmnet}} or \code{\link[ncvreg]{ncvreg}}. #' @slot scaling The indices of the scale parameters. See #' \code{link{prestogp_fit}}. #' @slot nscale The number of scale parameters in the model. @@ -75,6 +79,7 @@ PrestoGPModel <- setClass("PrestoGPModel", y_tilde = "dgeMatrix", # iid transformed dependent variables matrix X_tilde = "dgeMatrix", # iid transformed independent variables matrix res = "numeric", # residuals + penalty = "character", # type of model (lasso, SCAD, etc.) linear_model = "ANY", # the linear model X_train = "matrix", # the original independent variable matrix Y_train = "matrix", # the original dependent variable matrix @@ -106,7 +111,7 @@ validityPrestoGPModel <- function(object) { setValidity("PrestoGPModel", validityPrestoGPModel) setMethod("initialize", "PrestoGPModel", function(.Object, ...) { - .Object@linear_model <- structure(list(), class = "cv.glmnet") +# .Object@linear_model <- structure(list(), class = "cv.glmnet") .Object@alpha <- 1 # 0.5 .Object <- callNextMethod() validObject(.Object) @@ -163,8 +168,9 @@ setGeneric( max_iters = 100, center.y = NULL, impute.y = FALSE, lod = NULL, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), + penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, - parallel = FALSE, adaptive = FALSE, relax = FALSE) { + parallel = FALSE, cluster = NULL, adaptive = FALSE) { standardGeneric("prestogp_fit") } ) @@ -259,9 +265,9 @@ setGeneric("specify", function(model, ...) standardGeneric("specify")) setGeneric("compute_residuals", function(model, Y, Y.hat, family) standardGeneric("compute_residuals")) setGeneric("transform_data", function(model, Y, X) standardGeneric("transform_data")) setGeneric("estimate_theta", function(model, locs, optim.control, method) standardGeneric("estimate_theta")) -setGeneric("estimate_betas", function(model, family, nfolds, foldid, parallel, adaptive, relax) standardGeneric("estimate_betas")) +setGeneric("estimate_betas", function(model, family, nfolds, foldid, parallel, cluster, penalty, adaptive) standardGeneric("estimate_betas")) setGeneric("impute_y", function(model) standardGeneric("impute_y")) -setGeneric("impute_y_lod", function(model, lod, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel, verbose) standardGeneric("impute_y_lod")) +setGeneric("impute_y_lod", function(model, lod, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel, cluster, verbose) standardGeneric("impute_y_lod")) setGeneric("compute_error", function(model, y, X) standardGeneric("compute_error")) setGeneric("scale_locs", function(model, locs) standardGeneric("scale_locs")) setGeneric("transform_covariance_parameters", function(model) standardGeneric("transform_covariance_parameters")) @@ -473,20 +479,20 @@ setMethod( #' Extract the fitted linear model for a PrestoGP model #' -#' This method return the fitted linear model (of class cv.glmnet) for a -#' PrestoGP model. +#' This method return the fitted linear model (of class cv.glmnet or cv.ncvreg) +#' for a PrestoGP model. #' #' @param model The PrestoGP model object #' #' @details It is important to note that the model is fit to the #' transformed data. The CV error rate and predicted values of Y will not be #' correct for the original (untransformed) data. This method should be -#' used primarily for examining the coefficient path and generating plots. +#' used primarily for examining the coefficient paths and generating plots. #' -#' @return The fitted linear model (of class cv.glmnet). +#' @return The fitted linear model (of class cv.glmnet or cv.ncvreg). #' #' @seealso \code{\link{PrestoGPModel-class}}, \code{\link{prestogp_fit}}, -#' \code{\link[glmnet]{cv.glmnet}} +#' \code{\link[glmnet]{cv.glmnet}}, \code{\link[ncvreg]{cv.ncvreg}} #' #' @references #' \itemize{ @@ -677,14 +683,15 @@ setMethod( #' #' This method generates a plot showing the coefficients of the model for #' different values of the tuning parameter. It is a wrapper for -#' \code{\link[glmnet]{plot.glmnet}}. +#' \code{\link[glmnet]{plot.glmnet}} or \code{\link[ncvreg]{plot.ncvreg}}. #' #' @param model The PrestoGP model object #' -#' @param ... Additional parameters to \code{\link[glmnet]{plot.glmnet}} +#' @param ... Additional parameters to \code{\link[glmnet]{plot.glmnet}} or +#' \code{\link[ncvreg]{plot.ncvreg}}. #' #' @seealso \code{\link{PrestoGPModel-class}}, \code{\link{prestogp_fit}}, -#' \code{\link[glmnet]{plot.glmnet}} +#' \code{\link[glmnet]{plot.glmnet}}, \code{\link[ncvreg]{plot.ncvreg}} #' #' @references #' \itemize{ @@ -710,7 +717,11 @@ setMethod( setMethod( "plot_beta", "PrestoGPModel", function(model, ...) { - plot(model@linear_model$glmnet.fit, ...) + if (model@penalty == "lasso" || model@penalty == "relaxed") { + plot(model@linear_model$glmnet.fit, ...) + } else { + plot(model@linear_model$fit, ...) + } } ) @@ -767,20 +778,37 @@ setMethod( #' See \code{\link[stats]{optim}}. #' @param optim.control Control parameter that is passed to optim. See #' \code{\link[stats]{optim}}. -#' @param family Family parameter for the glmnet model. Currently only -#' "gaussian" and "binomial" are supported. Defaults to "gaussian". See -#' \code{\link[glmnet]{glmnet}}. +#' @param penalty The type of penalized regression to be used. Should be one +#' of "lasso", "relaxed", "MCP", or "SCAD". Note that "lasso" and "relaxed" +#' will fit the model using glmnet and "MCP" and "SCAD" will fit the model +#' using ncvreg. See \code{\link[glmnet]{glmnet}} or +#' \code{\link[ncvreg]{ncvreg}}. Defaults to "lasso". +#' @param alpha The elastic net mixing parameter. 'alpha=1' corresponds to +#' lasso (or SCAD/MCP) penalty; 'alpha=0' corresponds to ridge regression. +#' See \code{\link[glmnet]{glmnet}} or \code{\link[ncvreg]{ncvreg}}. Defaults +#' to 1. +#' @param family Family parameter for the glmnet or ncvreg model. Currently +#' only "gaussian" and "binomial" are supported. Defaults to "gaussian". See +#' \code{\link[glmnet]{glmnet}} or \code{\link[ncvreg]{ncvreg}}. #' @param nfolds Number of cross-validation folds for cv.glmnet. Defaults to #' 10. See \code{\link[glmnet]{cv.glmnet}}. #' @param foldid Optional vector of values between 1 and "nfolds" specifying #' what fold each observation should be assigned to in the cv.glmnet -#' cross-validation. See \code{\link[glmnet]{cv.glmnet}}. -#' @param parallel Should cv.glmnet use parallel "foreach" to fit each fold? -#' Defaults to FALSE. See \code{\link[glmnet]{cv.glmnet}}. -#' @param adaptive Should adaptive lasso be used? See Zou (2006) for details. -#' Defaults to FALSE. -#' @param relax Should relaxed lasso be used? See Meinshausen (2007) for -#' details. Defaults to FALSE. +#' cross-validation. See \code{\link[glmnet]{cv.glmnet}} and +#' \code{\link[ncvreg]{cv.ncvreg}}. +#' @param parallel Should parallel "foreach" be used to speed up the model +#' fitting procedure where possible? Defaults to FALSE. Specifically, +#' parallelization will be used for imputation and fitting the cv.glmnet +#' object. See \code{\link[glmnet]{cv.glmnet}}. Note that this +#' only applies to glmnet models (where penalty="lasso" or +#' penalty="relaxed"). Models using ncvreg (where penalty="MCP" or +#' penalty="SCAD") require a cluster argument for parallelization (see below). +#' @param cluster A cluster for running cv.ncvreg in parallel. See +#' \code{\link[ncvreg]{cv.ncvreg}} and \code{\link[parallel]{makeCluster}}. +#' This must be specified to run cv.ncvreg in parallel. It is ignored for +#' glmnet models. +#' @param adaptive Should adaptive lasso be used? Defaults to FALSE. It is +#' ignored for SCAD and MCP models. #' #' @details If common_scale is TRUE, multivariate models will use the Matern #' cross-covariance function described in Apanasovich et al. (2012). This @@ -804,8 +832,6 @@ setMethod( #' cross-covariance functions for multivariate random fields with any number #' of components", Journal of the American Statistical Association (2012) #' 107(497):180-193. -#' \item Meinshausen, N. "Relaxed lasso", Computational Statistics and Data -#' Analysis (2007) 52(1):374-393. #' \item Messier, K.P. and Katzfuss, M. "Scalable penalized spatiotemporal #' land-use regression for ground-level nitrogen dioxide", The Annals of #' Applied Statistics (2021) 15(2):688-710. @@ -875,12 +901,12 @@ setMethod( max_iters = 100, center.y = NULL, impute.y = FALSE, lod = NULL, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), + penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, family = c("gaussian", "binomial"), - nfolds = 10, foldid = NULL, parallel = FALSE, adaptive = FALSE, - relax = FALSE) { - if (quiet & verbose) { - verbose <- FALSE - } + nfolds = 10, foldid = NULL, parallel = FALSE, cluster = NULL, + adaptive = FALSE) { + penalty <- match.arg(penalty) + model@penalty <- penalty family <- match.arg(family) if (is.null(center.y)) { if (family == "gaussian") { @@ -915,6 +941,22 @@ setMethod( } beta.hat <- as.matrix(beta.hat) } + if (!is.numeric(alpha)) { + stop("tol must be numeric") + } + if (length(alpha) != 1) { + stop("tol must be a scalar") + } + if (alpha < 0 || alpha > 1) { + stop("alpha must satisfy 0<=alpha<=1") + } + if (alpha == 0 && (penalty == "SCAD" || penalty == "MCP")) { + stop("alpha must be positive for SCAD/MCP penalties") + } + model@alpha <- alpha + if (quiet & verbose) { + verbose <- FALSE + } if (!is.numeric(tol)) { stop("tol must be numeric") } @@ -977,7 +1019,9 @@ setMethod( cat("Imputing missing y's and estimating initial beta...", "\n") } cur.mi <- lod_reg_mi(model@Y_train, model@X_train, lodv, !model@Y_obs, - parallel = parallel, foldid = foldid, verbose = verbose) + penalty = model@penalty, alpha = model@alpha, + parallel = parallel, cluster = cluster, foldid = foldid, + verbose = verbose) model@Y_train[!model@Y_obs] <- cur.mi$y.impute beta.hat <- as.matrix(cur.mi$coef) if (!quiet) { @@ -987,10 +1031,18 @@ setMethod( if (!quiet) { cat("Estimating initial beta...", "\n") } - beta0.glmnet <- cv.glmnet(model@X_train, model@Y_train, - parallel = parallel, foldid = foldid, relax = relax) - beta.hat <- as.matrix(predict(beta0.glmnet, - type = "coefficients", s = "lambda.1se", gamma = "gamma.1se")) + if (model@penalty == "lasso" || model@penalty == "relaxed") { + beta0.glmnet <- cv.glmnet(model@X_train, model@Y_train, + parallel = parallel, foldid = foldid, alpha = model@alpha, + relax = model@penalty == "relaxed") + beta.hat <- as.matrix(predict(beta0.glmnet, + type = "coefficients", s = "lambda.min", gamma = "gamma.min")) + } else { + beta0.ncvreg <- cv.ncvreg.wrap(model@X_train, model@Y_train, + cluster = cluster, foldid = foldid, alpha = model@alpha, + penalty = model@penalty) + beta.hat <- as.matrix(coef(beta0.ncvreg)) + } if (!quiet) { cat("Estimation of initial beta complete", "\n") } @@ -1009,7 +1061,7 @@ setMethod( if (!quiet) { cat("\n") } - while (!model@converged && (iter < max_iters)) { + while (!model@converged && (iter <= max_iters)) { if (!quiet) { cat("Beginning iteration", iter, "\n") } @@ -1034,7 +1086,8 @@ setMethod( cat("Imputing missing y's...", "\n") } model <- impute_y_lod(model, lodv, family = family, nfolds = nfolds, - foldid = foldid, parallel = parallel, verbose = verbose) + foldid = foldid, parallel = parallel, cluster = cluster, + verbose = verbose) if (!quiet) { cat("Imputation complete", "\n") } @@ -1045,7 +1098,7 @@ setMethod( } model <- transform_data(model, model@Y_train, model@X_train) model <- estimate_betas(model, family, nfolds, foldid, parallel, - adaptive, relax) + cluster, model@penalty, adaptive) if (!quiet) { cat("Estimation of beta complete", "\n") if (verbose) { @@ -1057,16 +1110,18 @@ setMethod( if (min.error < prev.error * tol) { prev.error <- min.error model@error <- prev.error - beta.hat <- sparseToDenseBeta(model@linear_model) +# beta.hat <- sparseToDenseBeta(model@linear_model) +# model@beta <- beta.hat + if (model@penalty == "lasso" || model@penalty == "relaxed") { + beta.hat <- as.matrix(predict(model@linear_model, s = "lambda.min", + gamma = "gamma.min", type = "coefficients")) + Y.hat <- as.matrix(predict(model@linear_model, newx = model@X_train, + s = "lambda.min", gamma = "gamma.min", type = "response")) + } else { + beta.hat <- as.matrix(coef(model@linear_model)) + Y.hat <- as.matrix(predict(model@linear_model, model@X_train)) + } model@beta <- beta.hat - Y.hat <- as.matrix( - predict( - model@linear_model, - newx = model@X_train, - s = "lambda.1se", - gamma = "gamma.1se", - type = "response") - ) if (sum(!model@Y_obs) > 0 & sum(lodv < Inf) == 0) { if (!quiet) { cat("Imputing missing y's...", "\n") @@ -1107,20 +1162,26 @@ setMethod( #' @return A model with updated coefficients #' @noRd setMethod("estimate_betas", "PrestoGPModel", function(model, family, nfolds, - foldid, parallel, adaptive, relax) { - if (adaptive) { - ridge.model <- cv.glmnet(as.matrix(model@X_tilde), - as.matrix(model@y_tilde), alpha = 0, family = family, - nfolds = nfolds, foldid = foldid, parallel = parallel) - pen.factor <- 1 / abs(as.numeric(coef(ridge.model, - s = ridge.model$lambda.min))[-1]) + foldid, parallel, cluster, penalty, adaptive) { + if (penalty == "lasso" || penalty == "relaxed") { + if (adaptive) { + ridge.model <- cv.glmnet(as.matrix(model@X_tilde), + as.matrix(model@y_tilde), alpha = 0, family = family, + nfolds = nfolds, foldid = foldid, parallel = parallel) + pen.factor <- 1 / abs(as.numeric(coef(ridge.model, + s = ridge.model$lambda.min))[-1]) + } else { + pen.factor <- rep(1, ncol(model@X_tilde)) + } + model@linear_model <- cv.glmnet(as.matrix(model@X_tilde), + as.matrix(model@y_tilde), alpha = model@alpha, family = family, + nfolds = nfolds, foldid = foldid, parallel = parallel, + penalty.factor = pen.factor, relax = penalty == "relaxed") } else { - pen.factor <- rep(1, ncol(model@X_tilde)) + model@linear_model <- cv.ncvreg.wrap(as.matrix(model@X_tilde), + as.matrix(model@y_tilde), cluster = cluster, foldid = foldid, + penalty = penalty, alpha = model@alpha, family = family, nfolds = nfolds) } - model@linear_model <- cv.glmnet(as.matrix(model@X_tilde), - as.matrix(model@y_tilde), alpha = model@alpha, family = family, - nfolds = nfolds, foldid = foldid, parallel = parallel, - penalty.factor = pen.factor, relax = relax) invisible(model) }) @@ -1131,25 +1192,24 @@ setMethod("estimate_betas", "PrestoGPModel", function(model, family, nfolds, #' @param linear_model the glmnet model #' #' @return A dense matrix -#' @noRd -sparseToDenseBeta <- function(linear_model) { - coefs <- coef(linear_model) - if (!is.list(coefs)) { - coefs <- list(coefs) - } - beta_construct <- matrix(data = 0, nrow = coefs[[1]]@Dim[1], ncol = length(coefs)) +#sparseToDenseBeta <- function(linear_model) { +# coefs <- coef(linear_model) +# if (!is.list(coefs)) { +# coefs <- list(coefs) +# } +# beta_construct <- matrix(data = 0, nrow = coefs[[1]]@Dim[1], ncol = length(coefs)) # coefs[[1]]@Dim[1]+2s because dgCMatrix is 0 offset, and we want to include intercept - for (i in seq_along(coefs)) { - for (j in seq_along(coefs[[i]]@i)) { - k <- coefs[[i]]@i[j] +# for (i in seq_along(coefs)) { +# for (j in seq_along(coefs[[i]]@i)) { +# k <- coefs[[i]]@i[j] # beta_construct[k+1,i] <- coefs[[i]]@x[j] - beta_construct[k + 1, i] <- coefs[[i]]@x[j] - } - } +# beta_construct[k + 1, i] <- coefs[[i]]@x[j] +# } +# } # show(beta_construct) - beta <- matrix(beta_construct, nrow = coefs[[1]]@Dim[1], ncol = length(coefs)) - beta -} +# beta <- matrix(beta_construct, nrow = coefs[[1]]@Dim[1], ncol = length(coefs)) +# beta +#} #' compute_error #' @@ -1161,22 +1221,37 @@ sparseToDenseBeta <- function(linear_model) { #' @noRd setMethod("compute_error", "PrestoGPModel", function(model) { ### Betas - beta.iter <- sparseToDenseBeta(model@linear_model) + # beta.iter <- sparseToDenseBeta(model@linear_model) # beta.iter <- as.numeric(coef(model@linear_model)) # beta.iter <- do.call(cbind, coef(model@linear_model)) + if (model@penalty == "lasso" || model@penalty == "relaxed") { + beta.iter <- as.matrix(predict(model@linear_model, type = "coefficients", + s = "lambda.min", gamma = "gamma.min")) + } else { + beta.iter <- as.matrix(coef(model@linear_model)) + } ### Get SCAD penalty values # LL.vecchia.beta <- SCAD_Penalty_Loglike(beta.iter,lambda.iter) ### Compute log-likelihood # error <- model@LL_Vecchia_krig + LL.vecchia.beta[model@lambda_1se_idx[[1]]] - if (is.null(model@linear_model$relaxed)) { - error <- model@LL_Vecchia_krig + glmnet_penalty(beta.iter, - model@linear_model$lambda.1se, model@alpha) - } else { - error <- model@LL_Vecchia_krig + glmnet_penalty(beta.iter, - model@linear_model$relaxed$lambda.1se * - model@linear_model$relaxed$gamma.1se, model@alpha) + alpha <- model@alpha + if (model@penalty == "lasso") { + error <- model@LL_Vecchia_krig + model@linear_model$lambda.min * + ((1 - alpha) * sqrt(sum(beta.iter^2)) + alpha * sum(abs(beta.iter))) + } else if (model@penalty == "relaxed") { + error <- model@LL_Vecchia_krig + model@linear_model$relaxed$lambda.min * + model@linear_model$relaxed$gamma.min * ((1 - alpha) * + sqrt(sum(beta.iter^2)) + alpha * sum(abs(beta.iter))) + } else if (model@penalty == "SCAD") { + error <- model@LL_Vecchia_krig + model@linear_model$lambda.min * + (1 - alpha) * sqrt(sum(beta.iter^2)) + alpha * SCAD_penalty(beta.iter, + model@linear_model$lambda.min, model@linear_model$fit$gamma) + } else if (model@penalty == "MCP") { + error <- model@LL_Vecchia_krig + model@linear_model$lambda.min * + (1 - alpha) * sqrt(sum(beta.iter^2)) + alpha * MCP_penalty(beta.iter, + model@linear_model$lambda.min, model@linear_model$fit$gamma) } # Min error (stopping criterion) is the log-likelihood error @@ -1209,8 +1284,8 @@ setMethod("calc_covparams", "PrestoGPModel", function(model, locs, Y, covparams) N <- length(Y[[i]]) # TODO find a better way to compute initial spatial range for (j in 1:model@nscale) { - d.sample <- sample(1:N, max(2, ceiling(N / 50)), replace = FALSE) - D.sample <- rdist(locs[[i]][d.sample, model@scaling == j]) + # d.sample <- sample(1:N, max(2, ceiling(N / 50)), replace = FALSE) + D.sample <- rdist(locs[[i]][, model@scaling == j]) D.sample.bar[(i - 1) * model@nscale + j] <- mean(D.sample) / 4 } } diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index 175418b..46b02ed 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -66,12 +66,19 @@ setMethod("prestogp_predict", "MultivariateVecchiaModel", m <- nrow(model@X_train) - 1 } - # Vecchia prediction at new locations - Vecchia.Pred <- predict(model@linear_model, newx = X, s = "lambda.1se", - gamma = "gamma.1se") - # Vecchia trend prediction at observed data - Vecchia.hat <- predict(model@linear_model, newx = model@X_train, - s = "lambda.1se", gamma = "gamma.1se") + if (model@penalty == "lasso" || model@penalty == "relaxed") { + # Vecchia prediction at new locations + Vecchia.Pred <- predict(model@linear_model, newx = X, s = "lambda.min", + gamma = "gamma.min") + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, newx = model@X_train, + s = "lambda.min", gamma = "gamma.min") + } else { + # Vecchia prediction at new locations + Vecchia.Pred <- predict(model@linear_model, X) + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, model@X_train) + } # Test set prediction res <- model@Y_train - Vecchia.hat @@ -323,10 +330,21 @@ setMethod("check_input_pred", "MultivariateVecchiaModel", function(model, X, loc }) setMethod("impute_y", "MultivariateVecchiaModel", function(model) { - Vecchia.Pred <- predict(model@linear_model, - newx = model@X_train[!model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") - Vecchia.hat <- predict(model@linear_model, - newx = model@X_train[model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") + if (model@penalty == "lasso" || model@penalty == "relaxed") { + # Vecchia prediction at missing values + Vecchia.Pred <- predict(model@linear_model, + newx = model@X_train[!model@Y_obs, ], s = "lambda.min", + gamma = "gamma.min") + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, + newx = model@X_train[model@Y_obs, ], s = "lambda.min", + gamma = "gamma.min") + } else { + # Vecchia prediction at missing values + Vecchia.Pred <- predict(model@linear_model, model@X_train[!model@Y_obs, ]) + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, model@X_train[model@Y_obs, ]) + } # Test set prediction res <- model@Y_train[model@Y_obs] - Vecchia.hat @@ -377,7 +395,8 @@ setMethod("impute_y", "MultivariateVecchiaModel", function(model) { }) setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, - n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel, verbose) { + n.mi = 10, eps = 0.01, maxit = 1, family, nfolds, foldid, parallel, + cluster, verbose) { y <- model@Y_train X <- model@X_train miss <- !model@Y_obs @@ -409,11 +428,11 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, locs.all <- rbind(locs.all, locs.scaled[[i]]) y_ndx <- c(y_ndx, rep(i, nrow(locs.scaled[[i]]))) } - locs.nn <- nn2(locs.all, k = model@n_neighbors)$nn.idx + locs.nn <- nn2(locs.all, k = model@n_neighbors + 1)$nn.idx - Sigma.hat <- array(dim = c(nrow(locs.all), nrow(locs.all), sum(is.na(y)))) + Sigma.hat <- array(dim = c(ncol(locs.nn), ncol(locs.nn), sum(miss))) k <- 1 - for (i in which(is.na(y))) { + for (i in which(miss)) { Sigma.hat[, , k] <- MMatern_cov(locs.all[locs.nn[i, ], , drop = FALSE], y_ndx[locs.nn[i, ]], params, P) k <- k + 1 @@ -432,14 +451,14 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, if (parallel) { yi <- foreach(i = seq_len(n.mi), .combine = cbind) %dopar% { out <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) out + yhat.ni } } else { yi <- matrix(nrow = length(yhat.ni), ncol = n.mi) for (i in seq_len(n.mi)) { yi[, i] <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) yi[, i] <- yi[, i] + yhat.ni } } @@ -448,10 +467,19 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, Xt <- as.matrix(tiid[, -(seq_len(ncol(yi)))]) for (i in seq_len(n.mi)) { - cur.glmnet <- cv.glmnet(as.matrix(Xt), as.matrix(yt[, i]), - alpha = model@alpha, family = family, nfolds = nfolds, - foldid = foldid, parallel = parallel) - coef.mat[i, ] <- as.matrix(coef(cur.glmnet, s = "lambda.min")) + if (model@penalty == "lasso" || model@penalty == "relaxed") { + cur.glmnet <- cv.glmnet(as.matrix(Xt), as.matrix(yt[, i]), + alpha = model@alpha, family = family, nfolds = nfolds, + foldid = foldid, parallel = parallel, + relax = model@penalty == "relaxed") + coef.mat[i, ] <- as.matrix(coef(cur.glmnet, s = "lambda.min", + gamma = "gamma.min")) + } else { + cur.ncvreg <- cv.ncvreg.wrap(as.matrix(Xt), as.matrix(yt[, i]), + cluster = cluster, foldid = foldid, penalty = model@penalty, + alpha = model@alpha, family = family, nfolds = nfolds) + coef.mat[i, ] <- as.matrix(coef(cur.ncvreg)) + } } last.coef <- cur.coef cur.coef <- colMeans(coef.mat) @@ -467,7 +495,7 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, if (parallel) { y.na.mat <- foreach(i = seq_len(100), .combine = rbind) %dopar% { yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni yi[miss] } @@ -476,7 +504,7 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, for (i in seq_len(100)) { yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni y.na.mat[i, ] <- yi[miss] } diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index d81ffa5..f069f65 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -1,23 +1,21 @@ ################################################################################ -# SCAD Penalty value +# SCAD/MCP penalty values ################################################################################ -#SCAD_Penalty_Loglike <- function(beta.in, lambda) { -# penalty <- matrix(NA, nrow = nrow(beta.in), ncol = ncol(beta.in)) -# for (j in seq_len(nrow(beta.in))) { -# beta.j <- beta.in[j, ] -# idx1 <- abs(beta.j) <= lambda -# idx2 <- abs(beta.j) > lambda & abs(beta.j) <= 3.7 * lambda -# idx3 <- abs(beta.j) > 3.7 * lambda -# penalty[j, idx1] <- lambda[idx1] * beta.j[idx1] -# penalty[j, idx2] <- -(abs(beta.j[idx2])^2 - 7.4 * lambda[idx2] * abs(beta.j[idx2]) + lambda[idx2]^2) / (5.4) -# penalty[j, idx3] <- (3.7 * lambda[idx3]^2 + lambda[idx3]^2) / 2 -# } -# -# -# loglik.penalty <- lambda * colSums(penalty) -# -# return(loglik.penalty) -#} +SCAD_penalty <- function(x, lambda, gamma) { + idx1 <- abs(x) <= lambda + idx2 <- abs(x) > lambda & abs(x) <= gamma * lambda + idx3 <- abs(x) > gamma * lambda + pen1 <- lambda * abs(x[idx1]) + pen2 <- (2 * gamma * lambda * abs(x[idx2]) - x[idx2]^2 - lambda^2) / + (2 * (gamma - 1)) + return(sum(pen1) + sum(pen2) + sum(idx3) * lambda^2 * (gamma + 1) / 2) +} + +MCP_penalty <- function(x, lambda, gamma) { + idx <- abs(x) <= (gamma * lambda) + return(sum(lambda * abs(x[idx]) - x[idx]^2 / (2 * gamma)) + + sum(!idx) * gamma * lambda^2) +} #' glmnet_penalty #' @@ -29,9 +27,9 @@ #' #' @return a penalty score #' @noRd -glmnet_penalty <- function(beta, lambda, alpha) { - return(lambda * ((1 - alpha) * sqrt(sum(beta^2)) + alpha * sum(abs(beta)))) -} +#glmnet_penalty <- function(beta, lambda, alpha) { +# return(lambda * ((1 - alpha) * sqrt(sum(beta^2)) + alpha * sum(abs(beta)))) +#} # Ordinary Spatiotemporal Kriging Prediction with a Local S-T neighborhood. # @@ -351,13 +349,20 @@ eliminate_dupes <- function(locs, locs.pred = NULL) { } lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, - parallel, foldid, verbose) { + penalty, alpha, parallel, cluster, foldid, verbose) { lod <- lod[miss] last.coef <- rep(Inf, ncol(X) + 1) - cur.glmnet <- cv.glmnet(X, y, parallel = parallel, foldid = foldid, - gamma = 0, relax = TRUE) - cur.coef <- as.matrix(predict(cur.glmnet, type = "coefficients", - s = "lambda.min")) + if (penalty == "lasso" || penalty == "relaxed") { + relax <- penalty == "relaxed" + cur.glmnet <- cv.glmnet(X, y, parallel = parallel, foldid = foldid, + alpha = alpha, relax = relax) + cur.coef <- as.matrix(predict(cur.glmnet, type = "coefficients", + s = "lambda.min", gamma = "gamma.min")) + } else { + cur.ncvreg <- cv.ncvreg.wrap(X, y, cluster = cluster, foldid = foldid, + penalty = penalty, alpha = alpha) + cur.coef <- as.matrix(coef(cur.ncvreg)) + } itn <- 0 while (max(abs(cur.coef - last.coef)) > eps && itn <= maxit) { itn <- itn + 1 @@ -369,10 +374,16 @@ lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, coef.mat <- matrix(nrow = n.mi, ncol = length(cur.coef)) for (i in 1:n.mi) { y[miss] <- rtruncnorm(sum(miss), b = lod, mean = miss.means, sd = cur.sd) - cur.glmnet <- cv.glmnet(X, y, parallel = parallel, foldid = foldid, - gamma = 0, relax = TRUE) - coef.mat[i, ] <- as.matrix(predict(cur.glmnet, type = "coefficients", - s = "lambda.min")) + if (penalty == "lasso" || penalty == "relaxed") { + cur.glmnet <- cv.glmnet(X, y, parallel = parallel, foldid = foldid, + alpha = alpha, relax = relax) + coef.mat[i, ] <- as.matrix(predict(cur.glmnet, type = "coefficients", + s = "lambda.min", gamma = "gamma.min")) + } else { + cur.ncvreg <- cv.ncvreg.wrap(X, y, cluster = cluster, foldid = foldid, + penalty = penalty, alpha = alpha) + coef.mat[i, ] <- as.matrix(coef(cur.ncvreg)) + } } cur.coef <- colMeans(coef.mat) if (verbose) { @@ -425,7 +436,7 @@ MMatern_cov <- function(locs, y_ndx, covparams, P) { Sigma.hat[which.j, which.i] <- t(Sigma.hat[which.i, which.j]) } else { Sigma.hat[which.i, which.i] <- Sigma.hat[which.i, which.i] + - nuggets[i] * diag(nrow = sum(which.i)) + nuggets[i] * diag(nrow = length(which.i)) } } } @@ -467,3 +478,21 @@ rtmvn_snn2 <- function(y, cens_lb, cens_ub, mask_cens, NN, cov_array) { } y } + +cv.ncvreg.wrap <- function(X, y, cluster, foldid, penalty, ...) { + if (!is.null(cluster)) { + if (!is.null(foldid)) { + junk <- cv.ncvreg(X, y, cluster = cluster, fold = foldid, + penalty = penalty, ...) + } else { + junk <- cv.ncvreg(X, y, cluster = cluster, penalty = penalty, ...) + } + } else { + if (!is.null(foldid)) { + junk <- cv.ncvreg(X, y, fold = foldid, penalty = penalty, ...) + } else { + junk <- cv.ncvreg(X, y, penalty = penalty, ...) + } + } + return(junk) +} diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 780c6ce..2ca79d8 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -54,14 +54,19 @@ setMethod("prestogp_predict", "VecchiaModel", m <- nrow(model@X_train) - 1 } - # Vecchia prediction at new locations - # Vecchia.Pred <- predict(model@Vecchia_SCAD_fit[[1]], X = X, which = model@lambda_1se_idx[[1]]) - Vecchia.Pred <- predict(model@linear_model, newx = X, s = "lambda.1se", - gamma = "gamma.1se") - # Vecchia trend prediction at observed data - # Vecchia.hat <- predict(model@Vecchia_SCAD_fit[[1]], X = model@X_train, which = model@lambda_1se_idx[[1]]) - Vecchia.hat <- predict(model@linear_model, newx = model@X_train, - s = "lambda.1se", gamma = "gamma.1se") + if (model@penalty == "lasso" || model@penalty == "relaxed") { + # Vecchia prediction at new locations + Vecchia.Pred <- predict(model@linear_model, newx = X, s = "lambda.min", + gamma = "gamma.min") + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, newx = model@X_train, + s = "lambda.min", gamma = "gamma.min") + } else { + # Vecchia prediction at new locations + Vecchia.Pred <- predict(model@linear_model, X) + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, model@X_train) + } # Test set prediction res <- model@Y_train - Vecchia.hat @@ -203,10 +208,21 @@ setMethod("check_input_pred", "VecchiaModel", function(model, X, locs) { }) setMethod("impute_y", "VecchiaModel", function(model) { - Vecchia.Pred <- predict(model@linear_model, - newx = model@X_train[!model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") - Vecchia.hat <- predict(model@linear_model, - newx = model@X_train[model@Y_obs, ], s = "lambda.1se", gamma = "gamma.1se") + if (model@penalty == "lasso" || model@penalty == "relaxed") { + # Vecchia prediction at missing values + Vecchia.Pred <- predict(model@linear_model, + newx = model@X_train[!model@Y_obs, ], s = "lambda.min", + gamma = "gamma.min") + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, + newx = model@X_train[model@Y_obs, ], s = "lambda.min", + gamma = "gamma.min") + } else { + # Vecchia prediction at missing values + Vecchia.Pred <- predict(model@linear_model, model@X_train[!model@Y_obs, ]) + # Vecchia trend prediction at observed data + Vecchia.hat <- predict(model@linear_model, model@X_train[model@Y_obs, ]) + } # Test set prediction res <- model@Y_train[model@Y_obs] - Vecchia.hat @@ -240,7 +256,7 @@ setMethod("impute_y", "VecchiaModel", function(model) { }) setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, - eps = 0.01, maxit = 10, family, nfolds, foldid, parallel, verbose) { + eps = 0.01, maxit = 1, family, nfolds, foldid, parallel, cluster, verbose) { y <- model@Y_train X <- model@X_train miss <- !model@Y_obs @@ -257,10 +273,9 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, locs.scaled <- scale_locs(model, model@locs_train)[[1]] locs.nn <- nn2(locs.scaled, k = model@n_neighbors + 1)$nn.idx - Sigma.hat <- array(dim = c(nrow(locs.scaled), nrow(locs.scaled), - sum(is.na(y)))) + Sigma.hat <- array(dim = c(ncol(locs.nn), ncol(locs.nn), sum(miss))) k <- 1 - for (i in which(is.na(y))) { + for (i in which(miss)) { Sigma.hat[, , k] <- MMatern_cov(locs.scaled[locs.nn[i, ], , drop = FALSE], rep(1, ncol(locs.nn)), params, 1) k <- k + 1 @@ -279,14 +294,14 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, if (parallel) { yi <- foreach(i = seq_len(n.mi), .combine = cbind) %dopar% { out <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) out + yhat.ni } } else { yi <- matrix(nrow = length(yhat.ni), ncol = n.mi) for (i in seq_len(n.mi)) { yi[, i] <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) yi[, i] <- yi[, i] + yhat.ni } } @@ -296,10 +311,19 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, Xt <- as.matrix(tiid[, -(seq_len(ncol(yi)))]) for (i in seq_len(n.mi)) { - cur.glmnet <- cv.glmnet(as.matrix(Xt), as.matrix(yt[, i]), - alpha = model@alpha, family = family, nfolds = nfolds, - foldid = foldid, parallel = parallel) - coef.mat[i, ] <- as.matrix(coef(cur.glmnet, s = "lambda.min")) + if (model@penalty == "lasso" || model@penalty == "relaxed") { + cur.glmnet <- cv.glmnet(as.matrix(Xt), as.matrix(yt[, i]), + alpha = model@alpha, family = family, nfolds = nfolds, + foldid = foldid, parallel = parallel, + relax = model@penalty == "relaxed") + coef.mat[i, ] <- as.matrix(coef(cur.glmnet, s = "lambda.min", + gamma = "gamma.min")) + } else { + cur.ncvreg <- cv.ncvreg.wrap(as.matrix(Xt), as.matrix(yt[, i]), + cluster = cluster, foldid = foldid, penalty = model@penalty, + alpha = model@alpha, family = family, nfolds = nfolds) + coef.mat[i, ] <- as.matrix(coef(cur.ncvreg)) + } } last.coef <- cur.coef cur.coef <- colMeans(coef.mat) @@ -315,7 +339,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, if (parallel) { y.na.mat <- foreach(i = seq_len(100), .combine = rbind) %dopar% { yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni yi[miss] } @@ -324,7 +348,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, for (i in seq_len(100)) { yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - rep(lod, length(y)) - yhat.ni, is.na(y), locs.nn, Sigma.hat) + lod - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni y.na.mat[i, ] <- yi[miss] } diff --git a/man/PrestoGPModel-class.Rd b/man/PrestoGPModel-class.Rd index 02664c0..70965db 100644 --- a/man/PrestoGPModel-class.Rd +++ b/man/PrestoGPModel-class.Rd @@ -52,8 +52,12 @@ last element of beta corresponding to predictors for outcome \emph{i}.} of the list corresponds to a different outcome. (The list will have length 1 for univariate models.)} -\item{\code{linear_model}}{The glmnet model. See \code{\link[glmnet]{glmnet}} and -\code{\link[glmnet]{cv.glmnet}}.} +\item{\code{penalty}}{The type of penalized regression used. Should be one +of "lasso", "relaxed", "MCP", or "SCAD".} + +\item{\code{linear_model}}{The glmnet or ncvreg model. See +\code{\link[glmnet]{glmnet}}, \code{\link[ncvreg]{ncvreg}}, +\code{\link[glmnet]{cv.glmnet}}, and \code{\link[ncvreg]{cv.ncvreg}}.} \item{\code{converged}}{Did the model fitting process converge (boolean)?} @@ -67,7 +71,8 @@ approximation. Ignored for full models.} \item{\code{min_m}}{Minimum permissible number of neighbors.} -\item{\code{alpha}}{Parameter alpha for glmnet. See \code{\link[glmnet]{glmnet}}.} +\item{\code{alpha}}{Parameter alpha for glmnet or ncvreg. See +\code{\link[glmnet]{glmnet}} or \code{\link[ncvreg]{ncvreg}}.} \item{\code{scaling}}{The indices of the scale parameters. See \code{link{prestogp_fit}}.} diff --git a/man/get_linear_model-PrestoGPModel-method.Rd b/man/get_linear_model-PrestoGPModel-method.Rd index 658c7db..d311a48 100644 --- a/man/get_linear_model-PrestoGPModel-method.Rd +++ b/man/get_linear_model-PrestoGPModel-method.Rd @@ -11,17 +11,17 @@ \item{model}{The PrestoGP model object} } \value{ -The fitted linear model (of class cv.glmnet). +The fitted linear model (of class cv.glmnet or cv.ncvreg). } \description{ -This method return the fitted linear model (of class cv.glmnet) for a -PrestoGP model. +This method return the fitted linear model (of class cv.glmnet or cv.ncvreg) +for a PrestoGP model. } \details{ It is important to note that the model is fit to the transformed data. The CV error rate and predicted values of Y will not be correct for the original (untransformed) data. This method should be -used primarily for examining the coefficient path and generating plots. +used primarily for examining the coefficient paths and generating plots. } \examples{ data(soil) @@ -43,5 +43,5 @@ Applied Statistics (2021) 15(2):688-710. } \seealso{ \code{\link{PrestoGPModel-class}}, \code{\link{prestogp_fit}}, -\code{\link[glmnet]{cv.glmnet}} +\code{\link[glmnet]{cv.glmnet}}, \code{\link[ncvreg]{cv.ncvreg}} } diff --git a/man/plot_beta-PrestoGPModel-method.Rd b/man/plot_beta-PrestoGPModel-method.Rd index 2c5bafc..2628ce5 100644 --- a/man/plot_beta-PrestoGPModel-method.Rd +++ b/man/plot_beta-PrestoGPModel-method.Rd @@ -10,12 +10,13 @@ \arguments{ \item{model}{The PrestoGP model object} -\item{...}{Additional parameters to \code{\link[glmnet]{plot.glmnet}}} +\item{...}{Additional parameters to \code{\link[glmnet]{plot.glmnet}} or +\code{\link[ncvreg]{plot.ncvreg}}.} } \description{ This method generates a plot showing the coefficients of the model for different values of the tuning parameter. It is a wrapper for -\code{\link[glmnet]{plot.glmnet}}. +\code{\link[glmnet]{plot.glmnet}} or \code{\link[ncvreg]{plot.ncvreg}}. } \examples{ data(soil) @@ -37,5 +38,5 @@ Applied Statistics (2021) 15(2):688-710. } \seealso{ \code{\link{PrestoGPModel-class}}, \code{\link{prestogp_fit}}, -\code{\link[glmnet]{plot.glmnet}} +\code{\link[glmnet]{plot.glmnet}}, \code{\link[ncvreg]{plot.ncvreg}} } diff --git a/man/prestogp_fit-PrestoGPModel-method.Rd b/man/prestogp_fit-PrestoGPModel-method.Rd index 96f5e0f..e85dcbe 100644 --- a/man/prestogp_fit-PrestoGPModel-method.Rd +++ b/man/prestogp_fit-PrestoGPModel-method.Rd @@ -25,12 +25,14 @@ verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 0.001, maxit = 5000), + penalty = c("lasso", "relaxed", "MCP", "SCAD"), + alpha = 1, family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, parallel = FALSE, - adaptive = FALSE, - relax = FALSE + cluster = NULL, + adaptive = FALSE ) } \arguments{ @@ -101,25 +103,44 @@ See \code{\link[stats]{optim}}.} \item{optim.control}{Control parameter that is passed to optim. See \code{\link[stats]{optim}}.} -\item{family}{Family parameter for the glmnet model. Currently only -"gaussian" and "binomial" are supported. Defaults to "gaussian". See -\code{\link[glmnet]{glmnet}}.} +\item{penalty}{The type of penalized regression to be used. Should be one +of "lasso", "relaxed", "MCP", or "SCAD". Note that "lasso" and "relaxed" +will fit the model using glmnet and "MCP" and "SCAD" will fit the model +using ncvreg. See \code{\link[glmnet]{glmnet}} or +\code{\link[ncvreg]{ncvreg}}. Defaults to "lasso".} + +\item{alpha}{The elastic net mixing parameter. 'alpha=1' corresponds to +lasso (or SCAD/MCP) penalty; 'alpha=0' corresponds to ridge regression. +See \code{\link[glmnet]{glmnet}} or \code{\link[ncvreg]{ncvreg}}. Defaults +to 1.} + +\item{family}{Family parameter for the glmnet or ncvreg model. Currently +only "gaussian" and "binomial" are supported. Defaults to "gaussian". See +\code{\link[glmnet]{glmnet}} or \code{\link[ncvreg]{ncvreg}}.} \item{nfolds}{Number of cross-validation folds for cv.glmnet. Defaults to 10. See \code{\link[glmnet]{cv.glmnet}}.} \item{foldid}{Optional vector of values between 1 and "nfolds" specifying what fold each observation should be assigned to in the cv.glmnet -cross-validation. See \code{\link[glmnet]{cv.glmnet}}.} - -\item{parallel}{Should cv.glmnet use parallel "foreach" to fit each fold? -Defaults to FALSE. See \code{\link[glmnet]{cv.glmnet}}.} - -\item{adaptive}{Should adaptive lasso be used? See Zou (2006) for details. -Defaults to FALSE.} - -\item{relax}{Should relaxed lasso be used? See Meinshausen (2007) for -details. Defaults to FALSE.} +cross-validation. See \code{\link[glmnet]{cv.glmnet}} and +\code{\link[ncvreg]{cv.ncvreg}}.} + +\item{parallel}{Should parallel "foreach" be used to speed up the model +fitting procedure where possible? Defaults to FALSE. Specifically, +parallelization will be used for imputation and fitting the cv.glmnet +object. See \code{\link[glmnet]{cv.glmnet}}. Note that this +only applies to glmnet models (where penalty="lasso" or +penalty="relaxed"). Models using ncvreg (where penalty="MCP" or +penalty="SCAD") require a cluster argument for parallelization (see below).} + +\item{cluster}{A cluster for running cv.ncvreg in parallel. See +\code{\link[ncvreg]{cv.ncvreg}} and \code{\link[parallel]{makeCluster}}. +This must be specified to run cv.ncvreg in parallel. It is ignored for +glmnet models.} + +\item{adaptive}{Should adaptive lasso be used? Defaults to FALSE. It is +ignored for SCAD and MCP models.} } \value{ A PrestoGPModel object with slots updated based on the results of @@ -199,8 +220,6 @@ soil.vm2 <- prestogp_fit(soil.vm2, y2, X2, locs2, scaling = c(1, 1, 2)) cross-covariance functions for multivariate random fields with any number of components", Journal of the American Statistical Association (2012) 107(497):180-193. -\item Meinshausen, N. "Relaxed lasso", Computational Statistics and Data -Analysis (2007) 52(1):374-393. \item Messier, K.P. and Katzfuss, M. "Scalable penalized spatiotemporal land-use regression for ground-level nitrogen dioxide", The Annals of Applied Statistics (2021) 15(2):688-710. diff --git a/src/createUMC.cpp b/src/createUMC.cpp index 8e3e09c..151acfd 100644 --- a/src/createUMC.cpp +++ b/src/createUMC.cpp @@ -1,4 +1,5 @@ #define ARMA_64BIT_WORD 1 +#define ARMA_WARN_LEVEL 1 #ifdef _OPENMP #include #endif diff --git a/tests/testthat/sim_multivariate_big_st2.RData b/tests/testthat/sim_multivariate_big_st2.RData new file mode 100644 index 0000000000000000000000000000000000000000..9fedf701adc6b65b9dd2df75206e0989a65c788c GIT binary patch literal 255125 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 -~h{mr}JS2g94_p3};+EL_qI7|{&f;;{h z-AjRCFnv50=L}PQCdudiSiy=u*RKcNhA%bv2(gjsL;-tsm!Y zi};4^2C?OUbi7R84Hy+nGoeoK;rQ~}C0k>FaXZV_I>I^VXs~{w8Sovdw_hW5QYA6@ z*@+}KY9}u2VvZ8nnvaTJbw9YeVpbSXn?k;lF)1jzmmL^nJYz10UoTPTJ=I z`L*VWKvQ>U^4Rh1nXDn3fuxFjCmc{iDwzC-Ux8#Lme~w6jCcg@fF&^`c zEFt02OTExCdPeN8C+c3XbI1N8kq3HvIdIs#a(E?(1!s=iPG^uPKqdv>`nD{F^VU4f z0Y2GK>Cn)kKXw>W^5$Ire*bu;ulA;e@%Ap!Dw?Z zlvW*M%?Lp!d>hs<_WDqA$Efw16|ATdngB-W7?7+cquWd|PkHYHf18;R&2MNpzYA+9y*fEt{ zI@xpUA;c_Or#d*F$9XqVz0I5H1e&i|Iy2}BA@4o>Bj6+q##l+!OFxCOcGo}6+vI=} z^MR_BnE`~WuYCsJ{KCOsv3pP6{0XsVu7!FRBetLWsbO>J2(&o8*4pHig9V=t9lu{0 zpTYP{DdlAx3rw`ved=4O#|huX!R^5>fkYR-Nl4;Ct=kh* z1NSCj`s={?Wz#{d=WY8t)I4m`?AHeBHq>81)JK$c9?{Ck( zMxx&p9SsM@=CD*pf*sLa}d>*AQ|DCM)` z%x*}VH%$BWz6T1e9{b;`JcJwSEz8b_nV@A(*>GlIKg<(te1gg{~+z=FT)c+Jt%u)jn)Q8k+$zOmi}Rz221OSw-lIf z)A$o)%!iYSm2|%cw_eviF>%xOH?YpfVJB(%8q?duXx&5&vFk{){KUyRm^XP=*i)d3 zsdM^KRF8L1psUChd|?5Wgf@&eg$r>oWa*2_BoPKL(KYfGazNQ;hJON~62|{B=RXT- z#Ld6wMO;4;FfA$IXso;n4r%#FIlhR&K{`10_Q5HPA1g`Mm~$l1QU*>Rd!2$~=h?R9 z3+;v0>+zX}8{$}Fb}-QJp$K%^{5x^+h9WlHDp3_m4}-Q3=6f8D_2E>t$@5U&n=n^* zkpKLrJ4jil0eyotY&mWH^z}zc7~wRCE+)$a5Nnpi5Af4^CWx(7~!cjXvy?klP1efTpax|cQkyLCmN%lUrgr2BQq`wuRK z`ESDdvhc_4jP5YwUJ#z`D20<({5v>pjc`0iW$o*qr?9s1vr^stE{sy1cq{PV#(w&W z+lNcoa9r{HMd^22e*T_tlFWA+XY5%G1=Kr%SgB~wuK5DfA3cA>n_Yp_xusRYsgE!; z_*bjZ(-+ro`a06G&*So`f_q{r_DIxy`ojH+H!dYaaJfDI37g{fnl^%_Fz?NJJU-sMj0%8@ma?7#z~-b97#G6 zaU13ql;xIOs90;|@X6aFA6FJh+tv*0vGUp($tTk1vEcwWr{?w%SUG#_rt+ScOKp~{E&OFJ7Qo+~3UwmHS%m!`X%@s#% zXUwx5!*%S)x{!G%!yo(eTOO92e}nBb!LN3fCIYF{DR9m8DE5lH*;Sp+2O}YTe=JAy zfq3+z(p<$sTw>m*daLs=PJY_O5JP(i=FIBzo>!URXq*wv9ZxqXxWr&a+^|ui`7l-f zu2l~++CT3b4*mht)w0b;m$t#s==-#V_ZNX^P~;nXYab3B>MJk0bpci$`U|}BzKVpB zv@33Y@wjF&&Eb)J9_D;)>=SR?-pb7&`Cs1<2OknPpfnmN8WQw}*~74Gr-zBo^M^o< zxW6Lvq6jHs83Jj-V^C&}zYjii1nLFW{rgjjfv9scmT71hDn1@jx^RFUdQYEvVCLij z{mllIM5SdI|L5?`^vH{?9vHRxG?WcvHDM!Dr`-s&ZN3xSqwTozTUYFvt|(AvBDyo= zpI~|4tXi;08h$mj6<_=i4$b@DUaZ>2h25tnTVu^Ev7TOU)kT7clb-3~t&(l9qB&f) zDY75Pw-0U;ISe?YGQz1#XU@#~J%+;&8T8+K;DSVI=J{PvN?^lSDd~Bk32gIZ;Ql{K5w; z+MZUk$6g4(+jD0xEbGHc+OYoP<_B1!{+RV5!!al;P1g#`XN9SwbDsVpHc;_=m+R{h z86-a@?J#i!Tx4d7dM_OYLr0fkYU&nD$T9siKko-4Ev{GF`q^=PQ}kuXsVY{dThB37j;k2zQ0z9?I^!^_;@_dFWMwIwf_e4yC$O6 zwOnXywu#hpl7?us;y=Lp2ij&wMTJ7Rv9;-s;~<+PrX5ffe=o3#OSj|NpFF(=#2o6l z+KxJ$yQ>+ka-A76di`}t+g4$XK3eUIW*Zjtb04P!e8Juib-B5_55mwf3%(uOc0plq zDeGGqI{dDdxU_PfMTt(Rq(tD-47KIl`8YIBB0b5CTn)J**S9Z=)7=}Rn&3?#zF*xqLc&RFViLK=Ny$de3Q|^ zH<$<`vPN*$Hkf`+ z^wrZ*gL)!o67x4%ARm0}9mvrH)Z6dOX`dM2j29)^fpG?h*bZM`yS<9!`=n%#9pB*( zlShQf&iznt<44!dK#xtQk9WRR8i8`d(J8^jYM6F@JC>b00uw$1b^P{EaPj)5y%n+o zP;7lu$S5lbN0~h-2k<9!bXN8!{}%v-pWoeEx_baS@AV&Y9?%Agh`8i#fdU+UIG<)e zr2z$mQ5 z?xnCFhO(Z0-fsRDSBkP7XgR(U7~VDQF`WTyk10F68MX%-4=bLL*bxZpkryfZx)xyi zgK{yGf-v?U(9aNzG=q+_adm3)(YVqz%an3{7^%^<%l?Lpq*U6mLJ5V8z_VNrl5_C9=tgFla|Nm$%{+zGLhe@%f zqjU?GVJP6Dx|`oRj*PK><^8k+bM*MDrvDyOP3UQkknl1NV7c3(8Dtobbg- z{eDu#T?ZU0idQ4}gcE4!#*hE^V>eRjN(py(TadWy_p>7jCGGYZF>pH@j~6u?5iWW%6`CN2g18~U`M3M54_ zooUGcn0m^#Z6;0;<_&f}joXmKp=l=lPYd(dm78#Kz+Mocioo4c02du4;?Sy!1GV5`dRVVKS*Y~=Dr`Me)UJv>TAPtl?ClR?+dWR8zg15 zTNb)xXFj^0Sp#ah$n!&K#z2X`{c?ExKGcZ6TlszD7_3-&FvcZu;zYuku2RdFP@1UK(hI2lO9?HH7(OaEl2DiHZjxv?bVVjmdH}!xIHtk*67vE8Zs|LljJf}#o zNzIyn)H?zBhb=pJzlQpv_5@OOzoH+8{^y24}<2aVVeU+hS z9alyyx+`icu_oAZK35|N=cPsKg9aWzQ%|`xZ}(OeWlgr13vT&np}NoX3@_Sr?o&Ru zEfJ~1Qj9_hkGIaZV7tca0@RoEaQpB(T!?b|Y_wmG!0@KgWak_a8y0`!w}?3G7b5(- z^YJ!rx;Po{KfDQK&>yelt-+OzXiZ0}SFkFx7+x~iOJM%d)Bfw|Q^-2k_{H(KAPh+! z`R@~55U$;7t%=H`z`9_EOv=mzG?>q6E^3THt@y6WJF2o+X(CKK^XD2yn2PNv{HzGA zOg_#F>SO|~^faw!G8xFZ^nx~8)6iwNo9#@8KBfp}wzA(d920{ z>QC+3p;J4LbIs?S3+z2BcYS-w$&H^4APxo8gtF$eJZ@0;1Q|xN>);Lgx(0itR za*^K`%9qWy1n)l}UyimKO*O(vr}7w`_ijk+bJjNgJ^`=V!m8Y?#bI8R=&Wmfmq6oU zBl|Dr0hHY8^A5}`2Fka2OYJC6nB4QrOPp*AAq^^SMR&w8KYxF8!72yzWn@f$B8tGU z=31ZDLk1uX@~*5nSU}fC>CqCyHds69v6y()4hu6N<5xCd0Kxalb`33P7M&X^rVW4v z{{!bIx!j>%=iIMXmw92vvd*^8ED8sV$8x{>-$sh@cOApV+c0TO`p7J9igk|a&L8jT zLbb%_H>SU@Lv2ob*73e|SbMlg-zu^MmC<#xx7#Q%6i9Qfa`ZXW#e9j9m6gNkGHP(k zBX3wVh#!tDJOvH(J89Q@FX1#Nd)52iJrKznx1MG75=K5-(KzjJ1d3hkr?)3}!FXiF zTz{c9l7W{){sILL>Q8OV z9>qqF2*%ePTYV52{Pdn1AFfCiYvnKZBgLCRW|wF+j&&Wso^mMzrn)vQqs=#cg>M5XcHiDA^zom6Z1F_FT~vXG7=}xe~G+W?(q!ui=!;soVEgr$65S>}P3)B!Bo#ZK->_N2 zvR9K`?|JND>852|&fgAP(vwr|$ohvJL3(}9;~xR(YkE&4$pE`wzb1>QmE*i(Yt#Fj z?>HjXc<)N)5_Xel6^`HH1?uN=G8eretc$q_=eK6y)ZW`ScWj+|?9o@GS>VRhi@uJJ z24aw;MM$INkjKHe>3rYA=W(&L=>U!0X_!j;#1f>cjl};xYl{Rp!lcw%uXOiuq+H)A zAe|b6Lkil(3ZKlOCu_m_uET#wY?8M(=b>V!Z^Z1BT@Fz9-wrt&C6qxI`+qpY$2zu1HIrS)8rE}(?YhyH zmb|lDpfrBfLHGq^L$K5@<#zTWuT z2#_0PzdVLbPJ66$Og*vJ`$wmjnetYTx{>m(rvf=MG&#-70_W}@678U!AkZJbzL{}j z2A3p01-iYQgv zC{Ve@JBwfA*;%mpUrAhpFDnK}2&B+X?|{SxSx2Rhv)Gf}`|iAG8%`JX1iFPd!hHIg zH`ATN(3ksRrRZ50jwF|VT`w_%VeuD#jQ{FmTM0_I9$ne$9U433zdLX~OHO(rk$@X& zCUz9F9$4QtNnpQx6^GP|NDS@DNJ=^N_{>pJARBKMdjBkfm6~@qX@Z|ZRod;+N90QkethhvAsH8-djW%EwgXF6oA$FMCA!zVuDjG{=9kbga{b1qzsQk-J798I3gm%t} zfFoUbDhKzC;{5BMCqAB@MWQALn}^*coYJ~6WOauJ=h_-{rLJ7YvGc4G!tfIs{T4_x z!6LA5%xd)3GbZSM+N3y6O~i@MWarV$LR@{IJW$i9042)>q?Q>kpqM4g*_bBa*uNz5 z?HxOS$o-}_UT_2(2UL%Kyz~(wO2J#KISQA^KE<*p;(_#Z&NBD~JxmYC4?Bs;LVw`m zx!YK9X)Y)En;nvTsKX_7nO$kPG;g*pGH3>k zLO<^G-0*;@p4`Yo^r}d`qet6vH4=X?@ZJB=a7~F-qV@~zV`(IXMu>XtH^g4QG0nu_ zBpAE;tciu?9ahTuSnywKgK;(0gznIOwCH@8pBNj06(&z_N9)z#;4R;3<*Q-XT4zRM zYhQz-+)cVCWVd>5_O2w+!w#w6n!CMo@?f%>)yQdoAXe$N{*$fIg7Mc(R7DzIC3-3D z!-hI+xN`pb`T(+B4hL?+2^mt0@!)_bsrP0Y(N$$Y%+8}NCvx0U1X`e2&=fFJr z=CC)Dg1A)knN|grRU*4_$rgaxo@?R;ta{LGmy_@5h zI5L2pEf=}INW^2ekwWL~zEWrpx#?5(Ng78Tf9#-~)q)}QW&1F#1YBEKyE%JD39~JK zE?-XJF4p8=AW1 zvFG`+X%r(2jCCxCdNdMfIE83puf2qSYyBIs{~g1{ny_}m4G|nWq!iRv8wW+6?{`RD zYk|T4w#L=12#R;*4ks$s!9e^USu*Wu9R9`d=GV>==!glg(OIQ|62qe!t}ae6q%vsX z92@`>2klq&{J-Lyf7Vi^lmSpwwDufie~fMFpurV9j)U9!6O#@$U`Mf4K7S<>#=jcz z`+HIsmXZ%xuX}mJoY4|rTJi+83JN^?U^b5P!NH~Lu+SdyrG3OHfV5r+d9?*>GzSpk?%iX zb9W)fp*z)BcCq!ew{tZ9sb$SOFvpH%X+W!ZXbJsvNCI80+Yo=-SmpNr!i5!1Ink&u zI57FBa5~i!<`U-KH=ezVGb`_Jq=_wJmHCvmSHC!p|Ew}OXz7T9vouTx4Nt=KlkL;f zY&&sc2Qg+)H5k|0hJ+>U!lCT~{nA>#C?p1n4OyP5#P)Jd>ibwP959+F%=!EX$;>JN z?1P&)e6>H~Zq+|*9g?E9TW#^vfoH<8yoJ!rcVOW0+e%odkbE0jXoBOZ`HtteWnsMN zt7nTrk~mj()=a!Q2uN;u_bPXhpg4_p_dz@WeZ-#&@3!`M~NAgRc zglF4r@X12+jBjsj)Gn<2bm9Rsn+Lx5w^Xiktp-~546cTAsslOD!=>|K4$g)51gZ|o zAXR;NZwuuuww%i-Pv7#Ob)mL)$T^)!B@&at_fcow#dQuiIIdr|J$(it7qTbSxy3z z!lS=8&Q3x3N%sWJOIpxGx5AM8>?_V!#~r7!$-=dX^;4`x)wuE3RF`y02eO{|Zk)Qu zhMnK!RBEE-Ay*>1!Z_amx?3#&E|7M^zpp#pw!KP+!AFFP)>Z;2vrXlZfl&%f9=O(U zz0nOQF)VKb4=50r-PDLuVqMVn-~Feo4cT>ek8O<|6zE@ z1e*olpIw~g!;V*HyTyylfpp8k>st*0$Tz|-ovgk9)Uji2KF0&FlWVamzbhOXBxp02 zWW=G-_1qY}asZINJ31eO;fCP;Zi_)wVUg%ie`<$ZY{u{LtkuJ45h zHboBQucvRo%GJ7%h%PUzzv<2j`)oeN#oDMQy7mZ$5EdTm-7W`}R*p zcc9G5xBAKcARu?o?sj(a#L|-NXH;!nEH3?{_CQG$HnG@Z6sGh*xqA~uBTPS&iz2LsZ~82;{;81$CA!OH9&>ph@}O+I&}7n%!+2;!O_x! z+3{p|n4E9qRm*F|rV2&VOJ%2VBq(d?0`nhSP$Ui03dBI$;OV+^sh6NQ_r`(Qb2J3n zsBjr4+76sC-yIDUIEv4z1Rp*rkQfu7IW>V&s}*hs7VUDvG^ zDaJ;ML)HO6F!*uY*qsQ?H?v+`meWAW<(5}ojh#p|)mG-Oc>wudFBz7slVM~=R((Fo zgurN~SN7Cd3nKRvT4cLr;c|;*Dt(_Uj3x-j1XSx_a;CB#UFvC|iogGsA#X;YsSLX) zPV&W-fewSEH`!2Dmd2+*{}zT`XjK|_xGG1BCCc2gH0tQiIy>kpj6uh&{5t40>E`>vs5&ae(RYd#3?Fdh!?DZtneou^tgvtCrW~$i##MSXghTH&Jbv?o0gQ_uGWYFr zf=-%Cua%~Ipg%L(qN92fsa&R``ZL>c@Y{XT*_dD07m^mi@|GQ!^}1~1&y~T-?f0o% zYY$+_D|>N|+Zz};VIg6z>4D{6-lY}Hox=9yAL?cWpP(VJ;`k}KAJ8WBI3y*<85@O8 z>k;CQ!cffTyTLSTuzG!5s%NSKvbSe{^f_pYq_+W5SFg!pd4ZD&r@?k;Pq(c5*OUbl z-K&!~(v_hn|CGAJuViSIY9O1uP{U@G;$3V%k3i3Kcg9n<6F4CHL!GP80B7W*i**D` zfs~!LTc74P4xhbgFq*Iz60t`x>NyoD#T?r5rMWoF(RSiP#zh=ulafrl9t>0QWQK!} zUhMyEI@Ae;bRB3RXKA4CF-+&sX0;}te3^!S1 zw)p((M#9KTSX&=V{_=DXTO=Ebc)sgFS?dcL9nVsn!kcZ2-2Y*RV=WEk+5*g_eqA;Z z^@N7@_HaY|{7Rd!Sz@|G%=w&w!FAZ8$ekg)Q)?!-RMZ z$pL*CKl8YtpCviQso@&5_Nsl=_*@BNUzGc6^hP0zV!Kk|nTGu@i-jhCPQa*aQ#E(f zHyo&azgktZg3A!k+aSZzVgxr=|57zlNxYi6!Ep8fn% z?0piFCNnPzu!R$7uAEQ`#lx_2e9-)ETr%{>7eV$pwGIYBW@^@2k_Sts^~*evEQ3 z*~3a;yp+n`HD3dZD>JY4+ntnXT1z8oJoI5HY|p1BcLLG#>8V%3F*exw;n@Wre@C2I z9Ia~q=m1mC_ryefzmA1oYg&9B$~dDZBagZg*!?>&%3l2#6c=e+3A7Hyg)>TgDm}NL zdqlEbWnBa&ew}}NtM@i$2>Hm(cCq3V)AN^No4&9fGquE+n}_2Kqg-u_r?5BG<9)da z8GeuXS}7}=;_x>q_FU0+q&(p&mw&nm)RxOJi_e(ww=~M52s*ILo zgh~-n2}w&yktAC}w#wca+0M21-h1zLUDsYezkl!RKCkDw=Q-zm-tX6ay`BdKUs}6f zDG!8Br?=(qi)7rKmG-A|FoF6WPQpUWHCXBWMe9cIfaGZAU78}(Fm>+1-V0W3IL)Ru z7JX6>+mC+J~{SEWI!^b!`I zmSsKI%8y-kwP(V%IUI&OrM1!>u;9TKp%^DFIQ;U=--PAWecW- zlES!hZ?FB4d~2B4Q}AQu<8_!~q_BpuB;wMOFS~+z#Gvul)AB=eRoLSws5(cjPo)0o zD}P|a2^&4iem?h!fQ7L4OLi7*Fd-wNPbWVBi(_^^`(yWRbDpN=mi1RqjPz7#XQdLOpVG+lV$=!~=K<;GiShp|W|Kc}kUCeC&7&UzW|hAKh3meGt3 ztdp|*%cT1sHlD6olHX+q!!G+qnHdscCBd6zHnjx$5`TZKb8Lr!iI3v{eLM>dFVhl- z_mpGl`^^iEA|BXf5U|Il;0 zKR>FUb4nsok($koFb!JqjF7O}U6}c7KdMpV24sy7G3rmLkrGVmbiShuBe(hUcu!8F zd0;>h%T7mZ_!v)nFTEG@uUnnjIrJB5KOB2bcI1P95{0c+WIr5w_Odo} zgKM9$$s^;$@30`KVknALy93o%6B!;Vh z$6pP{<>Bwc=d#}|u){zj>*bKs>@a_V>VWm}|B(D8R{VFPF;LV^ue_N21SBTr&R0@L zU`qWx;|)<=s3p9#eEBRKC>m_e!PXlvXZmzumX2lHGcGjg`J8~UQ=I3l-!ov#9lc{+ z)Mv0&$b+ZdKnX|znr|O!J3>FXd;LnZF0^}@Z(6c>1BJ85%yi)@P~;wF-AX?T0>2ZQF$dPII}lP@>RkIBAu4(*i*?MB;A)O(^UEhzH^Be4=_t&-NFIVeB2;`>Q0^Fll4wq zVK6NF1JXbeXXQvPRL4cHVFR)1?K$%ra(wjjC`<_4j(nn{jFd%_qhyX0nAcA^dQbcf z=6@)3t=L_Iy_wYy(}Uh)eQeaOIH5%JHi&WMSaXFqJ^zF{}>n z`6Zf(nD}+F%#Vc)*WT|r06Rd$zq0>YJS_b?C9SA%7Rs@LS5Gq$7Ak&PChI=HiSV#? z4UJJ4v)ae8$T)+;p5zSfcg_Sx-r^_w1-P)i*Vdrus4pxVe>}u*s01q$zyF=TBMWo$ z`^)TJQm|Y3o%7W_Z8%J)$vN!u8|rSFE;8{u5U5mcPm`X%N78KY>Tmf8Y;f>c;}rFS zl{1|mYQ$@x&o+LhTRD_SHL7RmGb)W8aB`>TfDYDDJX+<>KZYiUc=sZzX{g6o`+apD zSSTNRN3Hn?3=!29?iljI|H;aghBW zms;az0#(qNWSv<_B>$);*XU*eG55>j(6Ka_rRCpzp}>VB6;&cu!3Z^^-pg+VMPV>u zNJ#c&FAk~P@k*ZP!fDQix9BtICw3!DkhwnBR+a(3d_tX<5 zIk^#YGB5QP{e)4I8L6L+NjSx)G|kR>1;-m+Zxd>&Kun zA^j!)K>?sRlf+D~*h=$KT%?Fu}(o@sa&1%)ayoz>YUX+7+ixc=QC`yKYt)Cyjdyar?3{7?5SC_vYeZD;53 zZ>(l~q|&^>0;QHOZR#HvLw!uq9<5qw>{O{@s=i_aUVmi!xLJH~9qezPYkY}w36_uL zT%uroo=>l)Jex>!VKx8uh0`!%KF8(#F9OFIjjZ19Z^IEwtDv!$73lAA#_^MED^4C4 zDwz%p#HI=V#c=5W9BJB{S*jcWOU14?DrhAkaJZ~+t+Wt(^MzkAA7Oze<&1VZ$M_#v8Egh z8iK+LVeduGZ-4&WqL-OY3hN554;Q9*!SW}rfL&vqSbVkj>6?FUII8+w_}#7JP}2M< zA@$NY4A)Nk=^19h#^sA>4|cg_Ts1!HV?i48z~!1uDZ;bFK& zEGL^gJ3&jZ=SFRg`*v<8sYibjhHBo=dl#omU|D2GhS)J5=w^t%b-{NPn@-Bc`0L5w z{PBkOP9H>J<@;Gndy``@H_j2T{wN3v>>3rr?RmHTPR83@Ru}rIV=P|lazOLJ^Q|hq z;jnR=Z;SCbHxQj}y!_Pyu$XjZV5MIO(%s7rlY+`&;cSzRykjn|((T?L+or6rh!Q2YuvIrtc( zKG#EW?&Ta7uG_GgYk&InHqR}-dGauIssyKuLqboowPWdWO4Yg3TUZjOV!ESI2!<0c zY44@#gF!jvPWN}M&|TK#L+8eigZ4!i#vKVzV*L2)>0m$TxN?U3o9tm6>3Ps_$M7HY zIoz=mvR#DswPwq8Xv$P4d| z%?3Wl;Z);0Q^tTpvp4F7RbN7l{>9qY&JHjUF2>>6@fSPi9rHfdHX(&i=FFz-FC-5$ z-T1XVzrW+Jevb2}#R0XQwAnU;NYXA}{~?@>&0-?Tyso0S-kh%3a83ob7U+2P5y^AVR$5&mOzjAyGrZZy z4mZ~P9IbO?;6<5Bo&rriY+Q}-qAHWc`t@th}XtPzF(30WCp&rQjVJi&<3hBi<_IF{;tT4;dOaaE94E&9Dqyh2= z6~!*~0T^~>%znB1G0qiOoVqj=1;v9RG;-(XfO6A{PP{7^mlcj$_PXjodiRoc&bDul z?PyqF`Js*j2iCUqj!)whg(>$9bp?Tn>dx;FqAIp8&tzZLKDzBkX7|5Rhr{@F!-n9l z4?r2@Uv@1WgptvBSmP|MdKxszBp0Rx`D14WxwXsKr$@068)8g^SQ{AYQoYa8yJOmvNIS!8j7S zcU}us%XkWtq7K9!!}RTZ)?>YSFBU4SHzvczzCiCjCPt^<=`i>^b~MC?4SI>a3MMQpwjP^JuvrO)#&w*KawJ)Pv5A{#lh1@Mr~TEvHfOj zs$vEok>T3JvyJy8Xml=5&)pvm?N(CXsn4cE>*5vDKdWI_BWH4C;_PK?xE1!|8|Pk`9q|BdHdsyFB~}ERb%>Y^98hdZVU&s zgoD2@x_t%AB`r4(Gwlt>`$#J=dYnG`OGkT`D%y^Ij@BtA@2+*^HXKdPqqaeJpoAKNM~mEu;f;L0?|2@?F5mY?bB{vpv}GH>jvyI6KoEfis~ z=nJDN3k7s%xG5FPe+2(h-m(0A;EQd%?XmTL)?ggge<;#^+~!@SxbItMVRI+XhK|7& z3^$)u99MLLz94JsK;;sgeX6%t(99QxQrhiK+&+UX-Ibyv<*_&yvsC$BZvm!~$Z9S= z@wiAjdiHbL!1ld5AHj9&?sh+#Se0LDfR(7!k~Lg_x%@*{WkUsEhL-1|?hP-XcvFQ) zSslP=1sZRUIdz=(TJ$;cas`&?Wcf86C$VX(L30jPz~@bGLDIjQ*s-^7sLJ#|NjY}vg|b_QaN*uKOFAI4l={oP&hqKxR|`)&)MFupATE?d$u12>{8WYZfn5c zwV<(kA4oVjK5uJ->@e?B9#1AX0I9xBoc<6${qDZ|NS|p9mhu$G;fO=;H1}+TJ`*6 zFfKc;dCQ<36Q^vcKG4Zxv2WB2C*2Pm7*rf)yjTXqQ&#gqKBCa)_nj}CNDZyR`#$-y znm{jSgN2YID~xL1y4a$lN~AS>q=d08&|8_mM}9d9M^5F>C=VVWGB_{@Ak zE7Buf3>#)63y!pM+MeG>}n1FYe|L5x}BRKlmhJS}xB&^525bC<{7K%r6qWR^* zpr@2GiOJFtdK~GA^sJE(#&c)i!rv|!z9Gx_nfWkQ(tO>eOeKhm`}E5_s{Vt;he>}6 z?R9ZE4E~EgxrzOC!3xLCo1jZDQ1WxZ1az^CMb~kAK>x$7UXSzANDS44?u}4#Rf2IhQv@vD^ho)xo`YRSo&`=s1>hnb z{ZO=?Z=P-zdOyE3Jj7dm0+8h=2AS0si!D%rg4;RcIm z+E=Zy4oVj3*r{jpk>n+N)m&yTZd%#1lau)gR2q<)tXT)GN<5|;=el8OhZx7Zk}ELE zEBA{ar3xEo(hE!_f^jjbsbcee6)w@Gv&-rtj(Z*A|7vRk%O48eYM*;!9kukaii&MN zudoO;4pxHdjYpKKZYJzr|2NF+DUU0E_g?+JbO8qk2ZbIR1;7H+jiPnk-&oY%McKyzpjhhH@NF?GDgG3MXXJ1h3UKyC+( z;+qm|@3_o6Cj1&kSTp$>({pq$ZP(D=|`rtyo+3J}9&W0BZu)7G@6@F#mI{uzCDx9Q@(&Qu!_w4%t1papaXVu4*v<{P$0yo@rz=eQzv*4<}m5yq9aUU;5U1JbbZ}cR-DAKBPJi04Sz%5Yz;3JD?YJBc!*(9r$yt_#vWdit@-e5NI|Qc=5odA2;AKe7H!qwxXw&cA^$W+P zQl!nBG+~0{(aXa<+DNWpjPFjE!#)Mx>KU3fOjY7%Gafz(GnfCg8=rp;!_QNXy#Eq` zX>#={d&>`D(TB++CJLRfaF?!?;;W90qKzyuXEwL%YL>)!cOC|ItEpb-;Dcr5a(>%u zv^XUDZmj+HcJ7d^zkFk6!gb%-!!zAnFquVVEHQimMh%?Xc4REVlA5C+ck3P`b$nQ| zjeA6(Dq(u`OhgMN8$55FSV)Aytx3x6+m1LKZIeFkSOXLCuJ0D^OyV4;UUt%(uMqiI zWXQAlD)cP8juadEfYX8_nGW<9Fyn`bJIgLIOmXF%_&S}0{Zn~%N6J6KSkh4&pJ+yi z_T-Q_MQVZieYoe+lnhqZ&y}lv7{I;*EJ)yQ z#JLB&4ad^Cp_1q0i#VSiSS+pSxDv7(yx+Qf81pCwvYg$gq*qJW?gb`x_l0n>{bB+X z?%Li1((-A7Tu2%U%a*#q2HmwZX=d`vFhRA|CrDofBV5N-U9&mS!?}doYUf#O>RP(S zbY2IC=0+GMMK)m2Ak<~@Y%TT+{J1|@fkfK=Um^7)&mbZuRa4`AJ65~9O0aZjL(Gl| z)|1s`SWUideK_JH&Il;w-ZL%4*@)9Kk=vF%q?Ma7$WjE0FaC7%SdxL_|0wwMM`0Ya zgT&TPEHEUOsP|Uf7R!J6Zbb?A;?ViInZ}_bSQ<`W%f-kDokb^7#-hie%iqZ|kDCvB zOfz0M-=l_J{K{g`wHJnJ>`8wU58&kfw@*E?642j;4R=Jp#^J*+)mh)Yz}At>2N!3E z&`LK(O7v61v1>-p8;_j8x}U1t`i%uRDa2Pl?{^MJ99&W|cmDq#w_^X*mNg*W+SxEH z`V7gm?ZTgSZ1cI-;X{1);xTXF1))Sn6E=Gb3L|*ru*xfV;+3Bb&ihIT9qy}#(YHaL zY$(RKC`u7y{%Qzy&^!BEt?W>QCx&k z#)6!>hljEM{F_{{lPy>ow`bysrwoz7>@$twA$4fIN{y9uG}v!*V)HD&JPte#xRfbK z!KnjFS3dh>;kXf<;p^|d*!-w7EUjx2R~nD&d!IUp8?jHn9<>R>f)lB_FP5or;Yn`Y z+f`C#jw{h>J9e+LSoiTKu;8)lyTAe7&(hn0nXfkE43=;Jx^WN6?i zEEOLa5868ktx1(S6Xg-usG8Eh(`G;B_gtQQ$0CBO9uY&)1m|P4dOS2 zct;%iFU^j*I0Z*^>ll?(WMN9>{AS2RBn*7~YRgT37{~YTW!kg;4!5paaymA~VQcfV z9|s$ZVA)2~<%90O?Y%`kdMO}=K<(9EmuYbr)=UohJQVB0Deg1ugKw_Gz^!6y)nOqR zvTDi8`YsCOXC;{1?}JlIaVtR~w{TA7p&S3_t1v4YPjx5w2DUwVarWh?4{o*SzF=@L zfW{n|ARP-XDBg4O`~lM*Z2mU+BIH>RMy>{w+%P=@vsq^9RaML|F{kLV`dJjeUyUp2DGPWK(p3tRX;jtC|7+d-qw+iU`?R9U|N)up#{U8LXeQuj*Wk> zyUTMX!{{feEyD0DkRBFT1`CwH^oT3lfiV%7f~#^}83{z{f?#Xe(7&*l`^rgCV<*l= z#xfTi6~*?K+~?{!UgOf$K*J52I_&?g+VLW021 zf5Eb#JBudAJTAPg4cyvFfT1^!>G{o4VbDXs{HBHs%yD_$4h#KB*rET^+`~ zZ&IMGI8h=lZ#Rr&7Tpv~Jpk34Y*%*#hht0;-}3~bA`VL@9QWuyjLl!Jc=1?v5~%in z5qkAyd*4WX=D($MWc&Kh35bfT!C#%LyvO%^gLZjxyx;6^B&ASzB){83|G201csLub zcL$o=^yUKjUjJv?YuQMt7LRD`&qK`En3y)SL2{k#_zjaT=+F;HH)5Q{MRTL?IVnOo zJoNGM{XHuL`lH`(CXVceZt6D#(~@^Mem7=Z!QL7BM{jWi?B<2Go~@vLane{rm;S&h z|09w!^cSL(C|G~dqk25$BIbTpc(XB215@)xlCS!IA+f>uYU0rd9Js5tUsB=Ec0Rmt zH2>;}rHbzY0+#Jy^grLGs_ac%B}F!JD4&PakAFWuralbATUuW`vkP(Ii>3XvLI?he za+fO9bb{sDMr%jXKU`Q56Hg+lL(H9>)Cr{*fOx99;XLsiHdD$NJEj$2sJLyskHHlB zCH0in^A5lWk;-2DlmpJGQJoq{-uAB+>4-~2Y8(s~2n^u9g7p?dTV}(y(DxG=vSQS+ z^hl{rgfUzBX)UE%2wG$1wNKq+ zhK2z_tz*d-VD9?{x4g*+_St37DOe6b#Ffigj83~@rC9Udo@1f}hARi0DLyf{C19&? z#B?1CbaeJwht*=kg#Lit4M!yHU}*pDCWNDJYn~6?Ig5ScPB%9{oWr?QnqzOT9LJ>4 zv^6e|6EJ2b!gb=VFj9_uGVN8ffv&M@YccHmkTR0c_H+Cf^oIsyli#o5?4g4$328Dg ze9`r#A zv9=IPTZ|;*?Bt^c2e4t(jD5h07v}kbHzM!$!#u-l zb+FaG>xV8YH!MvB%Qc*@!qowV-uU1$Sm2@^T>rQX-E!1HAFrO@p4%()ZOWC<-yM2T zj{XTOX(&DX>iJH&l{!07B3 zXTMkvsNYY0iaYTWw)>BHHW+imxP7@IqihijsU)*HCjG{Wv9ZGs)l{MDBPSKTmMadI z9r$v8$PThzur0VFAC9t0&FSigBI);OoA5j~=o~(}RGIVw7cA;_Nb}f0>c8xp!sw30 z(Vvn@4-K#@WKlOuB6UzBs9ODOfQaPJU-);?kfXNUwA>5NF9 zFe=2kGp4?&%(tNNG_`_Wo)h+GMMVp%u;Ex)`M2Hw`QYl4y>g)~Pk=OYLuR(>AyOLq zgHkuoLXTBjEDyNCa8cHAB`+at9sVL-qcI3G$~Ie91o*dqf8cH3x%)8qR-HQIrxC2Q z&v;F43Y#S#Uw=|p4GTOI z&riLmhZ#=}k+6Gbv6;}iW6^jHNpC@IYeyh7=nQ?j%$kL*N5A~O_$^}FXKTynSAXEV zOYWxTNkbydhhu$e76q`Rd`a}E&J^@fJA3W@u@9TySNkz}abaI{p7512H(atfH8Nsr z0)06;^SZY(ut|HzFU=Sm0yRNj)LyX!Y?Y|GWQ)57s>F8#Pkkval%{+As=?-{HrE8MG<+@1%z<+FcjseoLS z+CTH63VWr-nH+Z#aH4#<`xD_m$WePMoGktir%JBvOyb|}YfUpBb(dybP~nWt z!v?YP%}lsRkX{}0^Cwd6tN&3}vIdmk={G5F*>U8>Z6UI^1uUpjefwf7it|!Nv^Sf{ z7!{Mg&~j=RejGAV{7n$YBJ4>LdsDG$>xhIK%w+6{0dnhQvFsN4SW9rVmX(EPFTr6 zcE1!=&=pr4T9{8bcS#Kga(X#rT;j38aFXT#h|PF^^PW7SPTf!Iq?l=T7~}YeNOI={B}u*3HV zayU%L3*K5k#Z9DI(l{D_k_J{X?)ozJN}!E8uQZK>4V^9uV+-&^IU*+LursVKJVXQ27V{N1@*_hC|dRHf_* z3$*r>EbOf{!L<{MBveSj3Efp!H@pXZk~xxTKl*S{;iq;@RSwQdwXvR7KMMsx<&5Rb z`(f5q)=^z79Y*EGdPP1ZVjh$73H|{F+zKyJ4QNcmZtr)U7bBUl=K%8~k@hs`sAle+ zeRdF+oWsAI;Vp(LZ_Z$)Ef*Z=;A_d+*@97mR0CP6X*gHxceF=)4=kOdv`Rflz|DR9 zyM&%-0%>?8QU0z2Zhmy&qQtdA&((Gp$x}Hnko)Qm-?|#Mp7+o_Cn5z4ZaETy{{Xj= z19SiUr-&ZycWl+}8^U=_E5%O=Ti7LbcjvB!1nAFA5z`lqgynrS?^`>~ zw{t1Wi^|6pJIb!QS2o>&?z$fJb9wi0#J#@q&VPnDW3uybgV}2$eYUn(W0x5Wo%NIF z?&5)#&owVNAAZ1?0Bh>WoO3XOBj%2rkRq2z~Wgo=D}W z{Mpx98tdjO>jPY~VMI!`=S8DEZr&>}osE#k#vc-?_kS${@xrb{LTwSbzQUe^@Fzj>wtL_g zXyzSxZhzSg8uqP*y|TUr0*~9( zZ%cAG+SM`CGNuVftr$6a#BfUS}-zP+O+#BElye_O#KN?!UCD5|2~V<;qs#91G;2i9PMyFV#)fFNIf;3&AMj+ zhTQpH&7QNwItz~Gy#LB!{?^#&+dy7ijr?}*Z~G+no#|hhqZNaO!*1^`OeSJ~wVSSE zPXR10Qp)J#PQr-z{9|skgg|Fr9qIW+z-QL`B7OG4vP9XaiWDalmKHIePKm^}S8;Wx zc93A1hHAuvI0Iz)$c=mde_ox{MXTSMZm^ncXw>hg35B{yXT#2qGm*zfNC zrs0~fw(r-IIp0Z~{-JWq@X9QZm7+d1c)f<qtqMHqIN9l9ON1M5SnUv{5qz!kn+k4esStn76<;Pk8)rlpy0r^m{`MDJ5^Dz8`A zn!De>KHwZI3F!R%JADU&y;!xmv)QIPX`lPZ>e71N31WkCwt`JX~k zXMvPr$iZx%1O3UwJo^0I*hFf6fA~ZOtW>c1ap(;ri8?!s{T^cTo?``4JM6K+^VgGf zh=UGKllo$B73^PUsg0)fMsg!}D76U{WHg9~hgB~_|EkH2ir6#Qnk6!LI$42kO=YsjmG>Gvn!?RzMR z9pj=I*LW_%P(jM4feKBW^m=imF|QBS4(r$3Kk9&bhY!*rbB|#0=fk&w>;*U@V_=(= zy$YN8J%>Kx9~ikv9hzx62(v#AEC~<N<`WY;dp51tTKmyix z=<|3z?uH4CYVws+-(e}y%YZl?1syUwlVmQEaQL7@Ov!ixto+w~Wu#UMrVA_M&Kn2e z{GX$18}}c;7`GO?`0BIL$xXe;HSpvs^4VV_{0R zSfT%g3N+812^;lLh0$^?>0236*k|tEt7$+4GD8CUsE09*%#HThy{Lq;4Bn{Xhfks7 zxnmkHRWxKAFElBYy0!Jr88{ zmmgDuogtq}GxqoG2pkdQm;u6ZXdQVB3^`6%Ufws|&wmyNyYg~xD=6Z`ZsCu_9|v$T z#o)XZ=S%R@d!J_`(usphxKe6|*g`Cv)@Sa)`s~C1u5-uX*jz5X+e#mH_?cB&T=9U# z_^PcBDJ-zDdiT_W%V99|bmQXZk0UVX(i=I>MX zBAKaH>{>fN3|CTR-gB+QnY~i?e|ZOi@0pTj;G;=SEgX9vRd5z z6%~^C^=>)dKLI_rj5A-nbH={YZYRyfLty;Q;OFu8@{s=(FSyxnLZ?Y@Lh4d4wCpz< z{uQK%%g^WinTw9$+&)rSO!yd)Hh(>?VD=(`VYB62#9lR=ap%wumwO1CcB)xpnWhsQ$Aha{>)R{HMb0{AdlDj#D=gg@p~gU&>e)rY41}5KeP{QK2#N9*CZuZ#X z&Mq^YHtyB$cL{kv1y69}}Waqr8E zRdJ;@#Wv^MF39z$QWcuy1xk}rc&gk%AiW}GDI1z2W#{>-T$%rn*ld4c&#VJBiYMBw z`r5!+?m|hyI${?JI9^NFgy`8!FX1o|7`7Z;Rb@Gj8}F&s;-5z%g;HW`_DLC+4$SdQ z#LQx!#=3gjLn01&`50~NoWqqMryWTjXtC%^X;B|&;S%9@L4-9zd8W68p%oi$Wqp6Ki@&mvX>ozFeits0fm})mGVNvvB!V+fDA{MKJH9u4L;I1Ldj0 z9M`uZaAu@b{EMRJcHXEq#4=65N~dcj>%s&^N_+3UyN4Y~u}q3P?*GHdDJ$i2kyTtf z!qFz4=!4UYug&H7`G71OcE=@e1A8y9J$^M<0bwO|lPXDfurcc6HBw>#uCd*9U;d^< zpg}gOk%H^s%gDw*;rI+!#U+=%${XXL<%Ny%#Y;GIO#NJJ>OGh>3reFtE({ZC|H(%M zr^E8@)h9LUZm@FybfL}cF&K9dd4FJcHg-3Eem&)tja9!MX1Z6YV!M#&lu2n3PS!88 zbhMs;KGmD*k3yty*(ucXcic6s&yDnIy89N2b%V5Rc-z4{#s+=1d{!Iyna0~_m}cG`cs46AP=zKs-L#6g{b>z^dOA^pLsVY>7R zlBDnP?ldRDa{VzoC!rD`+pDzhE7X9zhg~MbkNWs4f^GHHw;-s$z{tbh7Jw0#DfDi$ zZ*a-S$E1wyJf>FL@o>rQ-{zB)_3*Y>7&H4p${{ZzIl*MfV&o}yPAk4ToMQpS*@=Q( zUFulJWi@RoZUcWcOvaNA{e%thQj6Q7$K)-B!Ie5@Odx*$C*J%TDx*JGQ?2Vj?cqQt z{SI*~|5eEJeRiAAe6N=bxb4Jjg3I4K0>`k*gBZc4vj@A}j+@GkheF#y*L{t%EZAEq z^>F!SAk6#<9i{(6h0WiuDBt#YhD(x37248KzC0H7KuqanMVK=hHfBAr13Tk0TUX}DKxusV;rNIKF5P?P9Bbl?q|4e?N1JM)Rf_bw zf$aN9~wKK2r0rwh;(pUxV+XpbJ`#=AmR+}k<7 z#Z*kwhKu(Vj~;tG1@(T`#GNuHu;X-?O-<@PsNoK(QQ$Me^w1zuwTBLtcbIn{%s38x zH*#mjhooSWo8xStizs%zitq5xu7k{|9Q~pEIc#7eKcMxWL=xT0FF!JV!J^q$W;@qc zSU%-{+kI;u3xD1f`}p59t|mn4NG@|=Z0)#GNxdKT55#FzR;pu*7sH?BA~RT8$Wmdn zD2IB3q{RKs;ZW3gU6c}$gu_0|Y~Q{#VePwdC-Hn?Sc#kd@3z1!EYT{`l-C`G=Hp+- z>vv57`O&|lUWdP9f56j_a{*2`ajhY(=aCD9pS?&;es>sqr_FNe8~btXj)`(rJqiCc zUe0~yc@ZX5vROIL`vYl*O~R&{9u#E8^<3g!#<>tZ@q2a2IC}zq(+lZfosXFZ)qi9d zeQEipNvN7Y-7Z`4xGW1hTe2{_%^%k09)Cad*B#4Tgz7H+96+yCVj!9v0rGd1MA|)^ z*pPi!oX?E|C;yu~NuDpqmScqn%jC~M=HZoADWzr@)pLuf;?BcnrFt}LKL!hY0gUuh zM%ZxaX7YhiW}MHu!fnI)8aw=rHr$Wt;N%yD!@8<(u~qttVwa;97I#Z@Fuw{1l32^* zz>s|~9Ga0WVgCgtex+&$tgB*GqUlk0drc@9kX_g{o`AV3Jbh>WF%forE?8QbJdYW7 z68V=zPvT&mdfWbw|IqJ7!u>y6WGuHH*Qe!}!Mf*J(;YK3*tbh~uWQ~g`dFSdj(oEV zN8hA6ddQa(Y0E@)!i2`4IMJtRYPkqHPd0Ja98ZMF-^?GzC23%WM9Z4TuLWzb29=&w z^TTQk%hi`{Pa);=#WDBfH6YzxB(zU(l0KXp2hWGubjFre)&jpf&`L}k&4 zV4vOBb}{t>*h0H`=hZ<`ShM55b0*|7l60MGO-Q?Oeu0%eKaLaTA6jIN8yte<6_Ewi zrzt>=E>wK}AP7byncC$3T_jNN84td@?+bQV-#A$2NCU0PN({?CwQ!(k{mFBY6l}_I z$}&pL#IfSB5{Fn_Tgx3Sk&+JrB-8yX2sxfDGvhH z=I=UIPQ8wcGrA38Ugg+#?ab+&EujRuw5YbiBYM!rX{bE$mL8T4@XILV>EYi7We4Mh zFeLpjHH@V3hxTK;e4g&gg}&408Bzq6p{3h}UN&zK+uyMyP?C1Q01u7!JAN1JJ=s4e z(T3O-KYwc4I}D3-3f?sDKaQh{+|++#U&0h)a5u5c44QAA4l*YG~s@;7y>so>bE?+IL!|W4{pC^0O&4f3OTJ-jqY6V*HiS`EB?9&Pd*eSe&%xw| zvCBph5w?Uu&0GldXa?D*=XmTQ)UeaRuKq;Hcj9qWLDD*-@? z$oI!AI_SOm)_mw_4))#OJs`I>00W`-()dnADELl`sv~O;~hBP^0p0}1b z`-J%TTYRIjMSGX&fOQ?p78e0ZG?gUQ5Rn zrWxXUFK5}qw9(~N!L8e{RQLCY^XGlgX0LcAm~j&dZ#9b(1;j03nxi{zZESW%zSWAOW!uE|F=ff>o<1DW1LEDCs>e?`(0 zW-5;KH8Zk98B2%6{5k>aUL9gf@RY~lLV*jr?6qMcD(mf!1=a0(9S}2kIF9XKa@Yj- zKF7h3exdu9b&(X}mGj(r9_vgq47P6Q;#{m|>(H)oBwL4YDu^?{AYcI(pnwsq3BxA<4WNv+-$$XlUb~dy@HMF zOiV0T^!9A0Sxg_KN6wwR3O8U;>wA1xz&C89xms6RZ-9eT`Qig#g>b>I+G)R_w<5 z6kc&A`v0)n|K_+)empczhNQ|^l;SWi=LhS1T(DR%;$~p}55^Czcs0rIgt6dDZ?>i% zVNL3P{*s@}aB%v=!#%Q>FqJZtU`uv@VFs7cV7hFa8RXP|u9k(FBx~QCbBBPW%(J(_ zS_*rvzFKls{(!Z4CGB@C2}pe4e&k(kA@-_xe$+~tg~f;LQ5U1*U~X-tw&w6r9GmhQ zxmLREbH@x$23p8Lx^x0{i)=eiB$XNsfB1s4ir=REuE=hCnz#HL`d(<`)48MD^Bbp( zH393e5)X)0+~JHJI`}iVP!CnNN%DmcIdNYD(sYl8HL?lGF>Ck zwBylL&D?RIxYh~hHwi+u!ufk`VzfAyN0k^9EC@~K!~dzLkK$}=GKUbAIQ9;z2+tn< z54%qBiX06%iv!9(MoObkA;nqg9gCwN4m9I|=T~>(65W{l8P!B+KB6UEY2t`;`l}Qd zZYC&gviG=)s+n;ma7=9m3$v-AF1xwW) zsbR4fv28Z!+|Ey&P(?^;*(WND;}5)KcWaj5z_L9LBbpJ09(Cy)Vzh>- zf~0`mN!l>*^l3U*xCBh{%BckKHDLYR=4reAVn`lC>G~^j*!*^O{n+d)+z7uUt2WLA zOY&cw{uTN_>)WEecd1*!acf_Ksm)VZ4cYnNeSkjp6wHLBbZBFkzx=xJm;#QDF$l+4 ztH4ywU8CP;%V5iO^~>2V79{J_@v=XrR7I< zwCGPPmV79kn~}Eds{)!b*Z+g*l*bo^Nr^yudRnYt;sa8+{LhGMo&oY%&jLZ0Pq-u{ zTiGS&jm4FLCB--Y;$*%+w{AiV&b}G=cFunb@(Ze}FQ5q6K1TiJ+DK?+Wy<(4JBusL zQvrLv{lXCe4OPKUr+}0qYU>f32Q@o+vyYC;6KI^T3fRCTfv(H;qW-f8?0(HABI%Qc zJsI$T)oT=14lX)G2)xGDFI!y?Lo*=xF0UrP?tUC?QM{!;&jAZ9cGztx2WvAng3lkZ zV(%02<-T{cko$*OO0Qi9hy5F9eHOcLsE(N~A}I-`zvQ<4T+YR|U8Ns8cYelI3uTKp zqjNYD;ohtMoFAvT7kenT)3BC)RPKg+5>E2D<~+TzU5C5xM?UO+hHHH8fA>1lL$8Uq zYvKJ%Nanoj=38|M>kCh}H~6GMbB}~bnT!tn-MjD!m4c956u9f{3JF@)nS!JJ4{h_M z)Ab+7fsNN&3O-oe#FnpT!Zmi?fTDN*342Iig~5Q>K<>E?Y@BYXzQOth>oXGRLUu7> zMbQabNwsg=bEj*ze(Dvr8zs!>CWpgf!(qCV@0~Do-&|W_@EQ#D(iQAi9Nyml+2Mze zwZf9W&X)2m4s6&s_aj#OF|N*}txhQwLl#xl=||LngQC@;k5Wrv*-0+?dbTd)_-Vvn zkex+}qxOQ&(Of8J`Yw}MdkMQIBpdHK*ZwwRqt=lwFEnvE)*$!#5kHunVq*_E=8Hu6PgYEa?a=d%Up2#D zZEQVmXC$8QiDa#DHT#H4Y~D}uW{nrXoD(7at|}#%c+B(7cr6$7aeTb0m?MnY^St=$ zq&`H1^vjv^dO+Cne-cxu)7 zA2U?oHB5yl*8KD&K>t74YS&&)C|BLp@qk7e2lnsoUq3PcWBxjmc0&?4D`9<-6qJE$ zwW3%Kb zJ4K)lpT6aHx0y)KH2YI5d=4xx4_BFfAHrqcuj8ETG%)8K{M9d|5mr}2UAjxRbL!GA z%ROznFkSv}a)E0ODY|zgUKHozh?Lr~JDN^NzI*hYGpqS_-+j|)^)Vz;eOF58x^0G) zf9lUV>oP!vVwaLm#Ruq=PARHCc^Au9-q0{VGsICh*7f7zKG-2BxX^gT9k+;`HX0U7 zL>eNa5k(&@slN%w37r(<(R^JbLd9SI z9Xnus|2~z|;(T@OHKx=y)eFX zTxwp27s!&98kUJRFg*9heLX1~yZfAjtxj#h(!DKV;e=n%f7GKVf@T3rlnp8AQ;m?M z^NT%9e!GtB#aElJX2Vj8eb~!WchN`gTUd?UEKDhBTz>EJ5$vC+?2Wv814o4}aE)gj z#J+%tlSic$Fjxxjm-gJlW!58__4muMVKGs5HIf8#pBA6!K6-+~#i3_A9XzmiOo?%6 zdN&NeotzHgnZSjLzJuC-j9|U{R;9+Q4fHoA1w9=57?{?zv_QYixQ~oip5Vv~Gd%R7Eh3rfvNg&=-aFLl^(t z|M3{7XiR?nrMZP|3kO)KjWuETvV8oAiWe+GHkeFS;AD-hz3<*t7@joNYY)nW6&H11 zgL}-_cCOWguJbL#rHWr*zZe4ZOpiH7uh3(!%|W z4F=Pt|GDNUV8W))CBJz`SW{M$&yg$wN*b}P{*F2{B?_7Uz7hq4ITF6XtEX@*Wpm7H z%N!e&-#2J2x?)THgO~Z2w!NmQMd60L3Fc>B=pa1K!z#+5SzO%@-N)T3#pK4|SLNH# z69rB6>v0-dn|IKVl3I{3L^jbt;4Ff zd0g4WH;}LU^=<2W8c1=Gje2_E9d_&AKTcy_0~LpUFY~sXhR#7XnioocAa~;24wGOF zi2tPVPC`uz$PRU4eg+x@nvRC)LA_^CzZPCu8e_T5`M+fiD!2XQ6u+JG94CxiL<4oZUh=lCf@+LRajP5uKDju7WPDU>2)V8Lt<9)z9+jm zA>WACyV%nVrk335?8xIt`TF^R@<$FJ(LV@f6^q6mnI3nCU-2+ptTw_scoHTWioGuP zZozyv-@U&)v@kBy(RIIc?15!)Q+nw&!cs5aBk-9%%ds-RYCrL zbS7!oCSKL|E?N{?^Sc8)F7!adqkpRP<~>j!`R`x1_8lBu{p?8+9>ENAwSc$TR6vsB zus?434#`fRM$e^(!<2mJuTeVz_}8vf9Ano4WAcZeJZ}F3#4~3VZ=@STXP4vkdxN6b z$=wm(W0C+BgM!cZ_)o%sQF?JyP8dwh{5)74_=2#zuD!Va+Z3kS{$r#Ka)dGA{VPR3 z#<8FJ+U@5z1aQRQF(-RMFp~XtNO)Fk;*$Gy#^*1HIDe7xb4{ZXRKI3n{kF!4gH~Zd z-JXYu)T&hnM*bLL5{J*GJKZ`oMoRDy@5IA2O0&&5w!_l%hdUo$vxa`hGt8;B?{UPm zVyVB)8fMAYey3Ql|NnU-`34MUka9`fEn7So`Uk~YpAk<(Ighml;hGdom$;W?IR|2^ ze*3eHn@_O8{JzU@*=3lWW6k+@sSgKKcZ{;z#lwQl`0Gset4KPZR(-i>5|Xm~1+KMI za6DenNb9Ho`t1>Qz3I}8lfS7V-FnAxa-WQ^(*EaA^?R~B()BX-hq+wmvy#EN`4iV2 zr0Q_Etl-pUupIPR+;Eia=!A7c`nOjP8pE=AhezOZdd#49-Pj-RgmncbN_(=Sv56|i z`1SV|%s<64a-Z!Cc8Um`EH1RiL79U14Anmv!=Kj41`aslrIlDdJ_s|b(vvA~x}aKg zzetqvSLkOfqhw~OK?SE+AYD)p4wQP2hA2^>jp0(jM8F0N$_)DoHKfDL$XB0n`(H4V zIvrcKq6AGLx4^=t9V5>Bp2@e(!1-eNJ1cj(aOO$wtvnqDY`=I-PJpOGpgksDCMH9` z=FWGdN6)!noUo*KfBHWB_I_)1iERevmW0dfZeIkFMlszU=62XBj;&_n6@aB9rzyp{ zrci&4^@Jtkf3Q}1VB*K2Hf-QBT-@=^9EQ5AcgopKLDRnG*y?C)SSe*lk*i;V(uRWW zb(a7f@7aCi-Tph!@2@bD@L39a?m6D+QTM_T_m*tsFRyTNE%02_j{sOY9?2n3yb68m z6Q`0R7~t1~?4!GNFW}f&-<$_U1+e;NWbClZS6sMzJb$L%ANmyc*i|z5ZeK^^fUkco z&U5Ve{$ODTkS_B*|3140T^W^hw@&b3T6J{(5e-&YI@G57ts(<9bEJ~qW{Kf^$WNKt z^BGWetR~a+fildLhKIhqn*zm$%`3?6v9Of)ghlYsIapF{sTnH}g??$t##;>DI7g*$ z%HQ`shE_N_?kvd1sHrNd&gLI5C&0EcKz@k*=k>C(FHPa>CDkp*(~;K%h| zbq(TWV_d->dl>s)VauOKtIosI1gZz_s}b_GIQ;nU#h^X!pzWgA)ZQKK&`euNQu|to za~Q%~`6&)aIo-3~LFaH`SA>aT))LNYa{scEF?y!!Vz zH}Sv2dD4a41~8$YYIgiv3Z%zGZTb*j;4nqzflrv8;q&7HCT#93*`oHSTXk=4{QAkE8dRp?zdHAcl1q;%LVL2 zDoN5?jVOL3wZG@`Iz)!f3#TiRzvyD^Ee}z(tE@!2r?=L+G;U*CuSrVpj&1JVlwSE! zE`%gEWfvaO5yFls&54$#9atf0piSV|=9bdOvk&-A!CFD$x4D*gFa)hbT#+L{8TK30 zJR*!OVKm7O`93gNy%E|lpMaBr;ur2Xeu2R>o+lO3!9Y1>W`6c!3iv%8?qPlI3w2Mb z8K&f>ko5NAt@?x#9K4v5$?owLyKdXv+n4_qdn2z8CJY?M)Sfq(xNn;)npp4ScNLu8 zDA&z?MUR-n zqRpdYUx?i>#4I81_$3zxyB%FyA4)>L*Rtf-wj59@1bmK3j$pk4*%y7@wNUQ2Jmwjl}Q!h@XxU_pKnKDO}qc# zuCaEUy?LKSWNUyx#j|zexBok&5E$0k^?u{VWM$Ohn+K3|7;C#epM;(v9`AJnYwUi? zYF$aZi~~_ekO6VqJ1f0C3dLdibla=M$vv>(Qs59Q)Q=U$(>JEsn_=GJ#yQoH!_fIQ zMZ}Na0jADT{DX3-F?n`Gs<|W{CvO_3EnB>Sl6N(NLD$vbX}PVup!XCG<)3a06)3|Q z=|_(`PXEExT$u}bdm16{xQd)yQ5?>AUQf9#&WrI37Wsd-`CMXSk1vF&zh;B<7Jo~ z?b7b;Tng}J*P0{HQ=h#!?dgLXemNDn6?b7|n)T)1zI0r1zrJHlHv_&>TqS=zAmA8t znMi&0bsQHwDV^PT4JhsulJ~&&`AZ4X`(*FoKTFwaY|kZlge zekO@-OudR*Z%_TZytIP()yMX}!)?#&BY8Q59tUzZQ`y{F15SHCcM*PqIL7kDafK%r zzsHJkm3Ku$%T3eE_|y?vc`to^5@!Qj4enc8-J{SNyK~MZjvHEn7e824I|2DIbLy;R z01jE+ZkTd?0&~w7I`Ra&py|dv7B17{*uoSy^+9C<#{7vm){gy!cwLo9?MgcDVRPvCsdWn5*`YQPsbg^G~cIb8WA?QlY z|M_wt1*Qa-uF0m)Lc#TjTGJ1Husr3Ezkl2V=5O_?eAl7@%5(Z@kMs3dnWCXno)CtE zkpgEA4VJ?COVh{*lMEPEY7m!b2*<`VSB9D>V%XI6<5ZUT0jzbEbf!9xg8e|JewTMA zb|wBfH7=$KZ(drxy?sa<`Wa#*Yv~)e=S8%SoTv#TiK{G!s2rg_b0Y1r2n#Hoy)O1a zgE!g6D7|DN+MFsU%cToD<79nzCu z66voHsajJ!D*|soU*|urI6g_7tt*VCzad@NOr3!B&2 z-tk)%BKc3`l6~qoAWtN7XpWoUcm-=_r5)g`1y{yNbq?t2%j&FsKZ8r*d}cL^sW7^~ zq=@BH3=Vj*d>!R-g`vC{)9BD2*tUGMZCEK68@)g7O?zjH^DUt*2Ck`)I#jjqw@o4} zaBuvMP+5o0n}%xNTA$$HQ8uRP3_I+-|3pSnBaTBq~QA`x+%wsR^LX^O$&_wLS7 z=Ji-wyYmH8nLjoqzFl1+b>iUR9XzU|7qKZR*4c~W84eyxS-%%>3hG`};>3Mg$oiDk z@JY)JCcLZScj#ooR(o0sJC_@z8pb6**wKLl?wgVy1Wa&XUc%mWW*J-Ngp)6RaR;*P z^Dnl$w}2{TO1b7`O7dSgIg-hp`A`NSks!nSB^WHK-+wF_{)$fOyAYZWqr;I zb#1Hp13{LUY$0seT=*9o^@7G9*F1!!J;GaE{yea*&!zYFKLMQQ*~x=ln>a2b(Dr=m z0Yu+^wz_Ma3n$VZFpFUg5<3?)HwbM6Dk`T>8*fFCRJF`0_pb^_rhSo%q6cy9N9aQb z+Xbxc-|V<^>KSyRdgDlut&{oTsL+kGsu1|A-^@9Wu>(N0z_^<}fyw$4*50 z2Vp6>*zyIa-GWrtuSP5w*nxpO$N z&~(!J)@=fHas|z2{~4HnY@!rV*bZyQshj8n^?|bRx^kbPBMj*HrK)h+16~xBX^BC@)%C2kILa(@a>sb;{y=dqoC)T43XXV3w+dNpWN&bILS?=!Y4_a$&w zAgpNL{>QX>4?6bhmDiPSAvunDW9!#WIoPEQAti--Ne>= zhZ^r3J%N4fUjxFE+F;Oa^L0*45&n~lUJJ6CAq*zc%(CRCuk|YWXoENuDFUpRNJ=q}43+ZtQ?D1x<;_vp->2Le2lbj71_%1Fus1 zbqSm_{43$u#)71+`?-g&?85OaA1+2Nue&Y&Evy9nfRL$rZYi$v$@IQLDUEv-dwFf9`j)kuAm{ z^&@euT`4$7S8+~ACkz`eQ2($FD92{osz;Q+@I z%zoET^R#0hMi~X!`5o_u9==%jzAM^TKRv8_DbyG{ldX3=&b`{9%d*VIk1c7BL>Thlt0?u|4j;w zN5y$h!`Q>R6~5j-So%Xq*n~k4=2y&5@l8r#2gO!Rx_%h@j~=rMp4$s^tQ$KH_J`q= zlBl4~`Eu-N{o^bfqzsg^YqJLhPZFp`Yi`E{2x9wSQqjlT4%_n~suwR+zP%xouMv{6 zph&u5F;c4^N$&aF{qLKx-C_LU>^()CD>In;++m93uJIEuvn>eJ`@f%K-1h%+Hof}q zEdL*}P}z<5im)wD8}G2&K%r1lUwu|YML&wIrzrntZkc4rN1vuC5mY5 zc7KWkkMpnStoOj2O8f5VF;=J(y>|2zK@G{GJeD25q(G~@^gPwH7xu=yF#FKR3#7T0+D<)Nt{}O2}iRCXGU*)f*OtTx2ZxDEai&jVk-)O zg_DK$wnsz=RK~WJZv=v2v`yeN)wc+kxTN*(V1jGv*e^7 zB?&5u^o*9ZVz6sh;j018y*S-HyC*h~6{h~`8yXBLKx2IVY}Ioz)X_%YYkC)h%ZkFl zGbRQzWl{u9zGduw*6}!Geg{s4e#i)v-rl!cJa^b_4#Mn@$CNUSL6|;wDzBy^4u%b- zB6SZ;Z}aaApMBd8Ox57(q?b;?x(kn(^7qXVspXh5zvtiH=IQ#a&Hr?vN5Vtnk6{8f z6`$<1_+SZZ&-8u`$b1?73kf6=5T~tD9-FUDV-VT42jJ*){l7~hRO2lr{#|JBgN25;c{&Z4k9oe zIWPy^-yT`0`Q695Lw34jhkBqYnZIXuF9pKAFZo`4T?O@Jw)b2{#c{%`;jgDw9JacJ z8QiSRLGShR@red+p=(^&{n4pn^pimTc@q{GN#{E`?p+NNH+@Q9`aVW-H7cI|?hCd2 z!?tsKC6K&Vh03h@|7~$p=qg!)3`IC$0$C;H>|#%#gdz z_;>U8_tYabSYQ6sc05V}r{ax_$=)xq>WZ}u$8sUMxgUP6Z}Wz8B}c&7GJu|VTbwTu&`zo4$Mt8+Yoedqtc+o zs!bhc-ZtnZ|Ncv$O4i(&W*-23I?r|;Qb>c@%p^wBu>COFb%vETz!ysLo6~P!kirJ) zu8=>rxtN(fH1zJ#JzO82x_JChKP(>jCaA&^3`4)PQub2m!dUzzvY4wHf#%81Q&AsI z;eg@+CArNUoQoO=AX(hn=A`k{f5h*>z!%r8=Tq+pG+9sSzx7|hq1|^lem-A>?yq9p z$KQxzAFGJT!qt2*c;Cb0YPFT4*z2XqRh(o;JXYY3ELw7?@$-Ap%So|vH>vi56 zknkzc=|P$W44mKhSfX_Um+xl0T|7?2zZZ5-uIycckpVMdCC*G()L~`|9I=AlpoeOT z4vs{+Po_E*b;hvrcT%xe_yMlJpiwal`wWryX!OO(0q38vR(}8a7%HQTvwCkx{5pY3 zmh(UHDmt{^4S&oKsLDEzAeBTMlbjLEW9_(HH#+VKjDCH-s?) z>b#EG*^l0aA=YJ|hTJtE(SJML;Oc}OyC+w#*ImZ(wcB5Z?PkHf z#E);Fv^lieGh!CkXQqpr;nur zDarAJ$u|ZVY8hB|N(C6WF3dQ0LZuH;F%Q9o9b9{IFP> zg6Si!tkl7DK%q?*=R2|&SGe>4a6I0E1^$}*9%-^Tn-}Y=q2z;ug!;ip>QB+ZZETae zKNb7j%WvCm@xX$OY=!2FH&AhpW^5{u9p}ZKU9Ut3*l1Mget#?;^Z6z^m09(0ltsBK zA=4eJ|5$3ceD8$rXGS~jc1sYciUgewKORNOGs%aY&C2t? zU%Z2zzx<7<4zEGdOLi(MMQdz$eI?9HsT->!<(0c*S+HBE=5%JDKh6hdrGL?R2~)G1 z>x)rc(6wN>Me?iw%8w6suG-k(pg`pkW~-TC$(XhwcO9vf9W{bZPVhA*$P7% zU1mC6CNRfjP4D<+d*3EyeNx!J2Uo1bcd727hp}6y1Ai&KgSsV^xV9Bp7$}_1a(NSk z{qEzESDMek(CG&u!R3lLQ@~ljm0^i1lBbiSecNHAJo$Sbs}7K7o;vTkDFF?yPY5c2!NO4xZZT){q3rS3!6T9hmD zY4;qAC$%hRbv;C~ZBgy*OLn-*_btNyejqG=b!9T#(Tro(y{oqWJaE|d{ky4vY@7-n zum0`EH(Y{bzUf%Q*^mC$4yE|GA0F|Lq*9aeRSG zWlqmjmtSDFx`ncqi4Boa{E}oONAGqH-nZ&c&&EEp=t+~>G8i>XI+#&PfHAlI#&sh{ z5Z%{yf7O47OaH9fZwWTw{7hT+wN_f3PnGoRQ(%W_ISKWM)N?RKzd)N$RD@J>LUNDn z4IF5alRYe+2^-})b~3G@&}Y=7-1xW~oA%rhdU=BjGjq;=C|7XAj(;523|$Lh$>mOR zaI88E4r|;i*)fQtzRK4o+(VEeX+-B~t`3u_>NjXU2V$M8<~J`5ax z;`xzz50JEiHjTtiL%wKYHG9lT5 z%6&0j9$!i5HvUpkbK4YqY@0KluJ%E#u~*#;`!KA*{`=J`k=UvkZD1RE1ncu$13u_( z=Uexaini*vP=i(aIrDpPeSub1&LI~^_Z-!wt8c>f1DiY91omum8Mod%R|Zo2nqn;H z^P&Ho9@k|pBmASb@s!6P0=qA|dz`d?h64w9FQ}|Y<4OhlS%cdhu=MLtlbzUZh-Vfb zA+g`XwkubX%zmbXoaWf$>2BRPmVp%) zGiK+EHDGX|Ly~5u3@P6ywT@P^A?4D4E8b6Ch;;v&sU;+qVDj5%S!uIlFmQ%3`0;Z^ zSgdsZL^@cB#It2{ua`c+0E6q<2T6LcsCi>XG*}Fm3T5Ji4LD&UqbBvsQD&IheK(@% z={664$651hX-KK)BeJ)!!2FlnPVUrIILBVpU*!A?GuNi}9oCP7zl)t|hwD0Vcwkcg z?2A3vWb@#$?v7os>Ns51@_7)p{BpRmI24c+&E_`f;0D9`A}_z6kpc4ltJP~iE3oOE zy%VFOH`M0RDQIhWLTkLQ7*l;OR*e}tT@Sm3^MS33n`}>UxFJ|5)x``Z2Ga{;ysto? z#$KPb`?1&^tcM-Tmtf@i-M&4+mauB1D^<32A2$9hC|DVKVH@YBiKCC=hn!l78JX2^xovhKk>=1l6U{kXvJd)pDkZH zDr<WUKPk=UJhBA_n|y$sHuKy0Z7+*rIigOuvKwE$xvSgMx_|% zep{5|Z2M3@i@zMy*|~;D?dFC-`73(I_?MvI$1gSsky9`>8GKxLi497#4jP{~@!X!j z6`z+e%~*6R=8TxA3%1F{^0A~#!d#+dR*$71EI*?cz6`yP6sIMsa7hRj>Q%KZFWrO> z=S3B}IazUlX>8M!umKAhEy+iB$Ku3L6I&=g#nS!lZq-5efHH5bYF1@OU@T+{+|}?7 z^WXXv+)<&xoD}UX1{Hk*brr+gT8CL^?{}r^C?0{$Z$r;bA=dzv_V!c{D-`rxt4oCuAfH*_LJ)Nm&L*<8&nde|Ce=qO~B zf!@YSj}P~_u)W|)q{rDE7#FVSCM!sR<%Qgi=b~Xm8rMffFLxMXjH<78dhS~sJJCIS zKT-h0ba<+F8+b!kNlLqrl{5C++-pPXzcBmg+DOYjS?JrG`(<$>1~!+Y6;5xy$2$FJ zLE26an4izu_f+~H5-n1)Y@g%-g<~ts2AZJX$l%vjr!$s)<@5L`YzpJr`IJMNRWMq; z@bvMqYAAZ0_r(0oB^ccC%-LX7UPQQZsz>zOD$&JU`;1d2f5~mp|9rd&L^b`xA^ycq_4mGpNq0E+3>mkkV_Z2fM#vM!ByI>lry*{F*vAT+j!D4>q;E zH#?!!gRHjm<2N7`PaSa-UWAdkYvsx7XQA)ltoaLG8>klLUrg4agMPn8 zPt{OiNRo`-GwG59`B_zMq4Yhlu78(d#?=P84C*&5xV5o9)<)*qeG>w8%*`D_t(~x> zL**1SnGW;QLe$<(oiLR0S;U;OAOD1eDc6MF#FX$&clA(LsJAE!@{tRJX)5ZqXeA-+ zFYv!(HLHg8?}a}V^V1=P@X|MAz61JH?Mxq^vx77ThUCI5g8-Qe8r<>p>fx)1^u(D*fM=GbTQ-}w1qrAs2UfIYbSP)Z24~x>2`S?UU`xW z1$+AQ4n0wUdM|GW+g*pDc1>}RNWBUDt{smQ1cP8HTZbyTT>uM)a+H`Yd9hFWV7$&^ z3M{*&9H|De6Gf>K|cc-r#0S*H#L))=@7 z2evsg_%;o}qyXBTGaVLFTZwcNlc5cls9;gLLNL z_*+jtcxMPLjK)d;=?0UYs-j z)sJIuH*_=$6R`h`q4CsiKAhZp+qlR6F3kEXX)ru}wcVHXW|lesh>XXkx-I3zaqy+W z!4lB~=v8}f{PLtPk?MA%WmC_4=-}C3()s-ej2V|p<}<#>a1HO(9EvOCUMxH)7yAIJ zg}uaIKYNAq`DP|f^t+K{!f?BAtOm#U;`-j%ea8X&rPMmQv2EV`ZDKsK1*7-weXROP zg@Y!e7bZ>?gWd0i){yOf?a`=Fwqq@TRetJv;|I35_{vv6sfYn)K9Xq5?rUxPi)Cun z`Mr=UH@CygorOSSdq=G8Srm}+uk6$6o5ZMM<6yZ5DzJ9y;+RIKDh{=4oz_}r+V&XE zf6J4DQ0Hwe{;+QZl24TynW<9YQfTIJm-m6#byry1Mb-f_4mMmn$;69|XQ;BS_DQOI55T}UBm8lkxxJ01VDo^%k$MHd7SXhAn#z>=J=OdVnYjUI9BC-x;yh2 z&O~5vv1iyef9#2SqbdN&i8rE(JZW%YcaaBIx)v<^<`ne!p2ew;w^s>W9gty^>#tZs z1>S6-SsjEP80eHhsayQma#Qm0_aF@-gLSBs<}o&CtDaosJ)?;&Wk2OUb<-WHqIJ`MV9_Sz zpOCZ;BHbT_eL?48V(0&9`Xm1Ouly@ z9_K>}W0X(PVcqdPkC;8bLXBEv9)ExfE-w8S7j|SCN6{wz6SweoJ>-9idcB1CR`vHc z1b)K5IKLU=jC6>3+ekGV#Nlr5wf;=a^P>v~bdG z-d6Q5H+VC&Y6Si#4kT(melhKCY)RsYS5n!Bd9f!hFkLGp(5d5!E)y$}`mgSQn)Vuj zPGL;3`R*e5K0B3weFjzvq4lLJuORrGdo$NL8JwV8 z%?@|C1CvJ`AC)icgt29Yov_{C#V0P;7#)0s(=5#KlXs617DT(%lK_jlo8lQd82j}~BX1-xX!!J+5S_BNZkDC{iAe44fuRUONfl10L zoGF>a@fyn}cBz}NbPyTU}n z)o+AjnK&1q6ga$N5|-^HcN(zPLf`${GAFsUp_`*4eCNwUFnE#hXysu$3_Px;iK_dH zGup3s?^9bq!|ud9Re5O~N~x@WV#$Uh4Q)r$Vn$%{`r#!8uM8lQe2&zt4daRtpR-|r zFV-%^Jni>=k3TCixQP#2aO=w5=aqq7I3<@U9d`OXP=Z)r*Q;7>=b7eg-uQl?ry?-77j$4}&MH7zKalJ8?UA_cBcy^K{?>^GEhO*SfHfF*bd(yaC;a&wpQ^b%RXn z^)ud*;ZS?4D~QRCXPf^9!Xvg~pnuHo*Yqh)C^{;mpLO^+)O*P86YJ(f@{@#7`u%<| zidP;|4bVV;$W6Kj%)&Uk^YlveKqj=TwWl$@vxWW{YRL}&Nt{ffb>HaTf;r>-tui5H zBJE=D&7%eg(?9PV^c9yNQ2ArWw<}*@zWyXIs{DaDiT6$WBz<7vdA7n{;xF=S6%eIF*YQ*GWtx1~26vkk5K2q(p8Wm=8ZAUcs`s0#e z+KFGg;&9@*Yrt0<8VnkSiM_N~gDKiTCac3W9Qe4?OkrLQn(Y}2t}c4Oq#4aVruP8M z(;rUkNjQX6{twhw8zo?=c(K}g|27!bNPa3tFvp-$&p;DmJdUY^5`;Kh0S~RjcG17a z{_6^IGRAvgO8RZ6i+wFDEI+OYXivsA&R+rxUUSf@5%l?`#UO;G+DPlOpM^PV=jRn+ z?l3@g@iKqGgVmSIs~Jui;2O?aEZ&WWF_!VeU%yMDT2}fw@2@wpJKupb==V(=HNM#P z>CpouvxJ8Sw|(cyR@ge?VWS^V z3mw5znG@OXVS%~w)Uo4Hu)+S!aPf{bP~ROON~Y>#in5Jwg>)lK2z=jJXnO_n?*IEF zW^92ybo+i>xkMr`T4$wvpfur3?x(8bEmkm>=-(ktx{VPU_7|SbI${MQm+W8B-ME^v zqguQz7e?Qly(GxRk4tfB@^Lp=Vd%fID>&8w^-X4~zq4;+tya#tMM)!|TAEpjEsR3b z@4I$ZvTCqk{Yh0OT15WMTql_QzAba6&mS7DrOJI| z+k;)^x%vIDG7y&@@7w?UKOFrYO0Vsi0FA7bY~OPh zfcX2yt^T*;xbUSu@KBn;W{!o2D%cr9gUxFR84gb*M5JGBGuZTs8*_UzIr(w*AXi#} zjRO!qOvtsLxd9|=vBMd34ES3uqs8XaBj{D-y4S-J2{W|YtE_z_sO++OVF1T*GDbEv znl2MZ=w%Hi(vJ}sGxn+Y_gW$?uhGBvvObVb=m+l^$bzDnM%iaJC$Yl0J#m0187PnG zse2uVa8BTq-fQMU$S%lJFY{-IIZiQ0RqbYMkoSMgHE0XdOtv?~MlJ&700*HupADx! ztDU*QZ;T@zXr<&WiRlTqGoL4R;^-jZ{DbUzXsdP$jC0?Q)Ipoolzl!xoA`Fm=tTo+ ztraIYJlO%W>jEP49ub?+_gm_*pggQw%~ID343X-;TkQS5L`3slgp3_IILJmimh@H| z#^q&o_R3JOv#Xf>v%VP)rC%RW3rNP_r2F!>*grzW5JQ4H?n7V3T)p%-fbbjv-#0bQ z*dG3*pf#)v%DD3^o)u{#rL5%KY=S8^?;mR3LPv-7<<^os`>RzMyORv%?P<6mU-8$x zNfwtVe}e*#wn4p%@A^anPbJL3t`y||rS;OXoFF(mWnZrSr+g}x~oWlVI z-spq>?SsU)zE2l8ETFsigr#o|3CsK2B4on~q4=;9XI{~FC`3C4j$08pX1&6`mtGP^ zRg#o;{VIY=vUqclgAz{8N$bQ1umXklg*WH-oz3em&Ky&-aP~D#XlH#1tORE;osd`F z^zDm_HwQYgdU#%SQ8*086RzE!*Pw&)#or~Ae`%0HE>62c_<_X~3Afz`YH(oTXf>z! z2ke(IVWfNT4pKFow#&$CV?#V$YRNG#pgey!t-(8m6t-plQIi3zmvz7F9rGGSjgC!o zpLmMHA`fofOWNeL6~+IaJvj;!!fSg=$k$=E>qhy^D<$j~n|ajv^&oVWD4X8d%Yi=| zMOmNUOvcf#K3%bUoN$uE$n<7c6JmSdjcns7n6+LW`#n;Hy)1jowcgeN>CBEKE3ZIU z_!bvbLlPn|lve%twypvj9X%IIofxsGPR;jMUl@)¥n0Jp(%8KR>ro`bMBrmCne? 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

E0vA$9Nk0xuZ8g)i@ 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 ZzjpwLs7^Nh)CL??o8ng7HZJ Date: Mon, 10 Mar 2025 23:00:12 -0400 Subject: [PATCH 07/19] Fixed some lint issues --- .lintr | 1 - DESCRIPTION | 2 +- NEWS.md | 8 ++- R/Log_Likelihood.R | 16 ++--- R/PrestoGP_CreateU_Multivariate.R | 19 +++--- R/PrestoGP_Model.R | 80 ++++++++++++++--------- R/PrestoGP_Multivariate_Vecchia.R | 6 +- R/PrestoGP_Util_Functions.R | 34 +++++----- R/PrestoGP_Vecchia.R | 4 +- tests/testthat/test-PrestoGP_Univariate.R | 4 +- 10 files changed, 99 insertions(+), 75 deletions(-) diff --git a/.lintr b/.lintr index 6c1cc72..eba75d6 100644 --- a/.lintr +++ b/.lintr @@ -2,7 +2,6 @@ linters: linters_with_defaults( line_length_linter(160L), commented_code_linter = NULL, object_name_linter = NULL, - cyclocomp_linter = NULL, object_length_linter = NULL, indentation_linter( indent = 2L, diff --git a/DESCRIPTION b/DESCRIPTION index a13d196..bf85218 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9044 +Version: 0.2.0.9045 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NEWS.md b/NEWS.md index 697610a..bdc83b1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,10 @@ -# PrestoGP 0.2.0.9044 +# PrestoGP 0.2.0.9045 (2025-3-10) + +## MINOR IMPROVEMENTS + +* Fixed some linting issues + +# PrestoGP 0.2.0.9044 (2025-3-7) ## BREAKING CHANGES diff --git a/R/Log_Likelihood.R b/R/Log_Likelihood.R index 48c9545..b9692ed 100644 --- a/R/Log_Likelihood.R +++ b/R/Log_Likelihood.R @@ -43,7 +43,7 @@ negloglik_full_ST <- function(logparms, locs, y, param.seq, scaling, nscale) { smoothness = parms[param.seq[3, 1]] ) + parms[param.seq[4, 1]] * diag(N) - return(-1 * mvtnorm::dmvnorm(y, rep(0, N), cov.mat, log = TRUE)) + -1 * mvtnorm::dmvnorm(y, rep(0, N), cov.mat, log = TRUE) } # Spatial Full Kriging negative log likelihood @@ -56,7 +56,7 @@ negloglik.full <- function(logparams, d, y, param.seq) { smoothness = params[3] ) + params[4] * diag(N) - return(-1 * mvtnorm::dmvnorm(y, rep(0, N), cov.mat, log = TRUE)) + -1 * mvtnorm::dmvnorm(y, rep(0, N), cov.mat, log = TRUE) } #' Evaluation of the multivariate Vecchia likelihood @@ -114,7 +114,7 @@ vecchia_Mlikelihood <- function(z, vecchia.approx, covparams) { if (inherits(res, "try-error")) { junk <- -1 * Inf } - return(junk) + junk } @@ -265,12 +265,12 @@ create.cov.upper.flex <- function(P, marg.var, marg.range, marg.smooth, nugget, } } - return(list( + list( "variance" = sig2.mat, "range" = range.mat, "smoothness" = smoothness.mat, "nugget" = nugget.mat - )) + ) } @@ -335,7 +335,7 @@ cat.covariances <- function(locs.list, sig2, range, smoothness, nugget) { } - return(cov.mat.out) + cov.mat.out } ############################################################################## @@ -353,7 +353,7 @@ create.initial.values.flex <- function(marg.var, marg.range, marg.smooth, nugget } else { logparams.init <- c(logparams.init, 0) } - return(logparams.init) + logparams.init } ############################################################################## @@ -370,5 +370,5 @@ unlog.params <- function(logparams, param.seq, P) { } else { params <- c(params, 1) } - return(params) + params } diff --git a/R/PrestoGP_CreateU_Multivariate.R b/R/PrestoGP_CreateU_Multivariate.R index ba7deee..d17d737 100644 --- a/R/PrestoGP_CreateU_Multivariate.R +++ b/R/PrestoGP_CreateU_Multivariate.R @@ -106,7 +106,7 @@ create_param_sequence <- function(P, ns = 1) { param.sequence.end <- c(P, ns * P, P, P, nk) %>% cumsum() param.sequence <- cbind(param.sequence.begin, param.sequence.end) - return(param.sequence) + param.sequence } #' Maximum minimum distance ordering @@ -194,14 +194,15 @@ knn_indices <- function(ordered_locs, query, n_neighbors, dist_func, dist_func_c dists <- dist_func(query, ordered_locs) dists_order <- order(dists) nearest_neighbors <- dists_order[1:n_neighbors] - return(list( + junk <- list( "indices" = nearest_neighbors, "distances" = dists[nearest_neighbors] - )) + ) } else { cur.nn <- nn2(ordered_locs, query, n_neighbors) - return(list("indices" = cur.nn$nn.idx, "distances" = cur.nn$nn.dists)) + junk <- list("indices" = cur.nn$nn.idx, "distances" = cur.nn$nn.dists) } + junk } #' sparseNN @@ -315,7 +316,7 @@ calc.q <- function(nn.obj, firstind.pred) { q.z[[i]] <- setdiff(q.z[[i]], latent.pred) } } - return(list(q.y = q.y, q.z = q.z)) + list(q.y = q.y, q.z = q.z) } #' Specify a multivariate Vecchia approximation @@ -464,13 +465,13 @@ vecchia_Mspecify <- function(locs.list, m, locs.list.pred = NULL, last.obs <- max(which(obs)) q.list <- calc.q(nn.mat$indices, last.obs + 1) - return(list( + list( locsord = olocs, obs = obs, ord = ord, ord.z = ord.z, ord.pred = ordering.pred, cond.yz = "SGV", conditioning = "NN", P = P, ondx = ondx, dist.func = dist.func, dist.func.code = dist.func.code, q.list = q.list, n.neighbors = m - )) + ) } #' Create the sparse triangular matrix U for multivariate Vecchia models @@ -754,9 +755,9 @@ createUMultivariate <- function(vec.approx, params, cov_func = NULL) { } latent <- rep(TRUE, nrow(U)) latent[seq(from = 2, to = (2 * sum(vec.approx$obs)), by = 2)] <- FALSE - return(list( + list( U = U, latent = latent, ord = vec.approx$ord, obs = vec.approx$obs, ord.pred = vec.approx$ord.pred, ord.z = vec.approx$ord.z, cond.yz = vec.approx$cond.yz, ic0 = FALSE - )) + ) } diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index 6b08e6e..eda18da 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -111,7 +111,7 @@ validityPrestoGPModel <- function(object) { setValidity("PrestoGPModel", validityPrestoGPModel) setMethod("initialize", "PrestoGPModel", function(.Object, ...) { -# .Object@linear_model <- structure(list(), class = "cv.glmnet") + # .Object@linear_model <- structure(list(), class = "cv.glmnet") .Object@alpha <- 1 # 0.5 .Object <- callNextMethod() validObject(.Object) @@ -255,24 +255,42 @@ setGeneric( #' soil.yhat <- prestogp_predict(soil.vm, X[otst,], locs[otst,]) setGeneric( "prestogp_predict", - function(model, X = "matrix", locs = "matrix", m = "numeric", ordering.pred = c("obspred", "general"), - pred.cond = c("independent", "general"), return.values = c("mean", "meanvar")) { + function(model, X = "matrix", locs = "matrix", m = "numeric", + ordering.pred = c("obspred", "general"), + pred.cond = c("independent", "general"), + return.values = c("mean", "meanvar")) { standardGeneric("prestogp_predict") } ) -setGeneric("calc_covparams", function(model, locs, Y, covparams) standardGeneric("calc_covparams")) +setGeneric("calc_covparams", + function(model, locs, Y, covparams) standardGeneric("calc_covparams")) setGeneric("specify", function(model, ...) standardGeneric("specify")) -setGeneric("compute_residuals", function(model, Y, Y.hat, family) standardGeneric("compute_residuals")) -setGeneric("transform_data", function(model, Y, X) standardGeneric("transform_data")) -setGeneric("estimate_theta", function(model, locs, optim.control, method) standardGeneric("estimate_theta")) -setGeneric("estimate_betas", function(model, family, nfolds, foldid, parallel, cluster, penalty, adaptive) standardGeneric("estimate_betas")) +setGeneric("compute_residuals", + function(model, Y, Y.hat, family) standardGeneric("compute_residuals")) +setGeneric("transform_data", + function(model, Y, X) standardGeneric("transform_data")) +setGeneric("estimate_theta", + function(model, locs, optim.control, method) { + standardGeneric("estimate_theta")}) +setGeneric("estimate_betas", + function(model, family, nfolds, foldid, parallel, cluster, penalty, + adaptive) { + standardGeneric("estimate_betas")}) setGeneric("impute_y", function(model) standardGeneric("impute_y")) -setGeneric("impute_y_lod", function(model, lod, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel, cluster, verbose) standardGeneric("impute_y_lod")) -setGeneric("compute_error", function(model, y, X) standardGeneric("compute_error")) +setGeneric("impute_y_lod", + function(model, lod, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, + foldid, parallel, cluster, verbose) { + standardGeneric("impute_y_lod")}) +setGeneric("compute_error", + function(model, y, X) standardGeneric("compute_error")) setGeneric("scale_locs", function(model, locs) standardGeneric("scale_locs")) -setGeneric("transform_covariance_parameters", function(model) standardGeneric("transform_covariance_parameters")) -setGeneric("check_input", function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod) standardGeneric("check_input")) -setGeneric("check_input_pred", function(model, X, locs) standardGeneric("check_input_pred")) +setGeneric("transform_covariance_parameters", + function(model) standardGeneric("transform_covariance_parameters")) +setGeneric("check_input", + function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod) { + standardGeneric("check_input")}) +setGeneric("check_input_pred", + function(model, X, locs) standardGeneric("check_input_pred")) #' show method for PrestoGP models #' @@ -401,7 +419,7 @@ setMethod( rownames(rho.mat) <- names(model@locs_train) junk$correlation <- rho.mat } - return(junk) + junk } ) @@ -473,7 +491,7 @@ setMethod( } else { names(junk) <- c("Y", "(Intercept)") } - return(junk) + junk } ) @@ -518,7 +536,7 @@ setMethod( setMethod( "get_linear_model", "PrestoGPModel", function(model) { - return(model@linear_model) + model@linear_model } ) @@ -557,7 +575,7 @@ setMethod( setMethod( "get_neighbors", "PrestoGPModel", function(model) { - return(model@n_neighbors) + model@n_neighbors } ) @@ -596,7 +614,7 @@ setMethod( setMethod( "get_scaling", "PrestoGPModel", function(model) { - return(model@scaling) + model@scaling } ) @@ -635,7 +653,7 @@ setMethod( setMethod( "get_converged", "PrestoGPModel", function(model) { - return(model@converged) + model@converged } ) @@ -675,7 +693,7 @@ setMethod( setMethod( "get_pen_loglik", "PrestoGPModel", function(model) { - return(model@error) + model@error } ) @@ -1110,8 +1128,8 @@ setMethod( if (min.error < prev.error * tol) { prev.error <- min.error model@error <- prev.error -# beta.hat <- sparseToDenseBeta(model@linear_model) -# model@beta <- beta.hat + # beta.hat <- sparseToDenseBeta(model@linear_model) + # model@beta <- beta.hat if (model@penalty == "lasso" || model@penalty == "relaxed") { beta.hat <- as.matrix(predict(model@linear_model, s = "lambda.min", gamma = "gamma.min", type = "coefficients")) @@ -1149,7 +1167,7 @@ setMethod( if (!model@converged) { warning("Model fitting did not converge") } - return(model) + model } ) @@ -1198,15 +1216,15 @@ setMethod("estimate_betas", "PrestoGPModel", function(model, family, nfolds, # coefs <- list(coefs) # } # beta_construct <- matrix(data = 0, nrow = coefs[[1]]@Dim[1], ncol = length(coefs)) - # coefs[[1]]@Dim[1]+2s because dgCMatrix is 0 offset, and we want to include intercept +# coefs[[1]]@Dim[1]+2s because dgCMatrix is 0 offset, and we want to include intercept # for (i in seq_along(coefs)) { # for (j in seq_along(coefs[[i]]@i)) { # k <- coefs[[i]]@i[j] - # beta_construct[k+1,i] <- coefs[[i]]@x[j] +# beta_construct[k+1,i] <- coefs[[i]]@x[j] # beta_construct[k + 1, i] <- coefs[[i]]@x[j] # } # } - # show(beta_construct) +# show(beta_construct) # beta <- matrix(beta_construct, nrow = coefs[[1]]@Dim[1], ncol = length(coefs)) # beta #} @@ -1281,7 +1299,7 @@ setMethod("calc_covparams", "PrestoGPModel", function(model, locs, Y, covparams) D.sample.bar <- rep(NA, model@nscale * P) for (i in 1:P) { col.vars[i] <- var(Y[[i]], na.rm = TRUE) - N <- length(Y[[i]]) + # N <- length(Y[[i]]) # TODO find a better way to compute initial spatial range for (j in 1:model@nscale) { # d.sample <- sample(1:N, max(2, ceiling(N / 50)), replace = FALSE) @@ -1352,10 +1370,8 @@ setMethod("calc_covparams", "PrestoGPModel", function(model, locs, Y, covparams) #' @return a matrix with scaled locations #' @noRd setMethod("scale_locs", "PrestoGPModel", function(model, locs) { - if (model@common_scale) { - return(locs) - } else { - locs.out <- locs + locs.out <- locs + if (!model@common_scale) { for (i in seq_along(locs)) { for (j in 1:model@nscale) { locs.out[[i]][, model@scaling == j] <- @@ -1363,8 +1379,8 @@ setMethod("scale_locs", "PrestoGPModel", function(model, locs) { model@covparams[model@param_sequence[2, 1] + model@nscale * (i - 1) + j - 1] } } - return(locs.out) } + locs.out }) setMethod("transform_covariance_parameters", "PrestoGPModel", function(model) { diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index 46b02ed..02a5726 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -41,7 +41,7 @@ setMethod("get_Y", "MultivariateVecchiaModel", Y.out[[i]] <- Y.all[cur.y] + model@Y_bar[i] Y.all <- Y.all[-cur.y] } - return(Y.out) + Y.out } ) @@ -138,7 +138,7 @@ setMethod("prestogp_predict", "MultivariateVecchiaModel", return.list <- list(means = Vec.mean, sds = Vec.sds) } - return(return.list) + return.list } ) @@ -326,7 +326,7 @@ setMethod("check_input_pred", "MultivariateVecchiaModel", function(model, X, loc if (ncol(X) != ncol(model@X_train)) { stop("X and X_train must have the same number of predictors") } - return(list(X = X, Y_bar = Y_bar)) + list(X = X, Y_bar = Y_bar) }) setMethod("impute_y", "MultivariateVecchiaModel", function(model) { diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index f069f65..217e106 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -8,13 +8,13 @@ SCAD_penalty <- function(x, lambda, gamma) { pen1 <- lambda * abs(x[idx1]) pen2 <- (2 * gamma * lambda * abs(x[idx2]) - x[idx2]^2 - lambda^2) / (2 * (gamma - 1)) - return(sum(pen1) + sum(pen2) + sum(idx3) * lambda^2 * (gamma + 1) / 2) + sum(pen1) + sum(pen2) + sum(idx3) * lambda^2 * (gamma + 1) / 2 } MCP_penalty <- function(x, lambda, gamma) { idx <- abs(x) <= (gamma * lambda) - return(sum(lambda * abs(x[idx]) - x[idx]^2 / (2 * gamma)) + - sum(!idx) * gamma * lambda^2) + sum(lambda * abs(x[idx]) - x[idx]^2 / (2 * gamma)) + + sum(!idx) * gamma * lambda^2 } #' glmnet_penalty @@ -140,7 +140,7 @@ transform_iid <- function(data, vecchia.approx, covparms, nuggets) { # return to original ordering # orig.order <- order(U.obj$ord) # transformed.data <- transform.ord[orig.order, ] - return(transform.ord) + transform.ord } ################################################################################ @@ -165,7 +165,7 @@ transform_miid <- function(data, vecchia.approx, params) { # return to original ordering # orig.order <- order(U.obj$ord) # transformed.data <- transform.ord[orig.order, ] - return(transform.ord) + transform.ord } ###### GPvecchia local function @@ -201,18 +201,20 @@ U2V <- function(U.obj) { V.ord <- methods::as(cbind(V.pr, V.or), "triangularMatrix") } - return(V.ord) + V.ord } ########################################################### ## Reverse order of matrix rows,cols revMat <- function(mat) { if (nrow(mat) == 0 || ncol(mat) == 0) { - return(mat) + mat.out <- mat + } else { + row_seq <- rev(seq_len(nrow(mat))) + col_seq <- rev(seq_len(ncol(mat))) + mat.out <- mat[row_seq, col_seq, drop = FALSE] } - row_seq <- rev(seq_len(nrow(mat))) - col_seq <- rev(seq_len(ncol(mat))) - mat[row_seq, col_seq, drop = FALSE] + mat.out } #' Multivariate Vecchia prediction @@ -303,7 +305,7 @@ vecchia_Mprediction <- function(z, vecchia.approx, covparms, var.exact = NULL, r return.list$var.pred <- vars.vecchia$vars.pred return.list$var.obs <- vars.vecchia$vars.obs } - return(return.list) + return.list } # noise_locs @@ -319,7 +321,7 @@ noise_locs <- function(locs, eps = 1e-4) { stats::rnorm(n * p), n, p ) - return(locs) + locs } # eliminate_dupes @@ -345,7 +347,7 @@ eliminate_dupes <- function(locs, locs.pred = NULL) { } } } - return(list(locs = locs, locs.pred = locs.pred)) + list(locs = locs, locs.pred = locs.pred) } lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, @@ -397,7 +399,7 @@ lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, cur.resid <- obs.means - y[!miss] cur.sd <- sqrt(sum(cur.resid^2) / (sum(!miss) - length(last.coef))) y.impute <- etruncnorm(b = lod, mean = miss.means, sd = cur.sd) - return(list(coef = cur.coef, y.impute = y.impute)) + list(coef = cur.coef, y.impute = y.impute) } MMatern_cov <- function(locs, y_ndx, covparams, P) { @@ -441,7 +443,7 @@ MMatern_cov <- function(locs, y_ndx, covparams, P) { } } } - return(Sigma.hat) + Sigma.hat } rtmvn_snn2 <- function(y, cens_lb, cens_ub, mask_cens, NN, cov_array) { @@ -494,5 +496,5 @@ cv.ncvreg.wrap <- function(X, y, cluster, foldid, penalty, ...) { junk <- cv.ncvreg(X, y, penalty = penalty, ...) } } - return(junk) + junk } diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 2ca79d8..83e367c 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -31,7 +31,7 @@ setMethod("initialize", "VecchiaModel", function(.Object, n_neighbors = 25, ...) #' @rdname get_Y setMethod("get_Y", "VecchiaModel", function(model) { - return(as.vector(model@Y_train + model@Y_bar)) + as.vector(model@Y_train + model@Y_bar) } ) @@ -105,7 +105,7 @@ setMethod("prestogp_predict", "VecchiaModel", return.list <- list(means = Vec.mean, sds = Vec.sds) # nolint } - return(return.list) + return.list } ) diff --git a/tests/testthat/test-PrestoGP_Univariate.R b/tests/testthat/test-PrestoGP_Univariate.R index b0a05c7..b09ccec 100644 --- a/tests/testthat/test-PrestoGP_Univariate.R +++ b/tests/testthat/test-PrestoGP_Univariate.R @@ -342,7 +342,7 @@ test_that("Simulated dataset spatial", { params.out6 <- pgp.model6@covparams expect_equal(as.numeric(beta.out6[[1]]), c(0.979, 1.037, 1.009, 1.015, - rep(0, 6)), tolerance = 0.003) + rep(0, 6)), tolerance = 0.003) expect_equal(as.numeric(beta.out6[[2]] - mean(y)), 0.002, tolerance = 0.003) expect_equal(params.out6[1], 1.44, tolerance = 0.2) expect_equal(params.out6[2] - 0.41, 0, tolerance = 0.06) @@ -432,7 +432,7 @@ test_that("Simulated dataset spatial", { params.out10 <- pgp.model10@covparams expect_equal(as.numeric(beta.out10[[1]]), c(0.979, 1.038, 1.009, 1.015, - rep(0, 6)), tolerance = 0.03) + rep(0, 6)), tolerance = 0.03) expect_equal(as.numeric(beta.out10[[2]] - mean(y)), 0.002, tolerance = 0.003) expect_equal(params.out10[1], 1.46, tolerance = 0.2) expect_equal(params.out10[2] - 0.41, 0, tolerance = 0.05) From d836bc8a342677027b6f38e722258f76ac3559af Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Thu, 24 Apr 2025 15:26:24 -0400 Subject: [PATCH 08/19] Lower LOD, imputation parameters --- DESCRIPTION | 2 +- NEWS.md | 25 +++ R/PrestoGP_Model.R | 113 +++++++++---- R/PrestoGP_Multivariate_Vecchia.R | 74 ++++++--- R/PrestoGP_Util_Functions.R | 24 ++- R/PrestoGP_Vecchia.R | 54 +++--- man/prestogp_fit-PrestoGPModel-method.Rd | 54 ++++-- ...test-PrestoGP_Multivariate_Vecchia_Model.R | 156 ++++++++++++------ tests/testthat/test-PrestoGP_Univariate.R | 46 ++++-- 9 files changed, 380 insertions(+), 168 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index bf85218..431b95f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9045 +Version: 0.2.0.9046 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NEWS.md b/NEWS.md index bdc83b1..d51f18d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,28 @@ +# PrestoGP 0.2.0.9046 (2025-4-24) + +## BREAKING CHANGES + +* The parameter `lod` has been renamed to be `lod.upper` + +* The parameter `max_iters` has been renamed as `max.iters` for a consistent + naming convention + +## NEW FEATURES + +* The `prestogp_fit` method now supports lower limits of detection via the + `lod.lower` parameter + +* Additional tuning parameters can be specified for the LOD imputation + procedure, namely `n.impute`, `eps.impute`, and `maxit.impute` + +## BUG FIXES + +* Added another set of fixes to avoid crashes when the estimated U matrix is + numerically singular + +* Subsampling is once again used for initial scale parameter estimates for + large (>10,000 observation) data sets for computational reasons + # PrestoGP 0.2.0.9045 (2025-3-10) ## MINOR IMPROVEMENTS diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index eda18da..f1a858f 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -165,7 +165,8 @@ setGeneric( "prestogp_fit", function(model, Y, X, locs, Y.names = NULL, X.names = NULL, scaling = NULL, common_scale = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, - max_iters = 100, center.y = NULL, impute.y = FALSE, lod = NULL, + max.iters = 100, center.y = NULL, impute.y = FALSE, lod.upper = NULL, + lod.lower = NULL, n.impute = 10, eps.impute = 0.01, maxit.impute = 1, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, @@ -278,7 +279,7 @@ setGeneric("estimate_betas", standardGeneric("estimate_betas")}) setGeneric("impute_y", function(model) standardGeneric("impute_y")) setGeneric("impute_y_lod", - function(model, lod, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, + function(model, lodu, lodl, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel, cluster, verbose) { standardGeneric("impute_y_lod")}) setGeneric("compute_error", @@ -287,7 +288,8 @@ setGeneric("scale_locs", function(model, locs) standardGeneric("scale_locs")) setGeneric("transform_covariance_parameters", function(model) standardGeneric("transform_covariance_parameters")) setGeneric("check_input", - function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod) { + function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod.upper, + lod.lower) { standardGeneric("check_input")}) setGeneric("check_input_pred", function(model, X, locs) standardGeneric("check_input_pred")) @@ -772,19 +774,29 @@ setMethod( #' @param beta.hat The initial beta parameters estimates (optional). #' @param tol The model is considered converged when error is not less than #' tol*previous_error (optional). Defaults to 0.999999. -#' @param max_iters Maximum number of iterations for the model fitting +#' @param max.iters Maximum number of iterations for the model fitting #' procedure. Defaults to 100. #' @param center.y Should the Y's be mean centered before fitting the model? #' Defaults to TRUE for gaussian models and FALSE for binomial models. #' @param impute.y Should missing Y's be imputed? Defaults to FALSE. -#' @param lod Limit of detection value(s). Any Y value less than lod is -#' assumed to be missing when performing missing data imputation. Should be -#' numeric for univariate models and a list for multivariate models, where -#' each element of the list corresponds to an outcome. The ith element of -#' the lod is the limit of detection for observation i. Alternatively, one -#' can specify a single limit of detection that is assumed to be the same for -#' all observations. If not specified, it is assumed that no limit of -#' detection exists. Ignored if impute.y is FALSE. +#' @param lod.upper Upper limit of detection value(s). Any missing Y is +#' assumed to be less than lod.upper when performing missing data imputation. +#' Should be numeric for univariate models and a list for multivariate models, +#' where each element of the list corresponds to an outcome. The \emph{i}th +#' element of the lod is the limit of detection for observation i. +#' Alternatively, one can specify a single limit of detection that is assumed +#' to be the same for all observations. If not specified, it is assumed that +#' no upper limit of detection exists. Ignored if impute.y is FALSE. +#' @param lod.lower Same as lod.upper, except it specifies the lower limit of +#' detection: missing Y values are assumed to be greater than lod.lower. This +#' is often equal to 0. +#' @param n.impute How many multiply imputed values of missing y's should be +#' generated? Defaults to 10. +#' @param eps.impute The multiple imputation procedure will stop if successive +#' coefficient estimates are within eps.impute of one another. Defaults to +#' 0.01. +#' @param maxit.impute Maximum number of iterations for the multiple imputation +#' procedure . Defaults to 1. See Details. #' @param quiet If FALSE, the penalized log likelihood and the model MSE #' will be printed for each iteration of the model fitting procedure. No #' intermediate output will be printed if TRUE. Defaults to FALSE. @@ -838,6 +850,17 @@ setMethod( #' each iteration of the model fitting procedure if common_scale is TRUE, #' but the parameter is otherwise ignored. #' +#' If impute.y is TRUE, missing values of y will be imputed. If there is no +#' limit of detection specified, then missing y's will be imputed using an +#' EM algorithm. If there are limits of detection, then missing y's will be +#' imputed using a multiple imputation algorithm based on the current +#' estimates of the Matern (theta) parameters. Unfortunately, this procedure +#' is not robust to inaccurate estimates of theta and produce inaccurate +#' results if theta is misspecified. Thus, the maximum number of iterations is +#' set to 1 by default. Results can be improved by increasing the number of +#' iterations if one has confidence in the theta estimates. If impute.y is +#' FALSE, then any missing y's will produce an error. +#' #' @return A PrestoGPModel object with slots updated based on the results of #' the model fitting procedure. See \code{\link{PrestoGPModel-class}} for #' details. @@ -883,7 +906,8 @@ setMethod( #' y.lod <- y #' y.lod[y.lod <= soil.lod] <- NA #' soil.vm3 <- new("VecchiaModel", n_neighbors = 10) -#' soil.vm3 <- prestogp_fit(soil.vm, y, X, locs, impute.y = TRUE, lod = soil.lod) +#' soil.vm3 <- prestogp_fit(soil.vm, y, X, locs, impute.y = TRUE, +#' lod.upper = soil.lod) #' #' # Full model #' soil.fm <- new("FullModel") @@ -916,7 +940,8 @@ setMethod( "prestogp_fit", "PrestoGPModel", function(model, Y, X, locs, Y.names = NULL, X.names = NULL, scaling = NULL, common_scale = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, - max_iters = 100, center.y = NULL, impute.y = FALSE, lod = NULL, + max.iters = 100, center.y = NULL, impute.y = FALSE, lod.upper = NULL, + lod.lower = NULL, n.impute = 10, eps.impute = 0.01, maxit.impute = 1, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, @@ -934,19 +959,33 @@ setMethod( } } model <- check_input(model, Y, X, locs, Y.names, X.names, center.y, - impute.y, lod) - if (is.null(lod)) { - lodv <- rep(Inf, nrow(model@Y_train)) + impute.y, lod.upper, lod.lower) + if (is.null(lod.upper)) { + lodvu <- rep(Inf, nrow(model@Y_train)) } else { - if (is.numeric(lod)) { - lod <- list(lod) + if (is.numeric(lod.upper)) { + lod.upper <- list(lod.upper) } - lodv <- NULL - for (i in seq_along(lod)) { - if (length(lod[[i]] == 1)) { - lod[[i]] <- rep(lod[[i]], nrow(model@locs_train[[i]])) + lodvu <- NULL + for (i in seq_along(lod.upper)) { + if (length(lod.upper[[i]] == 1)) { + lod.upper[[i]] <- rep(lod.upper[[i]], nrow(model@locs_train[[i]])) } - lodv <- c(lodv, lod[[i]] - model@Y_bar[i]) + lodvu <- c(lodvu, lod.upper[[i]] - model@Y_bar[i]) + } + } + if (is.null(lod.lower)) { + lodvl <- rep(-Inf, nrow(model@Y_train)) + } else { + if (is.numeric(lod.lower)) { + lod.lower <- list(lod.lower) + } + lodvl <- NULL + for (i in seq_along(lod.lower)) { + if (length(lod.lower[[i]] == 1)) { + lod.lower[[i]] <- rep(lod.lower[[i]], nrow(model@locs_train[[i]])) + } + lodvl <- c(lodvl, lod.lower[[i]] - model@Y_bar[i]) } } if (!is.null(beta.hat)) { @@ -1032,12 +1071,12 @@ setMethod( if (!quiet) { cat("\n") } - if (sum(!model@Y_obs) > 0 & min(lodv) < Inf) { + if (sum(!model@Y_obs) > 0 & ((min(lodvu) < Inf) | (max(lodvl) > -Inf))) { if (!quiet) { cat("Imputing missing y's and estimating initial beta...", "\n") } - cur.mi <- lod_reg_mi(model@Y_train, model@X_train, lodv, !model@Y_obs, - penalty = model@penalty, alpha = model@alpha, + cur.mi <- lod_reg_mi(model@Y_train, model@X_train, lodvu, lodvl, + !model@Y_obs, penalty = model@penalty, alpha = model@alpha, parallel = parallel, cluster = cluster, foldid = foldid, verbose = verbose) model@Y_train[!model@Y_obs] <- cur.mi$y.impute @@ -1079,7 +1118,7 @@ setMethod( if (!quiet) { cat("\n") } - while (!model@converged && (iter <= max_iters)) { + while (!model@converged && (iter <= max.iters)) { if (!quiet) { cat("Beginning iteration", iter, "\n") } @@ -1099,13 +1138,14 @@ setMethod( model <- specify(model) } - if (sum(!model@Y_obs) > 0 & min(lodv) < Inf) { + if (sum(!model@Y_obs) > 0 & ((min(lodvu) < Inf) | (max(lodvl) > -Inf))) { if (!quiet) { cat("Imputing missing y's...", "\n") } - model <- impute_y_lod(model, lodv, family = family, nfolds = nfolds, - foldid = foldid, parallel = parallel, cluster = cluster, - verbose = verbose) + model <- impute_y_lod(model, lodvu, lodvl, n.mi = n.impute, + eps = eps.impute, maxit = maxit.impute, family = family, + nfolds = nfolds, foldid = foldid, parallel = parallel, + cluster = cluster, verbose = verbose) if (!quiet) { cat("Imputation complete", "\n") } @@ -1140,7 +1180,8 @@ setMethod( Y.hat <- as.matrix(predict(model@linear_model, model@X_train)) } model@beta <- beta.hat - if (sum(!model@Y_obs) > 0 & sum(lodv < Inf) == 0) { + if (sum(!model@Y_obs) > 0 & sum(lodvu < Inf) == 0 & + sum(lodvl > -Inf) == 0) { if (!quiet) { cat("Imputing missing y's...", "\n") } @@ -1299,11 +1340,11 @@ setMethod("calc_covparams", "PrestoGPModel", function(model, locs, Y, covparams) D.sample.bar <- rep(NA, model@nscale * P) for (i in 1:P) { col.vars[i] <- var(Y[[i]], na.rm = TRUE) - # N <- length(Y[[i]]) + N <- length(Y[[i]]) # TODO find a better way to compute initial spatial range for (j in 1:model@nscale) { - # d.sample <- sample(1:N, max(2, ceiling(N / 50)), replace = FALSE) - D.sample <- rdist(locs[[i]][, model@scaling == j]) + d.sample <- sample(1:N, min(N, 10000), replace = FALSE) + D.sample <- rdist(locs[[i]][d.sample, model@scaling == j]) D.sample.bar[(i - 1) * model@nscale + j] <- mean(D.sample) / 4 } } diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index 02a5726..5fc68e0 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -142,7 +142,7 @@ setMethod("prestogp_predict", "MultivariateVecchiaModel", } ) -setMethod("check_input", "MultivariateVecchiaModel", function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod) { +setMethod("check_input", "MultivariateVecchiaModel", function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod.upper, lod.lower) { if (!is.list(locs)) { stop("locs must be a list for multivariate models") } @@ -171,12 +171,20 @@ setMethod("check_input", "MultivariateVecchiaModel", function(model, Y, X, locs, if (is.null(names(locs))) { names(locs) <- paste0("Y", seq_along(locs)) } - if (!is.null(lod)) { - if (!is.list(lod)) { - stop("lod must be a list for multivariate models") + if (!is.null(lod.upper)) { + if (!is.list(lod.upper)) { + stop("lod.upper must be a list for multivariate models") } - if (length(locs) != length(lod)) { - stop("locs and lod must have the same length") + if (length(locs) != length(lod.upper)) { + stop("locs and lod.upper must have the same length") + } + } + if (!is.null(lod.lower)) { + if (!is.list(lod.lower)) { + stop("lod.lower must be a list for multivariate models") + } + if (length(locs) != length(lod.lower)) { + stop("locs and lod.lower must have the same length") } } for (i in seq_along(locs)) { @@ -215,12 +223,22 @@ setMethod("check_input", "MultivariateVecchiaModel", function(model, Y, X, locs, if (sum(is.na(Y[[i]])) > 0 & !impute.y) { stop("Y contains NA's and impute.y is FALSE. Set impute.y=TRUE to impute missing Y's.") } - if (!is.null(lod[[i]])) { - if (!is.numeric(lod[[i]])) { - stop("Each lod must be numeric") + if (!is.null(lod.upper[[i]])) { + if (!is.numeric(lod.upper[[i]])) { + stop("Each lod.upper must be numeric") + } + if (length(lod.upper[[i]]) != nrow(X[[i]]) & + length(lod.upper[[i]]) != 1) { + stop("Length of each lod.upper must equal the number of observations") + } + } + if (!is.null(lod.lower[[i]])) { + if (!is.numeric(lod.lower[[i]])) { + stop("Each lod.lower must be numeric") } - if (length(lod[[i]]) != nrow(X[[i]]) & length(lod[[i]]) != 1) { - stop("Length of each lod must equal the number of observations") + if (length(lod.lower[[i]]) != nrow(X[[i]]) & + length(lod.lower[[i]]) != 1) { + stop("Length of each lod.lower must equal the number of observations") } } } @@ -243,11 +261,17 @@ setMethod("check_input", "MultivariateVecchiaModel", function(model, Y, X, locs, Y_obs <- NULL for (i in seq_along(Y)) { Y_obs <- c(Y_obs, !is.na(Y[[i]])) - if (!is.null(lod)) { - if (length(lod[[i]]) > 1) { - Y[[i]][is.na(Y[[i]])] <- lod[[i]][is.na(Y[[i]])] + if (!is.null(lod.upper)) { + if (length(lod.upper[[i]]) > 1) { + Y[[i]][is.na(Y[[i]])] <- lod.upper[[i]][is.na(Y[[i]])] + } else { + Y[[i]][is.na(Y[[i]])] <- lod.upper[[i]] + } + } else if (!is.null(lod.lower)) { + if (length(lod.lower[[i]]) > 1) { + Y[[i]][is.na(Y[[i]])] <- lod.lower[[i]][is.na(Y[[i]])] } else { - Y[[i]][is.na(Y[[i]])] <- lod[[i]] + Y[[i]][is.na(Y[[i]])] <- lod.lower[[i]] } } if (center.y) { @@ -394,8 +418,8 @@ setMethod("impute_y", "MultivariateVecchiaModel", function(model) { invisible(model) }) -setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, - n.mi = 10, eps = 0.01, maxit = 1, family, nfolds, foldid, parallel, +setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lodu, + lodl, n.mi = 10, eps = 0.01, maxit = 1, family, nfolds, foldid, parallel, cluster, verbose) { y <- model@Y_train X <- model@X_train @@ -450,15 +474,15 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, coef.mat <- matrix(nrow = n.mi, ncol = (ncol(X) + 1)) if (parallel) { yi <- foreach(i = seq_len(n.mi), .combine = cbind) %dopar% { - out <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + out <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) out + yhat.ni } } else { yi <- matrix(nrow = length(yhat.ni), ncol = n.mi) for (i in seq_len(n.mi)) { - yi[, i] <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + yi[, i] <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) yi[, i] <- yi[, i] + yhat.ni } } @@ -494,8 +518,8 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, if (parallel) { y.na.mat <- foreach(i = seq_len(100), .combine = rbind) %dopar% { - yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni yi[miss] } @@ -503,8 +527,8 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, y.na.mat <- matrix(nrow = 100, ncol = sum(miss)) for (i in seq_len(100)) { - yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni y.na.mat[i, ] <- yi[miss] } diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index 217e106..a8ec2a2 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -178,7 +178,11 @@ U2V <- function(U.obj) { } else if (U.obj$ord.pred != "obspred") { W <- Matrix::tcrossprod(U.y) W.rev <- revMat(W) - V.ord <- Matrix::t(Matrix::chol(W.rev)) + res <- try(V.ord <- Matrix::t(Matrix::chol(W.rev)), silent = TRUE) + if (inherits(res, "try-error")) { + W.rev <- Matrix::nearPD(W.rev) + V.ord <- Matrix::t(Matrix::chol(W.rev)) + } } else { # for obspred ordering last.obs <- max(which(!U.obj$latent)) @@ -192,7 +196,11 @@ U2V <- function(U.obj) { U.oo <- U.y[1:latents.before, 1:last.obs] A <- Matrix::tcrossprod(U.oo) A.rev <- revMat(A) - V.oor <- Matrix::t(Matrix::chol(A.rev)) + res <- try(V.oor <- Matrix::t(Matrix::chol(A.rev)), silent = TRUE) + if (inherits(res, "try-error")) { + A.rev <- Matrix::nearPD(A.rev) + V.oor <- Matrix::t(Matrix::chol(A.rev)) + } # combine the blocks into one matrix zeromat.sparse <- Matrix::sparseMatrix(c(), c(), dims = c(latents.after, latents.before)) @@ -350,9 +358,10 @@ eliminate_dupes <- function(locs, locs.pred = NULL) { list(locs = locs, locs.pred = locs.pred) } -lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, - penalty, alpha, parallel, cluster, foldid, verbose) { - lod <- lod[miss] +lod_reg_mi <- function(y, X, lodu, lodl, miss, n.mi = 10, eps = 0.01, + maxit = 10, penalty, alpha, parallel, cluster, foldid, verbose) { + lodu <- lodu[miss] + lodl <- lodl[miss] last.coef <- rep(Inf, ncol(X) + 1) if (penalty == "lasso" || penalty == "relaxed") { relax <- penalty == "relaxed" @@ -375,7 +384,8 @@ lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, cur.sd <- sqrt(sum(cur.resid^2) / (sum(!miss) - length(last.coef))) coef.mat <- matrix(nrow = n.mi, ncol = length(cur.coef)) for (i in 1:n.mi) { - y[miss] <- rtruncnorm(sum(miss), b = lod, mean = miss.means, sd = cur.sd) + y[miss] <- rtruncnorm(sum(miss), a = lodl, b = lodu, mean = miss.means, + sd = cur.sd) if (penalty == "lasso" || penalty == "relaxed") { cur.glmnet <- cv.glmnet(X, y, parallel = parallel, foldid = foldid, alpha = alpha, relax = relax) @@ -398,7 +408,7 @@ lod_reg_mi <- function(y, X, lod, miss, n.mi = 10, eps = 0.01, maxit = 10, obs.means <- X[!miss, ] %*% cur.coef[-1] + cur.coef[1] cur.resid <- obs.means - y[!miss] cur.sd <- sqrt(sum(cur.resid^2) / (sum(!miss) - length(last.coef))) - y.impute <- etruncnorm(b = lod, mean = miss.means, sd = cur.sd) + y.impute <- etruncnorm(a = lodl, b = lodu, mean = miss.means, sd = cur.sd) list(coef = cur.coef, y.impute = y.impute) } diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 83e367c..57fc752 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -109,7 +109,7 @@ setMethod("prestogp_predict", "VecchiaModel", } ) -setMethod("check_input", "VecchiaModel", function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod) { +setMethod("check_input", "VecchiaModel", function(model, Y, X, locs, Y.names, X.names, center.y, impute.y, lod.upper, lod.lower) { if (!is.matrix(locs)) { stop("locs must be a matrix") } @@ -140,20 +140,34 @@ setMethod("check_input", "VecchiaModel", function(model, Y, X, locs, Y.names, X. if (sum(is.na(Y)) > 0 & !impute.y) { stop("Y contains NA's and impute.y is FALSE. Set impute.y=TRUE to impute missing Y's.") } - if (!is.null(lod)) { - if (!is.numeric(lod)) { - stop("lod must be numeric") + if (!is.null(lod.upper)) { + if (!is.numeric(lod.upper)) { + stop("lod.upper must be numeric") } - if (length(lod) != nrow(X) & length(lod) != 1) { - stop("Length of lod must equal the number of observations") + if (length(lod.upper) != nrow(X) & length(lod.upper) != 1) { + stop("Length of lod.upper must equal the number of observations") + } + } + if (!is.null(lod.lower)) { + if (!is.numeric(lod.lower)) { + stop("lod.lower must be numeric") + } + if (length(lod.lower) != nrow(X) & length(lod.lower) != 1) { + stop("Length of lod.lower must equal the number of observations") } } model@Y_obs <- !is.na(as.vector(Y)) - if (!is.null(lod)) { - if (length(lod) > 1) { - Y[!model@Y_obs] <- lod[!model@Y_obs] + if (!is.null(lod.upper)) { + if (length(lod.upper) > 1) { + Y[!model@Y_obs] <- lod.upper[!model@Y_obs] + } else { + Y[!model@Y_obs] <- lod.upper + } + } else if (!is.null(lod.lower)) { + if (length(lod.lower) > 1) { + Y[!model@Y_obs] <- lod.lower[!model@Y_obs] } else { - Y[!model@Y_obs] <- lod + Y[!model@Y_obs] <- lod.lower } } if (center.y) { @@ -255,7 +269,7 @@ setMethod("impute_y", "VecchiaModel", function(model) { invisible(model) }) -setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, +setMethod("impute_y_lod", "VecchiaModel", function(model, lodu, lodl, n.mi = 10, eps = 0.01, maxit = 1, family, nfolds, foldid, parallel, cluster, verbose) { y <- model@Y_train X <- model@X_train @@ -293,15 +307,15 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, coef.mat <- matrix(nrow = n.mi, ncol = (ncol(X) + 1)) if (parallel) { yi <- foreach(i = seq_len(n.mi), .combine = cbind) %dopar% { - out <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + out <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) out + yhat.ni } } else { yi <- matrix(nrow = length(yhat.ni), ncol = n.mi) for (i in seq_len(n.mi)) { - yi[, i] <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + yi[, i] <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) yi[, i] <- yi[, i] + yhat.ni } } @@ -338,8 +352,8 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, if (parallel) { y.na.mat <- foreach(i = seq_len(100), .combine = rbind) %dopar% { - yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni yi[miss] } @@ -347,8 +361,8 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, n.mi = 10, y.na.mat <- matrix(nrow = 100, ncol = sum(miss)) for (i in seq_len(100)) { - yi <- rtmvn_snn2(y - yhat.ni, rep(-Inf, length(y)), - lod - yhat.ni, miss, locs.nn, Sigma.hat) + yi <- rtmvn_snn2(y - yhat.ni, lodl - yhat.ni, + lodu - yhat.ni, miss, locs.nn, Sigma.hat) yi <- yi + yhat.ni y.na.mat[i, ] <- yi[miss] } @@ -448,7 +462,7 @@ setMethod("transform_data", "VecchiaModel", function(model, Y, X) { ) } - model@y_tilde <- Matrix(transformed.data[, 1]) + model@y_tilde <- Matrix(transformed.data[, 1], sparse = FALSE) model@X_tilde <- Matrix(transformed.data[, -1], sparse = FALSE) invisible(model) }) diff --git a/man/prestogp_fit-PrestoGPModel-method.Rd b/man/prestogp_fit-PrestoGPModel-method.Rd index e85dcbe..f43b18a 100644 --- a/man/prestogp_fit-PrestoGPModel-method.Rd +++ b/man/prestogp_fit-PrestoGPModel-method.Rd @@ -17,10 +17,14 @@ covparams = NULL, beta.hat = NULL, tol = 0.999999, - max_iters = 100, + max.iters = 100, center.y = NULL, impute.y = FALSE, - lod = NULL, + lod.upper = NULL, + lod.lower = NULL, + n.impute = 10, + eps.impute = 0.01, + maxit.impute = 1, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", @@ -71,7 +75,7 @@ is only one scale parameter for each outcome and FALSE otherwise.} \item{tol}{The model is considered converged when error is not less than tol*previous_error (optional). Defaults to 0.999999.} -\item{max_iters}{Maximum number of iterations for the model fitting +\item{max.iters}{Maximum number of iterations for the model fitting procedure. Defaults to 100.} \item{center.y}{Should the Y's be mean centered before fitting the model? @@ -79,14 +83,28 @@ Defaults to TRUE for gaussian models and FALSE for binomial models.} \item{impute.y}{Should missing Y's be imputed? Defaults to FALSE.} -\item{lod}{Limit of detection value(s). Any Y value less than lod is -assumed to be missing when performing missing data imputation. Should be -numeric for univariate models and a list for multivariate models, where -each element of the list corresponds to an outcome. The ith element of -the lod is the limit of detection for observation i. Alternatively, one -can specify a single limit of detection that is assumed to be the same for -all observations. If not specified, it is assumed that no limit of -detection exists. Ignored if impute.y is FALSE.} +\item{lod.upper}{Upper limit of detection value(s). Any missing Y is +assumed to be less than lod.upper when performing missing data imputation. +Should be numeric for univariate models and a list for multivariate models, +where each element of the list corresponds to an outcome. The \emph{i}th +element of the lod is the limit of detection for observation i. +Alternatively, one can specify a single limit of detection that is assumed +to be the same for all observations. If not specified, it is assumed that +no upper limit of detection exists. Ignored if impute.y is FALSE.} + +\item{lod.lower}{Same as lod.upper, except it specifies the lower limit of +detection: missing Y values are assumed to be greater than lod.lower. This +is often equal to 0.} + +\item{n.impute}{How many multiply imputed values of missing y's should be +generated? Defaults to 10.} + +\item{eps.impute}{The multiple imputation procedure will stop if successive +coefficient estimates are within eps.impute of one another. Defaults to +0.01.} + +\item{maxit.impute}{Maximum number of iterations for the multiple imputation +procedure . Defaults to 1. See Details.} \item{quiet}{If FALSE, the penalized log likelihood and the model MSE will be printed for each iteration of the model fitting procedure. No @@ -161,6 +179,17 @@ under the assumption that all scale parameters are equal to 1. For univariate models, the Vecchia approximation will not be recomputed in each iteration of the model fitting procedure if common_scale is TRUE, but the parameter is otherwise ignored. + +If impute.y is TRUE, missing values of y will be imputed. If there is no +limit of detection specified, then missing y's will be imputed using an +EM algorithm. If there are limits of detection, then missing y's will be +imputed using a multiple imputation algorithm based on the current +estimates of the Matern (theta) parameters. Unfortunately, this procedure +is not robust to inaccurate estimates of theta and produce inaccurate +results if theta is misspecified. Thus, the maximum number of iterations is +set to 1 by default. Results can be improved by increasing the number of +iterations if one has confidence in the theta estimates. If impute.y is +FALSE, then any missing y's will produce an error. } \examples{ data(soil) @@ -185,7 +214,8 @@ soil.lod <- quantile(y, 0.1) y.lod <- y y.lod[y.lod <= soil.lod] <- NA soil.vm3 <- new("VecchiaModel", n_neighbors = 10) -soil.vm3 <- prestogp_fit(soil.vm, y, X, locs, impute.y = TRUE, lod = soil.lod) +soil.vm3 <- prestogp_fit(soil.vm, y, X, locs, impute.y = TRUE, +lod.upper = soil.lod) # Full model soil.fm <- new("FullModel") diff --git a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R index cff1a31..439651f 100644 --- a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R +++ b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R @@ -56,25 +56,47 @@ test_that("locs/X length mismatch", { ) }) -test_that("Invalid lod input", { +test_that("Invalid lod.upper input", { model <- new("MultivariateVecchiaModel") expect_error( prestogp_fit( model, list(1:3), list(as.matrix(1:3)), - list(as.matrix(1:3)), lod = 1:2 + list(as.matrix(1:3)), lod.upper = 1:2 ), - "lod must be a list for multivariate models" + "lod.upper must be a list for multivariate models" ) }) -test_that("locs/lod length mismatch", { +test_that("Invalid lod.lower input", { model <- new("MultivariateVecchiaModel") expect_error( prestogp_fit( model, list(1:3), list(as.matrix(1:3)), - list(as.matrix(1:3)), lod = list(1, 2) + list(as.matrix(1:3)), lod.lower = 1:2 ), - "locs and lod must have the same length" + "lod.lower must be a list for multivariate models" + ) +}) + +test_that("locs/lod.upper length mismatch", { + model <- new("MultivariateVecchiaModel") + expect_error( + prestogp_fit( + model, list(1:3), list(as.matrix(1:3)), + list(as.matrix(1:3)), lod.upper = list(1, 2) + ), + "locs and lod.upper must have the same length" + ) +}) + +test_that("locs/lod.lower length mismatch", { + model <- new("MultivariateVecchiaModel") + expect_error( + prestogp_fit( + model, list(1:3), list(as.matrix(1:3)), + list(as.matrix(1:3)), lod.lower = list(1, 2) + ), + "locs and lod.lower must have the same length" ) }) @@ -189,25 +211,47 @@ test_that("NA's in Y", { ) }) -test_that("lod not numeric", { +test_that("lod.upper not numeric", { + model <- new("MultivariateVecchiaModel") + expect_error( + prestogp_fit( + model, list(as.matrix(c(1:4))), list(as.matrix(1:4)), + list(as.matrix(1:4)), lod.upper = list("foo") + ), + "Each lod.upper must be numeric" + ) +}) + +test_that("lod.lower not numeric", { + model <- new("MultivariateVecchiaModel") + expect_error( + prestogp_fit( + model, list(as.matrix(c(1:4))), list(as.matrix(1:4)), + list(as.matrix(1:4)), lod.lower = list("foo") + ), + "Each lod.lower must be numeric" + ) +}) + +test_that("length(lod.upper) != nrow(X)", { model <- new("MultivariateVecchiaModel") expect_error( prestogp_fit( model, list(as.matrix(c(1:4))), list(as.matrix(1:4)), - list(as.matrix(1:4)), lod = list("foo") + list(as.matrix(1:4)), lod.upper = list(1:2) ), - "Each lod must be numeric" + "Length of each lod.upper must equal the number of observations" ) }) -test_that("length(lod) != nrow(X)", { +test_that("length(lod.lower) != nrow(X)", { model <- new("MultivariateVecchiaModel") expect_error( prestogp_fit( model, list(as.matrix(c(1:4))), list(as.matrix(1:4)), - list(as.matrix(1:4)), lod = list(1:2) + list(as.matrix(1:4)), lod.lower = list(1:2) ), - "Length of each lod must equal the number of observations" + "Length of each lod.lower must equal the number of observations" ) }) @@ -372,7 +416,7 @@ test_that("Simulated dataset multivariate spatial", { expect_lt(params.out[11], 1.84) expect_gt(params.out[12], 0.39) expect_lt(params.out[12], 0.52) - expect_gt(params.out[13], 0.17) + expect_gt(params.out[13], 0.12) expect_lt(params.out[13], 0.6) expect_gt(params.out[14], 0.63) expect_lt(params.out[14], 0.83) @@ -459,7 +503,8 @@ test_that("Simulated dataset multivariate spatial", { pgp.mmodel3 <- new("MultivariateVecchiaModel", n_neighbors = 25) pgp.mmodel3 <- prestogp_fit(pgp.mmodel3, y.list.lod, X.st, locs.list, scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, parallel = TRUE, - impute.y = TRUE, lod = lod.cut, optim.control = list(trace = 0, + impute.y = TRUE, lod.upper = lod.cut, lod.lower = as.list(rep(0, 3)), + optim.control = list(trace = 0, maxit = 5000, reltol = 1e-3)) beta.out3 <- get_beta(pgp.mmodel3) params.out3 <- pgp.mmodel3@covparams @@ -482,17 +527,17 @@ test_that("Simulated dataset multivariate spatial", { expect_equal(params.out[1], params.out3[1], tolerance = 2.2) expect_equal(params.out[2], params.out3[2], tolerance = 4.3) expect_equal(params.out[3], params.out3[3], tolerance = 0.6) - expect_equal(params.out[4], params.out3[4], tolerance = 0.15) + expect_equal(params.out[4] - params.out3[4], 0, tolerance = 0.28) expect_equal(params.out[5], params.out3[5], tolerance = 0.42) expect_equal(params.out[6] - params.out3[6], 0, tolerance = 0.23) expect_equal(params.out[7], params.out3[7], tolerance = 1.0) - expect_equal(params.out[8] - params.out3[8], 0, tolerance = 0.4) + expect_equal(params.out[8] - params.out3[8], 0, tolerance = 0.5) expect_equal(params.out[9], params.out3[9], tolerance = 0.8) - expect_equal(params.out[10], params.out3[10], tolerance = 0.22) - expect_equal(params.out[11], params.out3[11], tolerance = 0.22) + expect_equal(params.out[10] - params.out3[10], 0, tolerance = 0.25) + expect_equal(params.out[11], params.out3[11], tolerance = 0.52) expect_equal(params.out[12] - params.out3[12], 0, tolerance = 0.12) expect_equal(params.out[13] - params.out3[13], 0, tolerance = 0.4) - expect_equal(params.out[14], params.out3[14], tolerance = 0.15) + expect_equal(params.out[14] - params.out3[14], 0, tolerance = 0.15) expect_equal(params.out[15], params.out3[15], tolerance = 0.3) # SCAD fit @@ -520,23 +565,23 @@ test_that("Simulated dataset multivariate spatial", { expect_gt(params.out4[1], 1.0) expect_lt(params.out4[1], 3.5) expect_gt(params.out4[2], 2.9) - expect_lt(params.out4[2], 10.6) + expect_lt(params.out4[2], 14.1) expect_gt(params.out4[3], 0.9) expect_lt(params.out4[3], 2.2) expect_gt(params.out4[4], 0.05) expect_lt(params.out4[4], 0.28) - expect_gt(params.out4[5], 0.24) - expect_lt(params.out4[5], 0.69) - expect_gt(params.out4[6], 0.1) + expect_gt(params.out4[5], 0.23) + expect_lt(params.out4[5], 1.06) + expect_gt(params.out4[6], 0.09) expect_lt(params.out4[6], 0.23) expect_gt(params.out4[7], 0.67) expect_lt(params.out4[7], 1.98) expect_gt(params.out4[8], 0.47) expect_lt(params.out4[8], 0.97) expect_gt(params.out4[9], 0.77) - expect_lt(params.out4[9], 1.43) + expect_lt(params.out4[9], 1.64) expect_gt(params.out4[10], 1.02) - expect_lt(params.out4[10], 1.19) + expect_lt(params.out4[10], 1.21) expect_gt(params.out4[11], 1.48) expect_lt(params.out4[11], 1.81) expect_gt(params.out4[12], 0.4) @@ -567,14 +612,14 @@ test_that("Simulated dataset multivariate spatial", { expect_equal(as.numeric(beta.out4[[4]]), as.numeric(beta.out5[[4]]), tolerance = 0.04) expect_equal(params.out4[1], params.out5[1], tolerance = 3.1) - expect_equal(params.out4[2], params.out5[2], tolerance = 7.4) + expect_equal(params.out4[2], params.out5[2], tolerance = 11.3) expect_equal(params.out4[3], params.out5[3], tolerance = 1.6) expect_equal(params.out4[4], params.out5[4], tolerance = 0.9) - expect_equal(params.out4[5], params.out5[5], tolerance = 0.8) + expect_equal(params.out4[5], params.out5[5], tolerance = 0.9) expect_equal(params.out4[6] - params.out5[6], 0, tolerance = 0.4) expect_equal(params.out4[7], params.out5[7], tolerance = 1.5) expect_equal(params.out4[8], params.out5[8], tolerance = 0.7) - expect_equal(params.out4[9], params.out5[9], tolerance = 0.9) + expect_equal(params.out4[9], params.out5[9], tolerance = 1.1) expect_equal(params.out4[10], params.out5[10], tolerance = 0.3) expect_equal(params.out4[11], params.out5[11], tolerance = 0.4) expect_equal(params.out4[12] - params.out5[12], 0, tolerance = 0.14) @@ -586,7 +631,8 @@ test_that("Simulated dataset multivariate spatial", { pgp.mmodel6 <- new("MultivariateVecchiaModel", n_neighbors = 25) pgp.mmodel6 <- prestogp_fit(pgp.mmodel6, y.list.lod, X.st, locs.list, scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, penalty = "SCAD", - impute.y = TRUE, lod = lod.cut, optim.control = list(trace = 0, + impute.y = TRUE, lod.upper = lod.cut, lod.lower = as.list(rep(0, 3)), + optim.control = list(trace = 0, maxit = 5000, reltol = 1e-3)) beta.out6 <- get_beta(pgp.mmodel6) params.out6 <- pgp.mmodel6@covparams @@ -607,20 +653,20 @@ test_that("Simulated dataset multivariate spatial", { pgp.mmodel4@Y_bar[1]), as.numeric(beta.out6[[4]][3] - pgp.mmodel6@Y_bar[3] + pgp.mmodel6@Y_bar[1]), tolerance = 0.02) expect_equal(params.out4[1], params.out6[1], tolerance = 2.1) - expect_equal(params.out4[2], params.out6[2], tolerance = 8.1) + expect_equal(params.out4[2], params.out6[2], tolerance = 9.4) expect_equal(params.out4[3], params.out6[3], tolerance = 0.6) expect_equal(params.out4[4] - params.out6[4], 0, tolerance = 0.2) - expect_equal(params.out4[5], params.out6[5], tolerance = 0.61) + expect_equal(params.out4[5], params.out6[5], tolerance = 0.7) expect_equal(params.out4[6] - params.out6[6], 0, tolerance = 0.29) expect_equal(params.out4[7] - params.out6[7], 0, tolerance = 1.1) expect_equal(params.out4[8] - params.out6[8], 0, tolerance = 0.5) - expect_equal(params.out4[9] - params.out6[9], 0, tolerance = 0.66) - expect_equal(params.out4[10] - params.out6[10], 0, tolerance = 0.25) - expect_equal(params.out4[11], params.out6[11], tolerance = 0.68) - expect_equal(params.out4[12] - params.out6[12], 0, tolerance = 0.1) + expect_equal(params.out4[9] - params.out6[9], 0, tolerance = 0.83) + expect_equal(params.out4[10] - params.out6[10], 0, tolerance = 0.27) + expect_equal(params.out4[11] - params.out6[11], 0, tolerance = 0.83) + expect_equal(params.out4[12] - params.out6[12], 0, tolerance = 0.12) expect_equal(params.out4[13] - params.out6[13], 0, tolerance = 0.39) - expect_equal(params.out4[14] - params.out6[14], 0, tolerance = 0.15) - expect_equal(params.out4[15] - params.out6[15], 0, tolerance = 0.37) + expect_equal(params.out4[14] - params.out6[14], 0, tolerance = 0.2) + expect_equal(params.out4[15] - params.out6[15], 0, tolerance = 0.42) }) test_that("Simulated dataset multivariate spatiotemporal", { @@ -668,7 +714,7 @@ test_that("Simulated dataset multivariate spatiotemporal", { expect_equal(matrix(theta.out[[5]], nrow = nrow(theta.out[[5]])), rho.mat) expect_gt(beta.out[1], -0.02) - expect_lt(beta.out[1], 0.04) + expect_lt(beta.out[1], 0.05) expect_gt(beta.out[2], 0.79) expect_lt(beta.out[2], 0.96) expect_gt(beta.out[3], 0.94) @@ -689,13 +735,13 @@ test_that("Simulated dataset multivariate spatiotemporal", { expect_lt(beta.out[10], 0.06) expect_gt(beta.out[11], -0.001) expect_lt(beta.out[11], 0.06) - expect_gt(beta.out[12], -1.58) + expect_gt(beta.out[12], -2.41) expect_lt(beta.out[12], 2.61) - expect_gt(beta.out[13], 0.94) + expect_gt(beta.out[13], 0.91) expect_lt(beta.out[13], 1.11) expect_gt(beta.out[14], 0.89) expect_lt(beta.out[14], 1.03) - expect_gt(beta.out[15], 0.98) + expect_gt(beta.out[15], 0.95) expect_lt(beta.out[15], 1.13) expect_gt(beta.out[16], 0.81) expect_lt(beta.out[16], 0.92) @@ -722,7 +768,7 @@ test_that("Simulated dataset multivariate spatiotemporal", { expect_gt(beta.out[27], 0.88) expect_lt(beta.out[27], 0.98) expect_gt(beta.out[28], -0.001) - expect_lt(beta.out[28], 0.05) + expect_lt(beta.out[28], 0.06) expect_gt(beta.out[29], -0.08) expect_lt(beta.out[29], 0.001) expect_gt(beta.out[30], -0.14) @@ -735,38 +781,38 @@ test_that("Simulated dataset multivariate spatiotemporal", { expect_lt(beta.out[33], 0.11) expect_gt(params.out[1], 4.5) - expect_lt(params.out[1], 43.8) + expect_lt(params.out[1], 143.8) expect_gt(params.out[2], 3.6) - expect_lt(params.out[2], 23.4) - expect_gt(params.out[3], 2.8) + expect_lt(params.out[2], 29.6) + expect_gt(params.out[3], 2.4) expect_lt(params.out[3], 29.4) expect_gt(params.out[4], 0.07) - expect_lt(params.out[4], 2.3) + expect_lt(params.out[4], 4.2) expect_gt(params.out[5], 7.2) expect_lt(params.out[5], 87.7) expect_gt(params.out[6], 0.03) - expect_lt(params.out[6], 1.64) - expect_gt(params.out[7], 8.4) + expect_lt(params.out[6], 2.26) + expect_gt(params.out[7], 6.7) expect_lt(params.out[7], 57.1) expect_gt(params.out[8], 0.006) expect_lt(params.out[8], 1.09) expect_gt(params.out[9], 0.005) expect_lt(params.out[9], 80.6) expect_gt(params.out[10], 0.42) - expect_lt(params.out[10], 1.09) + expect_lt(params.out[10], 1.13) expect_gt(params.out[11], 0.3) - expect_lt(params.out[11], 1.92) + expect_lt(params.out[11], 1.93) expect_gt(params.out[12], 0.33) expect_lt(params.out[12], 2.09) expect_gt(params.out[13], 0.02) expect_lt(params.out[13], 2.31) expect_gt(params.out[14], 0.03) - expect_lt(params.out[14], 4.45) - expect_gt(params.out[15], 0.11) - expect_lt(params.out[15], 2.62) - expect_gt(params.out[16], -0.5) + expect_lt(params.out[14], 44.9) + expect_gt(params.out[15], 0.01) + expect_lt(params.out[15], 4.79) + expect_gt(params.out[16], -0.99) expect_gt(params.out[17], -0.5) - expect_gt(params.out[18], -0.58) + expect_gt(params.out[18], -0.98) }) test_that("Invalid locs input for prediction", { diff --git a/tests/testthat/test-PrestoGP_Univariate.R b/tests/testthat/test-PrestoGP_Univariate.R index b09ccec..c6104a5 100644 --- a/tests/testthat/test-PrestoGP_Univariate.R +++ b/tests/testthat/test-PrestoGP_Univariate.R @@ -97,25 +97,47 @@ test_that("NA's in Y", { ) }) -test_that("lod not numeric", { +test_that("lod.upper not numeric", { model <- new("VecchiaModel") expect_error( prestogp_fit( model, as.matrix(c(1:4)), as.matrix(1:4), - as.matrix(1:4), impute.y = TRUE, lod = "foo", + as.matrix(1:4), impute.y = TRUE, lod.upper = "foo", ), - "lod must be numeric" + "lod.upper must be numeric" ) }) -test_that("length(lod) != nrow(X)", { +test_that("lod.lower not numeric", { model <- new("VecchiaModel") expect_error( prestogp_fit( model, as.matrix(c(1:4)), as.matrix(1:4), - as.matrix(1:4), impute.y = TRUE, lod = 1:2, + as.matrix(1:4), impute.y = TRUE, lod.lower = "foo", ), - "Length of lod must equal the number of observations" + "lod.lower must be numeric" + ) +}) + +test_that("length(lod.upper) != nrow(X)", { + model <- new("VecchiaModel") + expect_error( + prestogp_fit( + model, as.matrix(c(1:4)), as.matrix(1:4), + as.matrix(1:4), impute.y = TRUE, lod.upper = 1:2, + ), + "Length of lod.upper must equal the number of observations" + ) +}) + +test_that("length(lod.lower) != nrow(X)", { + model <- new("VecchiaModel") + expect_error( + prestogp_fit( + model, as.matrix(c(1:4)), as.matrix(1:4), + as.matrix(1:4), impute.y = TRUE, lod.lower = 1:2, + ), + "Length of lod.lower must equal the number of observations" ) }) @@ -289,7 +311,7 @@ test_that("Simulated dataset spatial", { pgp.model4 <- new("VecchiaModel", n_neighbors = 25) pgp.model4 <- prestogp_fit(pgp.model4, y.na.lod, X, locs, scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, parallel = TRUE, - impute.y = TRUE, lod = lod.cut, + impute.y = TRUE, lod.upper = lod.cut, lod.lower = 0, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 @@ -299,7 +321,7 @@ test_that("Simulated dataset spatial", { params.out4 <- pgp.model4@covparams # Results should be the same after imputation - expect_equal(as.numeric(beta.out[[2]] - mean(y)), beta.out4[1], + expect_equal(as.numeric(beta.out[[2]] - mean(y)) - beta.out4[1], 0, tolerance = 0.004) expect_equal(as.numeric(beta.out[[1]]), beta.out4[-1], tolerance = 0.04) expect_equal(params.out[1] - params.out4[1], 0, tolerance = 0.9) @@ -400,8 +422,8 @@ test_that("Simulated dataset spatial", { pgp.model9 <- new("VecchiaModel", n_neighbors = 25) pgp.model9 <- prestogp_fit(pgp.model9, y.na.lod, X, locs, scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, - impute.y = TRUE, lod = lod.cut, penalty = "SCAD", cluster = cl, - optim.control = list( + impute.y = TRUE, lod.upper = lod.cut, lod.lower = 0, penalty = "SCAD", + cluster = cl, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 ) @@ -411,7 +433,7 @@ test_that("Simulated dataset spatial", { params.out9 <- pgp.model9@covparams # Results should be the same after imputation - expect_equal(as.numeric(beta.out7[[2]] - mean(y)), beta.out9[1], + expect_equal(as.numeric(beta.out7[[2]] - mean(y)) - beta.out9[1], 0, tolerance = 0.004) expect_equal(as.numeric(beta.out7[[1]]), beta.out9[-1], tolerance = 0.02) expect_equal(params.out7[1] - params.out9[1], 0, tolerance = 0.9) @@ -436,7 +458,7 @@ test_that("Simulated dataset spatial", { expect_equal(as.numeric(beta.out10[[2]] - mean(y)), 0.002, tolerance = 0.003) expect_equal(params.out10[1], 1.46, tolerance = 0.2) expect_equal(params.out10[2] - 0.41, 0, tolerance = 0.05) - expect_equal(params.out10[3] - 0.565, 0, tolerance = 0.05) + expect_equal(params.out10[3] - 0.565, 0, tolerance = 0.06) expect_equal(params.out10[4], 2.0, tolerance = 0.1) }) From 36deb68e1b4d6b5bf8ecae28a8ad639848779c81 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Sun, 27 Apr 2025 21:33:07 -0400 Subject: [PATCH 09/19] Fixed a bug in prestogp_predict --- DESCRIPTION | 2 +- NEWS.md | 6 ++++++ R/PrestoGP_Multivariate_Vecchia.R | 12 ++++++------ R/PrestoGP_Vecchia.R | 4 ++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 431b95f..0a5688c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9046 +Version: 0.2.0.9047 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NEWS.md b/NEWS.md index d51f18d..98df9a0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,9 @@ +# PrestoGP 0.2.0.9047 (2025-4-28) + +## BUG FIXES + +* Fixed a bug in the multivariate version of `prestogp_predict` + # PrestoGP 0.2.0.9046 (2025-4-24) ## BREAKING CHANGES diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index 5fc68e0..9e0621a 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -121,19 +121,19 @@ setMethod("prestogp_predict", "MultivariateVecchiaModel", for (i in seq_along(locs)) { ndx.out <- c(ndx.out, rep(i, nrow(locs[[i]]))) } + Vec.mean <- list() + for (i in seq_along(locs)) { + Vec.mean[[i]] <- Vec.mean.all[ndx.out == i] + } + names(Vec.mean) <- names(model@locs_train) if (return.values == "mean") { - Vec.mean <- list() - for (i in seq_along(locs)) { - Vec.mean[[i]] <- Vec.mean.all[ndx.out == i] - } - names(Vec.mean) <- names(model@locs_train) return.list <- list(means = Vec.mean) } else { warning("Variance estimates do not include model fitting variance and are anticonservative. Use with caution.") Vec.sds <- list() for (i in seq_along(locs)) { Vec.sds[[i]] <- sqrt(pred$var.pred[ndx.out == i] + - model@covparams[model@param_sequence[4, i]]) + model@covparams[model@param_sequence[4, 1] + i - 1]) } return.list <- list(means = Vec.mean, sds = Vec.sds) } diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 57fc752..84d02ad 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -101,8 +101,8 @@ setMethod("prestogp_predict", "VecchiaModel", return.list <- list(means = Vec.mean) } else { warning("Variance estimates do not include model fitting variance and are anticonservative. Use with caution.") - Vec.sds <- sqrt(pred$var.pred + model@covparams[4]) # nolint - return.list <- list(means = Vec.mean, sds = Vec.sds) # nolint + Vec.sds <- sqrt(pred$var.pred + model@covparams[4]) + return.list <- list(means = Vec.mean, sds = Vec.sds) } return.list From 245d08f7ff6317169def890285df5ff762e73f24 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Fri, 2 May 2025 22:18:02 -0400 Subject: [PATCH 10/19] Fixed a bug for lod.upper/lod.lower --- DESCRIPTION | 2 +- NEWS.md | 11 +++++++++++ R/PrestoGP_Model.R | 4 ++-- .../test-PrestoGP_Multivariate_Vecchia_Model.R | 6 +++++- tests/testthat/test-PrestoGP_Univariate.R | 4 +++- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0a5688c..cba364d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9047 +Version: 0.2.0.9048 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NEWS.md b/NEWS.md index 98df9a0..3280dea 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,14 @@ +# PrestoGP 0.2.0.9048 (2025-5-2) + +## BUG FIXES + +* Fixed a bug that occurred when lod.upper or lod.lower is a vector of values + +## MINOR IMPROVEMENTS + +* Modified some tests to verify that the bug mentioned above is patched + and does not recur + # PrestoGP 0.2.0.9047 (2025-4-28) ## BUG FIXES diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index f1a858f..016b933 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -968,7 +968,7 @@ setMethod( } lodvu <- NULL for (i in seq_along(lod.upper)) { - if (length(lod.upper[[i]] == 1)) { + if (length(lod.upper[[i]]) == 1) { lod.upper[[i]] <- rep(lod.upper[[i]], nrow(model@locs_train[[i]])) } lodvu <- c(lodvu, lod.upper[[i]] - model@Y_bar[i]) @@ -982,7 +982,7 @@ setMethod( } lodvl <- NULL for (i in seq_along(lod.lower)) { - if (length(lod.lower[[i]] == 1)) { + if (length(lod.lower[[i]]) == 1) { lod.lower[[i]] <- rep(lod.lower[[i]], nrow(model@locs_train[[i]])) } lodvl <- c(lodvl, lod.lower[[i]] - model@Y_bar[i]) diff --git a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R index 439651f..56335ac 100644 --- a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R +++ b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R @@ -428,12 +428,16 @@ test_that("Simulated dataset multivariate spatial", { y.list.na <- y.list y.list.lod <- y.list lod.cut <- list() + lodupper <- list() + lodlower <- list() for (i in seq_along(y.list)) { y.list.na[[i]][sample(seq_along(y.list[[i]]), floor(0.1 * length(y.list[[i]])))] <- NA y.list.lod[[i]] <- y.list.lod[[i]] + 10 lod.cut[[i]] <- quantile(y.list.lod[[i]], 0.1) y.list.lod[[i]][y.list.lod[[i]] <= lod.cut[[i]]] <- NA + lodupper[[i]] <- rep(lod.cut[[i]], length(y.list.lod[[i]])) + lodlower[[i]] <- rep(0, length(y.list.lod[[i]])) } pgp.mmodel2 <- new("MultivariateVecchiaModel", n_neighbors = 25) @@ -503,7 +507,7 @@ test_that("Simulated dataset multivariate spatial", { pgp.mmodel3 <- new("MultivariateVecchiaModel", n_neighbors = 25) pgp.mmodel3 <- prestogp_fit(pgp.mmodel3, y.list.lod, X.st, locs.list, scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, parallel = TRUE, - impute.y = TRUE, lod.upper = lod.cut, lod.lower = as.list(rep(0, 3)), + impute.y = TRUE, lod.upper = lodupper, lod.lower = lodlower, optim.control = list(trace = 0, maxit = 5000, reltol = 1e-3)) beta.out3 <- get_beta(pgp.mmodel3) diff --git a/tests/testthat/test-PrestoGP_Univariate.R b/tests/testthat/test-PrestoGP_Univariate.R index c6104a5..85e9a88 100644 --- a/tests/testthat/test-PrestoGP_Univariate.R +++ b/tests/testthat/test-PrestoGP_Univariate.R @@ -306,12 +306,14 @@ test_that("Simulated dataset spatial", { lod.cut <- quantile(y.lod, 0.1) y.na.lod <- y.lod y.na.lod[y.na.lod <= lod.cut] <- NA + lodupper <- rep(lod.cut, length(y)) + lodlower <- rep(0, length(y)) doParallel::registerDoParallel(cores = 2) pgp.model4 <- new("VecchiaModel", n_neighbors = 25) pgp.model4 <- prestogp_fit(pgp.model4, y.na.lod, X, locs, scaling = c(1, 1), common_scale = TRUE, verbose = TRUE, parallel = TRUE, - impute.y = TRUE, lod.upper = lod.cut, lod.lower = 0, + impute.y = TRUE, lod.upper = lodupper, lod.lower = lodlower, optim.control = list( trace = 0, maxit = 5000, reltol = 1e-3 From 24383268f13210400b1e1e34e9e288c4e6ce8bca Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Tue, 13 May 2025 16:57:55 -0400 Subject: [PATCH 11/19] Fixed another bug caused by numerically singular U matrices --- DESCRIPTION | 2 +- NEWS.md | 7 +++++++ R/PrestoGP_Util_Functions.R | 7 ++++--- tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R | 4 ++-- tests/testthat/test-PrestoGP_Univariate.R | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index cba364d..f5b41c9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9048 +Version: 0.2.0.9049 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NEWS.md b/NEWS.md index 3280dea..dcb6c74 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,10 @@ +# PrestoGP 0.2.0.9049 (2025-5-13) + +## BUG FIXES + +* Fixed another bug in `prestogp_predict` caused by numerically singular + matrices + # PrestoGP 0.2.0.9048 (2025-5-2) ## BUG FIXES diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index a8ec2a2..9b821c9 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -180,7 +180,7 @@ U2V <- function(U.obj) { W.rev <- revMat(W) res <- try(V.ord <- Matrix::t(Matrix::chol(W.rev)), silent = TRUE) if (inherits(res, "try-error")) { - W.rev <- Matrix::nearPD(W.rev) + W.rev <- Matrix::nearPD(W.rev)$mat V.ord <- Matrix::t(Matrix::chol(W.rev)) } } else { # for obspred ordering @@ -198,12 +198,13 @@ U2V <- function(U.obj) { A.rev <- revMat(A) res <- try(V.oor <- Matrix::t(Matrix::chol(A.rev)), silent = TRUE) if (inherits(res, "try-error")) { - A.rev <- Matrix::nearPD(A.rev) + A.rev <- Matrix::nearPD(A.rev)$mat V.oor <- Matrix::t(Matrix::chol(A.rev)) } # combine the blocks into one matrix - zeromat.sparse <- Matrix::sparseMatrix(c(), c(), dims = c(latents.after, latents.before)) + zeromat.sparse <- Matrix::sparseMatrix(c(), c(), + dims = c(latents.after, latents.before)) V.or <- rbind(zeromat.sparse, V.oor) V.ord <- methods::as(cbind(V.pr, V.or), "triangularMatrix") diff --git a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R index 56335ac..f740879 100644 --- a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R +++ b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R @@ -570,7 +570,7 @@ test_that("Simulated dataset multivariate spatial", { expect_lt(params.out4[1], 3.5) expect_gt(params.out4[2], 2.9) expect_lt(params.out4[2], 14.1) - expect_gt(params.out4[3], 0.9) + expect_gt(params.out4[3], 0.8) expect_lt(params.out4[3], 2.2) expect_gt(params.out4[4], 0.05) expect_lt(params.out4[4], 0.28) @@ -746,7 +746,7 @@ test_that("Simulated dataset multivariate spatiotemporal", { expect_gt(beta.out[14], 0.89) expect_lt(beta.out[14], 1.03) expect_gt(beta.out[15], 0.95) - expect_lt(beta.out[15], 1.13) + expect_lt(beta.out[15], 1.14) expect_gt(beta.out[16], 0.81) expect_lt(beta.out[16], 0.92) expect_gt(beta.out[17], -0.21) diff --git a/tests/testthat/test-PrestoGP_Univariate.R b/tests/testthat/test-PrestoGP_Univariate.R index 85e9a88..a1ead24 100644 --- a/tests/testthat/test-PrestoGP_Univariate.R +++ b/tests/testthat/test-PrestoGP_Univariate.R @@ -438,7 +438,7 @@ test_that("Simulated dataset spatial", { expect_equal(as.numeric(beta.out7[[2]] - mean(y)) - beta.out9[1], 0, tolerance = 0.004) expect_equal(as.numeric(beta.out7[[1]]), beta.out9[-1], tolerance = 0.02) - expect_equal(params.out7[1] - params.out9[1], 0, tolerance = 0.9) + expect_equal(params.out7[1] - params.out9[1], 0, tolerance = 1.0) expect_equal(params.out7[2] - params.out9[2], 0, tolerance = 0.2) expect_equal(params.out7[3], params.out9[3], tolerance = 0.4) expect_equal(params.out7[4], params.out9[4], tolerance = 0.3) From 6484043be31ab47b8daeb4793f700082422842d2 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Thu, 13 Nov 2025 15:15:01 -0500 Subject: [PATCH 12/19] Imputation bug fixes --- DESCRIPTION | 4 +- NEWS.md | 17 +++++++ R/PrestoGP_CreateU_Multivariate.R | 6 +-- R/PrestoGP_Model.R | 41 ++++++++-------- R/PrestoGP_Multivariate_Vecchia.R | 4 +- R/PrestoGP_Util_Functions.R | 8 ++-- R/PrestoGP_Vecchia.R | 7 +-- man/prestogp_fit-PrestoGPModel-method.Rd | 12 +++-- tests/testthat/sim_multivariate_big.R | 7 ++- tests/testthat/sim_vecchia.R | 4 +- ...test-PrestoGP_Multivariate_Vecchia_Model.R | 2 +- tests/testthat/test-PrestoGP_Util_Functions.R | 48 +++++++++++++++++++ 12 files changed, 115 insertions(+), 45 deletions(-) create mode 100644 tests/testthat/test-PrestoGP_Util_Functions.R diff --git a/DESCRIPTION b/DESCRIPTION index f5b41c9..f110339 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9049 +Version: 0.2.0.9050 Authors@R: c( person(given = "Eric", family = "Bair", @@ -44,7 +44,7 @@ Imports: License: GPL-3 Encoding: UTF-8 VignetteBuilder: knitr -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 Collate: 'Log_Likelihood.R' 'PrestoGP-package.R' diff --git a/NEWS.md b/NEWS.md index dcb6c74..8114166 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,20 @@ +# PrestoGP 0.2.0.9050 (2025-11-13) + +## BUG FIXES + +* Fixed a bug where covariance matrices were computed incorrectly during + imputation + +* Fixed a bug that caused the imputation procedure to crash for univariate + models without a common scale parameter + +* Fixed a bug where the incorrect number of imputations was performed + +## MINOR IMPROVEMENTS + +* Added additional tests to confirm that imputation covariance matrices are + computed correctly + # PrestoGP 0.2.0.9049 (2025-5-13) ## BUG FIXES diff --git a/R/PrestoGP_CreateU_Multivariate.R b/R/PrestoGP_CreateU_Multivariate.R index d17d737..3e4e35f 100644 --- a/R/PrestoGP_CreateU_Multivariate.R +++ b/R/PrestoGP_CreateU_Multivariate.R @@ -599,9 +599,9 @@ createUMultivariate <- function(vec.approx, params, cov_func = NULL) { full_const <- sigs * gammas * expprod * rho.mat / (aijs^(2 * vijs)) - if (sum(is.na(full_const)) > 0) { - browser() - } + #if (sum(is.na(full_const)) > 0) { + # browser() + #} m <- length(q.list$q.y[[n]]) + length(q.list$q.z[[n]]) q.list$q.y <- lapply(q.list$q.y, function(x) c(x, rep(NA, m - length(x)))) diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index 52a1d3c..7377ca3 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -166,7 +166,7 @@ setGeneric( function(model, Y, X, locs, Y.names = NULL, X.names = NULL, scaling = NULL, common_scale = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, max.iters = 100, center.y = NULL, impute.y = FALSE, lod.upper = NULL, - lod.lower = NULL, n.impute = 10, eps.impute = 0.01, maxit.impute = 1, + lod.lower = NULL, n.impute = 10, eps.impute = 0.01, maxit.impute = 0, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, @@ -279,7 +279,7 @@ setGeneric("estimate_betas", standardGeneric("estimate_betas")}) setGeneric("impute_y", function(model) standardGeneric("impute_y")) setGeneric("impute_y_lod", - function(model, lodu, lodl, n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, + function(model, lodu, lodl, n.mi = 10, eps = 0.01, maxit = 0, family, nfolds, foldid, parallel, cluster, verbose) { standardGeneric("impute_y_lod")}) setGeneric("compute_error", @@ -796,7 +796,8 @@ setMethod( #' coefficient estimates are within eps.impute of one another. Defaults to #' 0.01. #' @param maxit.impute Maximum number of iterations for the multiple imputation -#' procedure . Defaults to 1. See Details. +#' procedure . Defaults to 0 (meaning that the multiple imputation procedure +#' is not executed). See Details. #' @param quiet If FALSE, the penalized log likelihood and the model MSE #' will be printed for each iteration of the model fitting procedure. No #' intermediate output will be printed if TRUE. Defaults to FALSE. @@ -857,9 +858,10 @@ setMethod( #' estimates of the Matern (theta) parameters. Unfortunately, this procedure #' is not robust to inaccurate estimates of theta and produce inaccurate #' results if theta is misspecified. Thus, the maximum number of iterations is -#' set to 1 by default. Results can be improved by increasing the number of -#' iterations if one has confidence in the theta estimates. If impute.y is -#' FALSE, then any missing y's will produce an error. +#' set to 0 by default, meaning that this step is skipped. Results can be +#' improved by increasing the number of iterations if one has confidence in +#' the theta estimates. If impute.y is FALSE, then any missing y's will +#' produce an error. #' #' @return A PrestoGPModel object with slots updated based on the results of #' the model fitting procedure. See \code{\link{PrestoGPModel-class}} for @@ -941,7 +943,7 @@ setMethod( function(model, Y, X, locs, Y.names = NULL, X.names = NULL, scaling = NULL, common_scale = NULL, covparams = NULL, beta.hat = NULL, tol = 0.999999, max.iters = 100, center.y = NULL, impute.y = FALSE, lod.upper = NULL, - lod.lower = NULL, n.impute = 10, eps.impute = 0.01, maxit.impute = 1, + lod.lower = NULL, n.impute = 10, eps.impute = 0.01, maxit.impute = 0, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, @@ -1133,7 +1135,6 @@ setMethod( print(get_theta(model)) } } - # transform data to iid if (!model@common_scale) { model <- specify(model) } @@ -1154,9 +1155,20 @@ setMethod( if (!quiet) { cat("Estimating beta...", "\n") } + # transform data to iid model <- transform_data(model, model@Y_train, model@X_train) model <- estimate_betas(model, family, nfolds, foldid, parallel, cluster, model@penalty, adaptive) + if (model@penalty == "lasso" || model@penalty == "relaxed") { + beta.hat <- as.matrix(predict(model@linear_model, s = "lambda.min", + gamma = "gamma.min", type = "coefficients")) + Y.hat <- as.matrix(predict(model@linear_model, newx = model@X_train, + s = "lambda.min", gamma = "gamma.min", type = "response")) + } else { + beta.hat <- as.matrix(coef(model@linear_model)) + Y.hat <- as.matrix(predict(model@linear_model, model@X_train)) + } + model@beta <- beta.hat if (!quiet) { cat("Estimation of beta complete", "\n") if (verbose) { @@ -1170,16 +1182,6 @@ setMethod( model@error <- prev.error # beta.hat <- sparseToDenseBeta(model@linear_model) # model@beta <- beta.hat - if (model@penalty == "lasso" || model@penalty == "relaxed") { - beta.hat <- as.matrix(predict(model@linear_model, s = "lambda.min", - gamma = "gamma.min", type = "coefficients")) - Y.hat <- as.matrix(predict(model@linear_model, newx = model@X_train, - s = "lambda.min", gamma = "gamma.min", type = "response")) - } else { - beta.hat <- as.matrix(coef(model@linear_model)) - Y.hat <- as.matrix(predict(model@linear_model, model@X_train)) - } - model@beta <- beta.hat if (sum(!model@Y_obs) > 0 & sum(lodvu < Inf) == 0 & sum(lodvl > -Inf) == 0) { if (!quiet) { @@ -1190,11 +1192,12 @@ setMethod( cat("Imputation complete", "\n") } } + beta.iter <- model@beta covparams.iter <- model@covparams Vecchia.SCAD.iter <- model@linear_model } else { model@converged <- TRUE - model@beta <- beta.hat + model@beta <- beta.iter model@covparams <- covparams.iter model@linear_model <- Vecchia.SCAD.iter model@error <- prev.error diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index 9e0621a..9e60fdc 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -419,7 +419,7 @@ setMethod("impute_y", "MultivariateVecchiaModel", function(model) { }) setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lodu, - lodl, n.mi = 10, eps = 0.01, maxit = 1, family, nfolds, foldid, parallel, + lodl, n.mi = 10, eps = 0.01, maxit = 0, family, nfolds, foldid, parallel, cluster, verbose) { y <- model@Y_train X <- model@X_train @@ -465,7 +465,7 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lodu, cur.coef <- as.vector(model@beta) last.coef <- rep(Inf, ncol(X) + 1) itn <- 0 - while (max(abs(cur.coef - last.coef)) > eps & itn <= maxit) { + while (max(abs(cur.coef - last.coef)) > eps & itn < maxit) { itn <- itn + 1 yhat.ni <- X %*% cur.coef[-1] diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index 9b821c9..1481cb8 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -376,7 +376,7 @@ lod_reg_mi <- function(y, X, lodu, lodl, miss, n.mi = 10, eps = 0.01, cur.coef <- as.matrix(coef(cur.ncvreg)) } itn <- 0 - while (max(abs(cur.coef - last.coef)) > eps && itn <= maxit) { + while (max(abs(cur.coef - last.coef)) > eps && itn < maxit) { itn <- itn + 1 last.coef <- cur.coef miss.means <- X[miss, ] %*% last.coef[-1] + last.coef[1] @@ -442,9 +442,9 @@ MMatern_cov <- function(locs, y_ndx, covparams, P) { sqrt(sigma[j]) * alpha.ii^smooth.ii * alpha.jj^smooth.jj * gamma(smooth.ij) / (alpha.ij^(2 * smooth.ij) * sqrt(gamma(smooth.ii) * gamma(smooth.jj))) * - Matern(rdist(locs[which.i, drop = FALSE], - locs[which.j, drop = FALSE]), - alpha = alpha.ij, smoothness = smooth.ij) + Matern(rdist(locs[which.i, , drop = FALSE], + locs[which.j, , drop = FALSE]), alpha = alpha.ij, + smoothness = smooth.ij) if (i != j) { Sigma.hat[which.j, which.i] <- t(Sigma.hat[which.i, which.j]) } else { diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 84d02ad..9ff0c99 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -270,7 +270,7 @@ setMethod("impute_y", "VecchiaModel", function(model) { }) setMethod("impute_y_lod", "VecchiaModel", function(model, lodu, lodl, n.mi = 10, - eps = 0.01, maxit = 1, family, nfolds, foldid, parallel, cluster, verbose) { + eps = 0.01, maxit = 0, family, nfolds, foldid, parallel, cluster, verbose) { y <- model@Y_train X <- model@X_train miss <- !model@Y_obs @@ -281,7 +281,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lodu, lodl, n.mi = 10, model, list(vecchia.approx$locsord) )[[1]] - params <- c(params[1], 1, params[3:4]) + params <- c(params[1], 1, params[3:4], 1) } locs.scaled <- scale_locs(model, model@locs_train)[[1]] @@ -298,7 +298,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lodu, lodl, n.mi = 10, cur.coef <- as.vector(model@beta) last.coef <- rep(Inf, ncol(X) + 1) itn <- 0 - while (max(abs(cur.coef - last.coef)) > eps & itn <= maxit) { + while (max(abs(cur.coef - last.coef)) > eps & itn < maxit) { itn <- itn + 1 yhat.ni <- X %*% cur.coef[-1] @@ -347,6 +347,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lodu, lodl, n.mi = 10, print(cur.coef) } } + yhat.ni <- X %*% cur.coef[-1] yhat.ni <- yhat.ni + mean(y[!miss]) - mean(yhat.ni[!miss]) diff --git a/man/prestogp_fit-PrestoGPModel-method.Rd b/man/prestogp_fit-PrestoGPModel-method.Rd index f43b18a..8e3c2ea 100644 --- a/man/prestogp_fit-PrestoGPModel-method.Rd +++ b/man/prestogp_fit-PrestoGPModel-method.Rd @@ -24,7 +24,7 @@ lod.lower = NULL, n.impute = 10, eps.impute = 0.01, - maxit.impute = 1, + maxit.impute = 0, quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", @@ -104,7 +104,8 @@ coefficient estimates are within eps.impute of one another. Defaults to 0.01.} \item{maxit.impute}{Maximum number of iterations for the multiple imputation -procedure . Defaults to 1. See Details.} +procedure . Defaults to 0 (meaning that the multiple imputation procedure +is not executed). See Details.} \item{quiet}{If FALSE, the penalized log likelihood and the model MSE will be printed for each iteration of the model fitting procedure. No @@ -187,9 +188,10 @@ imputed using a multiple imputation algorithm based on the current estimates of the Matern (theta) parameters. Unfortunately, this procedure is not robust to inaccurate estimates of theta and produce inaccurate results if theta is misspecified. Thus, the maximum number of iterations is -set to 1 by default. Results can be improved by increasing the number of -iterations if one has confidence in the theta estimates. If impute.y is -FALSE, then any missing y's will produce an error. +set to 0 by default, meaning that this step is skipped. Results can be +improved by increasing the number of iterations if one has confidence in +the theta estimates. If impute.y is FALSE, then any missing y's will +produce an error. } \examples{ data(soil) diff --git a/tests/testthat/sim_multivariate_big.R b/tests/testthat/sim_multivariate_big.R index aed9017..a1c51ed 100644 --- a/tests/testthat/sim_multivariate_big.R +++ b/tests/testthat/sim_multivariate_big.R @@ -31,7 +31,7 @@ x.variance <- runif(ny, 1.5, 4) marg.var <- nuggets + x.variance ranges <- runif(ny, 0.5, 1.2) -params.all <- c(x.variance, ranges, marg.smoothness, nuggets, rho.vec) +params.all <- c(marg.var, ranges, marg.smoothness, nuggets, rho.vec) locs.list <- list() for (i in 1:ny) { @@ -80,8 +80,7 @@ for (i in 1:ny) { } rm( - ny, p, p.nz, n.spatial.xy, beta1, i, j, Sigma.X, mean.trend.st, n.rho, + ny, p, p.nz, beta1, i, j, Sigma.X, mean.trend.st, n.rho, loc1, loc2, ndx1, ndx2, dij, vii, vjj, vij, aii, ajj, aij, L.C, - st.error, nug.error, X.all, rho, rho.vec, ranges, Sigma.All, nuggets, - marg.smoothness, marg.var + st.error, nug.error, X.all, rho, rho.vec, ranges, marg.smoothness, marg.var ) diff --git a/tests/testthat/sim_vecchia.R b/tests/testthat/sim_vecchia.R index ecfb02c..38e0ea2 100644 --- a/tests/testthat/sim_vecchia.R +++ b/tests/testthat/sim_vecchia.R @@ -19,7 +19,7 @@ x.variance <- runif(1, 1.5, 4) marg.var <- nuggets + x.variance ranges <- runif(1, 0.5, 1.2) -params.all <- c(x.variance, ranges, marg.smoothness, nuggets) +params.all <- c(marg.var, ranges, marg.smoothness, nuggets) loc1 <- seq(0, 1, length.out = n.spatial.xy) + rnorm(n.spatial.xy, 0, 0.001) @@ -38,6 +38,6 @@ y <- mean.trend.st + st.error + nug.error rm( p, p.nz, n.spatial.xy, beta1, Sigma.X, mean.trend.st, loc1, loc2, L.C, - st.error, nug.error, ranges, Sigma.All, nuggets, marg.smoothness, marg.var, + st.error, nug.error, ranges, nuggets, marg.smoothness, marg.var, x.variance ) diff --git a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R index f740879..49ac87c 100644 --- a/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R +++ b/tests/testthat/test-PrestoGP_Multivariate_Vecchia_Model.R @@ -626,7 +626,7 @@ test_that("Simulated dataset multivariate spatial", { expect_equal(params.out4[9], params.out5[9], tolerance = 1.1) expect_equal(params.out4[10], params.out5[10], tolerance = 0.3) expect_equal(params.out4[11], params.out5[11], tolerance = 0.4) - expect_equal(params.out4[12] - params.out5[12], 0, tolerance = 0.14) + expect_equal(params.out4[12] - params.out5[12], 0, tolerance = 0.15) expect_equal(params.out4[13] - params.out5[13], 0, tolerance = 0.6) expect_equal(params.out4[14] - params.out5[14], 0, tolerance = 0.28) expect_equal(params.out4[15] - params.out5[15], 0, tolerance = 0.27) diff --git a/tests/testthat/test-PrestoGP_Util_Functions.R b/tests/testthat/test-PrestoGP_Util_Functions.R new file mode 100644 index 0000000..582889c --- /dev/null +++ b/tests/testthat/test-PrestoGP_Util_Functions.R @@ -0,0 +1,48 @@ +test_that("revMat", { + foo <- matrix(1:12, nrow = 4, byrow = TRUE) + bar <- matrix(12:1, nrow = 4, byrow = TRUE) + expect_equal(revMat(foo), bar) +}) + +test_that("MMatern_cov univariate", { + source("sim_vecchia.R") + + Sigma.All <- Sigma.All + params.all[4] * diag(ncol(Sigma.All)) + + locs.nn <- nn2(locs, k = 25)$nn.idx + + ndx <- sample(seq_len(nrow(locs.nn)), size = 10) + + Sigma.hat <- array(dim = c(ncol(locs.nn), ncol(locs.nn), 10)) + for (i in 1:10) { + Sigma.hat[, , i] <- MMatern_cov(locs[locs.nn[ndx[i], ], ], + rep(1, ncol(locs.nn)), c(params.all, 1), 1) + expect_lt(sum(abs(Sigma.hat[, , i] - Sigma.All[locs.nn[ndx[i], ], + locs.nn[ndx[i], ]])), 1e-4) + } +}) + +test_that("MMatern_cov multivariate", { + source("sim_multivariate_big.R") + + locs <- NULL + for (i in 1:3) { + locs <- rbind(locs, locs.list[[i]]) + } + + npy <- n.spatial.xy^2 + nuggetv <- c(rep(nuggets[1], npy), rep(nuggets[2], npy), rep(nuggets[3], npy)) + y.ndx <- c(rep(1, npy), rep(2, npy), rep(3, npy)) + Sigma.All <- Sigma.All + nuggetv * diag(ncol(Sigma.All)) + + locs.nn <- nn2(locs, k = 25)$nn.idx + + ndx <- sample(seq_len(nrow(locs.nn)), size = 10) + Sigma.hat <- array(dim = c(ncol(locs.nn), ncol(locs.nn), 10)) + for (i in 1:10) { + Sigma.hat[, , i] <- PrestoGP:::MMatern_cov(locs[locs.nn[ndx[i], ], ], + y.ndx[locs.nn[ndx[i], ]], params.all, 3) + expect_lt(sum(abs(Sigma.hat[, , i] - Sigma.All[locs.nn[ndx[i], ], + locs.nn[ndx[i], ]])), 1e-4) + } +}) From dd33a47d6e7135dd24ac6588d086c748b955faf8 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Thu, 13 Nov 2025 16:29:33 -0500 Subject: [PATCH 13/19] Imputation bug fixes --- R/PrestoGP_Model.R | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index 7377ca3..4495999 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -1159,16 +1159,6 @@ setMethod( model <- transform_data(model, model@Y_train, model@X_train) model <- estimate_betas(model, family, nfolds, foldid, parallel, cluster, model@penalty, adaptive) - if (model@penalty == "lasso" || model@penalty == "relaxed") { - beta.hat <- as.matrix(predict(model@linear_model, s = "lambda.min", - gamma = "gamma.min", type = "coefficients")) - Y.hat <- as.matrix(predict(model@linear_model, newx = model@X_train, - s = "lambda.min", gamma = "gamma.min", type = "response")) - } else { - beta.hat <- as.matrix(coef(model@linear_model)) - Y.hat <- as.matrix(predict(model@linear_model, model@X_train)) - } - model@beta <- beta.hat if (!quiet) { cat("Estimation of beta complete", "\n") if (verbose) { @@ -1182,6 +1172,16 @@ setMethod( model@error <- prev.error # beta.hat <- sparseToDenseBeta(model@linear_model) # model@beta <- beta.hat + if (model@penalty == "lasso" || model@penalty == "relaxed") { + beta.hat <- as.matrix(predict(model@linear_model, s = "lambda.min", + gamma = "gamma.min", type = "coefficients")) + Y.hat <- as.matrix(predict(model@linear_model, newx = model@X_train, + s = "lambda.min", gamma = "gamma.min", type = "response")) + } else { + beta.hat <- as.matrix(coef(model@linear_model)) + Y.hat <- as.matrix(predict(model@linear_model, model@X_train)) + } + model@beta <- beta.hat if (sum(!model@Y_obs) > 0 & sum(lodvu < Inf) == 0 & sum(lodvl > -Inf) == 0) { if (!quiet) { @@ -1192,12 +1192,11 @@ setMethod( cat("Imputation complete", "\n") } } - beta.iter <- model@beta covparams.iter <- model@covparams Vecchia.SCAD.iter <- model@linear_model } else { model@converged <- TRUE - model@beta <- beta.iter + model@beta <- beta.hat model@covparams <- covparams.iter model@linear_model <- Vecchia.SCAD.iter model@error <- prev.error From 5de4c360c67555811999e5ee9f15386ae825583f Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Thu, 13 Nov 2025 16:37:34 -0500 Subject: [PATCH 14/19] Imputation bug fixes --- R/PrestoGP_Vecchia.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 9ff0c99..bf289d7 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -347,7 +347,6 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lodu, lodl, n.mi = 10, print(cur.coef) } } - yhat.ni <- X %*% cur.coef[-1] yhat.ni <- yhat.ni + mean(y[!miss]) - mean(yhat.ni[!miss]) From d1868371decdee2486a4e119d7d57f6242e6c54b Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Tue, 13 Jan 2026 17:46:06 -0500 Subject: [PATCH 15/19] Added omp.cores parameter to prestogp_fit --- DESCRIPTION | 4 +-- R/PrestoGP_CreateU_Multivariate.R | 7 ++-- R/PrestoGP_Model.R | 25 +++++++++++-- R/PrestoGP_Multivariate_Vecchia.R | 1 + R/PrestoGP_Vecchia.R | 3 ++ R/RcppExports.R | 4 +-- man/PrestoGPModel-class.Rd | 6 +++- man/prestogp_fit-PrestoGPModel-method.Rd | 10 +++++- src/RcppExports.cpp | 9 ++--- src/createUMC.cpp | 6 +++- tests/testthat/test-PrestoGP_Model.R | 45 ++++++++++++++++++++++++ 11 files changed, 103 insertions(+), 17 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f110339..2d942e6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9050 +Version: 0.2.0.9051 Authors@R: c( person(given = "Eric", family = "Bair", @@ -21,7 +21,7 @@ Authors@R: c( role = "aut")) Description: Simultaneous variable seletion and estimation of LUR models with spatiotemporally correlated errors that is scalable for big data. Depends: - R (>= 3.5.0) + R (>= 4.1.0) LinkingTo: Rcpp, RcppArmadillo, BH Imports: diff --git a/R/PrestoGP_CreateU_Multivariate.R b/R/PrestoGP_CreateU_Multivariate.R index 3e4e35f..4fb7fc6 100644 --- a/R/PrestoGP_CreateU_Multivariate.R +++ b/R/PrestoGP_CreateU_Multivariate.R @@ -103,7 +103,7 @@ create_param_sequence <- function(P, ns = 1) { } param.sequence.begin <- c(1, P + 1, seq(P * (ns + 1) + 1, length = 3, by = P)) - param.sequence.end <- c(P, ns * P, P, P, nk) %>% cumsum() + param.sequence.end <- c(P, ns * P, P, P, nk) |> cumsum() param.sequence <- cbind(param.sequence.begin, param.sequence.end) param.sequence @@ -470,7 +470,7 @@ vecchia_Mspecify <- function(locs.list, m, locs.list.pred = NULL, ord.pred = ordering.pred, cond.yz = "SGV", conditioning = "NN", P = P, ondx = ondx, dist.func = dist.func, dist.func.code = dist.func.code, q.list = q.list, - n.neighbors = m + n.neighbors = m, n.cores = -1 ) } @@ -609,7 +609,8 @@ createUMultivariate <- function(vec.approx, params, cov_func = NULL) { cur.qys <- do.call(cbind, q.list$q.y) cur.qzs <- do.call(cbind, q.list$q.z) # browser() - U <- createU_helper_mat(olocs, ondx, cur.qys, cur.qzs, vijs, aijs, full_const, nugget, sig2, uvec) + U <- createU_helper_mat(olocs, ondx, cur.qys, cur.qzs, vijs, aijs, + full_const, nugget, sig2, uvec, vec.approx$n.cores) # U <- sparseMatrix(i=U1[1,], j=U1[2,], x = U1[3,], triangular = TRUE) } diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index 4495999..6fd0b45 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -49,6 +49,8 @@ #' @slot nscale The number of scale parameters in the model. #' @slot common_scale Do all columns of locs have the same scale parameter? #' @slot param_sequence Records the indices of the various Matern parameters. +#' @slot omp_cores Number of cores used by OMP to compute the U matrix. +#' @slot logparams Transformed version of the Matern parameters. #' See \code{\link{create_param_sequence}}. #' #' @seealso \code{\link{VecchiaModel-class}}, \code{\link{FullModel-class}}, @@ -97,6 +99,7 @@ PrestoGPModel <- setClass("PrestoGPModel", nscale = "numeric", # the number of scale parameters common_scale = "logical", # is there a common scale parameter? param_sequence = "matrix", # maps the indices of the various Matern parameters + omp_cores = "numeric", # Number of cores used by OMP to compute the U matrix logparams = "numeric" # transformed version of the Matern parameters ) ) @@ -171,7 +174,7 @@ setGeneric( optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, - parallel = FALSE, cluster = NULL, adaptive = FALSE) { + omp.cores = -1, parallel = FALSE, cluster = NULL, adaptive = FALSE) { standardGeneric("prestogp_fit") } ) @@ -827,6 +830,9 @@ setMethod( #' what fold each observation should be assigned to in the cv.glmnet #' cross-validation. See \code{\link[glmnet]{cv.glmnet}} and #' \code{\link[ncvreg]{cv.ncvreg}}. +#' @param omp.cores Number of parallel cores to be used by OMP when computing +#' the U matrix in the Vecchia approximation. Defaults to -1 (which causes +#' all available cores to be used). #' @param parallel Should parallel "foreach" be used to speed up the model #' fitting procedure where possible? Defaults to FALSE. Specifically, #' parallelization will be used for imputation and fitting the cv.glmnet @@ -834,6 +840,9 @@ setMethod( #' only applies to glmnet models (where penalty="lasso" or #' penalty="relaxed"). Models using ncvreg (where penalty="MCP" or #' penalty="SCAD") require a cluster argument for parallelization (see below). +#' Note that parallelization will be used to compute the Vecchia +#' approximation even if this parameter is set to FALSE (assuming that OMP is +#' available on the system). To disable this, set omp.cores=1. #' @param cluster A cluster for running cv.ncvreg in parallel. See #' \code{\link[ncvreg]{cv.ncvreg}} and \code{\link[parallel]{makeCluster}}. #' This must be specified to run cv.ncvreg in parallel. It is ignored for @@ -947,9 +956,19 @@ setMethod( quiet = FALSE, verbose = FALSE, optim.method = "Nelder-Mead", optim.control = list(trace = 0, reltol = 1e-3, maxit = 5000), penalty = c("lasso", "relaxed", "MCP", "SCAD"), alpha = 1, - family = c("gaussian", "binomial"), - nfolds = 10, foldid = NULL, parallel = FALSE, cluster = NULL, + family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, + omp.cores = -1, parallel = FALSE, cluster = NULL, adaptive = FALSE) { + if (!is.numeric(omp.cores)) { + stop("omp.cores must be a positive integer >= 1") + } + if (length(omp.cores) != 1) { + stop("omp.cores must be a positive integer >= 1") + } + if (omp.cores < -1 | omp.cores == 0 | omp.cores %% 1 != 0) { + stop("omp.cores must be a positive integer >= 1") + } + model@omp_cores <- omp.cores penalty <- match.arg(penalty) model@penalty <- penalty family <- match.arg(family) diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index 9e60fdc..39c662c 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -542,6 +542,7 @@ setMethod("specify", "MultivariateVecchiaModel", function(model) { locs <- model@locs_train locs.scaled <- scale_locs(model, locs) model@vecchia_approx <- vecchia_Mspecify(locs.scaled, model@n_neighbors) + model@vecchia_approx$n.cores <- model@omp_cores if (!model@common_scale) { olocs.scaled <- model@vecchia_approx$locsord for (i in seq_along(locs)) { diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index bf289d7..9f1a719 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -383,6 +383,9 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lodu, lodl, n.mi = 10, setMethod("specify", "VecchiaModel", function(model) { locs.scaled <- scale_locs(model, model@locs_train) model@vecchia_approx <- vecchia_specify(locs.scaled[[1]], model@n_neighbors) + if (model@omp_cores > -1) { + model@vecchia_approx$U.prep$n.cores <- model@omp_cores + } if (!model@common_scale) { olocs.scaled <- model@vecchia_approx$locsord for (j in 1:model@nscale) { diff --git a/R/RcppExports.R b/R/RcppExports.R index dd16aaf..03aeb6a 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -5,7 +5,7 @@ na_omit_c <- function(x) { .Call('_PrestoGP_na_omit_c', PACKAGE = 'PrestoGP', x) } -createU_helper_mat <- function(olocs, ondx, curqys, curqzs, vijs, aijs, full_const, nugget, sig2, U_beginning) { - .Call('_PrestoGP_createU_helper_mat', PACKAGE = 'PrestoGP', olocs, ondx, curqys, curqzs, vijs, aijs, full_const, nugget, sig2, U_beginning) +createU_helper_mat <- function(olocs, ondx, curqys, curqzs, vijs, aijs, full_const, nugget, sig2, U_beginning, n_cores) { + .Call('_PrestoGP_createU_helper_mat', PACKAGE = 'PrestoGP', olocs, ondx, curqys, curqzs, vijs, aijs, full_const, nugget, sig2, U_beginning, n_cores) } diff --git a/man/PrestoGPModel-class.Rd b/man/PrestoGPModel-class.Rd index 70965db..48ca2dd 100644 --- a/man/PrestoGPModel-class.Rd +++ b/man/PrestoGPModel-class.Rd @@ -81,7 +81,11 @@ approximation. Ignored for full models.} \item{\code{common_scale}}{Do all columns of locs have the same scale parameter?} -\item{\code{param_sequence}}{Records the indices of the various Matern parameters. +\item{\code{param_sequence}}{Records the indices of the various Matern parameters.} + +\item{\code{omp_cores}}{Number of cores used by OMP to compute the U matrix.} + +\item{\code{logparams}}{Transformed version of the Matern parameters. See \code{\link{create_param_sequence}}.} }} diff --git a/man/prestogp_fit-PrestoGPModel-method.Rd b/man/prestogp_fit-PrestoGPModel-method.Rd index 8e3c2ea..71ac9cb 100644 --- a/man/prestogp_fit-PrestoGPModel-method.Rd +++ b/man/prestogp_fit-PrestoGPModel-method.Rd @@ -34,6 +34,7 @@ family = c("gaussian", "binomial"), nfolds = 10, foldid = NULL, + omp.cores = -1, parallel = FALSE, cluster = NULL, adaptive = FALSE @@ -145,13 +146,20 @@ what fold each observation should be assigned to in the cv.glmnet cross-validation. See \code{\link[glmnet]{cv.glmnet}} and \code{\link[ncvreg]{cv.ncvreg}}.} +\item{omp.cores}{Number of parallel cores to be used by OMP when computing +the U matrix in the Vecchia approximation. Defaults to -1 (which causes +all available cores to be used).} + \item{parallel}{Should parallel "foreach" be used to speed up the model fitting procedure where possible? Defaults to FALSE. Specifically, parallelization will be used for imputation and fitting the cv.glmnet object. See \code{\link[glmnet]{cv.glmnet}}. Note that this only applies to glmnet models (where penalty="lasso" or penalty="relaxed"). Models using ncvreg (where penalty="MCP" or -penalty="SCAD") require a cluster argument for parallelization (see below).} +penalty="SCAD") require a cluster argument for parallelization (see below). +Note that parallelization will be used to compute the Vecchia +approximation even if this parameter is set to FALSE (assuming that OMP is +available on the system). To disable this, set omp.cores=1.} \item{cluster}{A cluster for running cv.ncvreg in parallel. See \code{\link[ncvreg]{cv.ncvreg}} and \code{\link[parallel]{makeCluster}}. diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 3f445f7..1f3f18b 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -23,8 +23,8 @@ BEGIN_RCPP END_RCPP } // createU_helper_mat -arma::sp_mat createU_helper_mat(const arma::mat& olocs, const arma::vec& ondx, const arma::mat& curqys, const arma::mat& curqzs, const arma::mat& vijs, const arma::mat& aijs, const arma::mat& full_const, const arma::vec& nugget, const arma::vec& sig2, const arma::vec& U_beginning); -RcppExport SEXP _PrestoGP_createU_helper_mat(SEXP olocsSEXP, SEXP ondxSEXP, SEXP curqysSEXP, SEXP curqzsSEXP, SEXP vijsSEXP, SEXP aijsSEXP, SEXP full_constSEXP, SEXP nuggetSEXP, SEXP sig2SEXP, SEXP U_beginningSEXP) { +arma::sp_mat createU_helper_mat(const arma::mat& olocs, const arma::vec& ondx, const arma::mat& curqys, const arma::mat& curqzs, const arma::mat& vijs, const arma::mat& aijs, const arma::mat& full_const, const arma::vec& nugget, const arma::vec& sig2, const arma::vec& U_beginning, const int n_cores); +RcppExport SEXP _PrestoGP_createU_helper_mat(SEXP olocsSEXP, SEXP ondxSEXP, SEXP curqysSEXP, SEXP curqzsSEXP, SEXP vijsSEXP, SEXP aijsSEXP, SEXP full_constSEXP, SEXP nuggetSEXP, SEXP sig2SEXP, SEXP U_beginningSEXP, SEXP n_coresSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; @@ -38,14 +38,15 @@ BEGIN_RCPP Rcpp::traits::input_parameter< const arma::vec& >::type nugget(nuggetSEXP); Rcpp::traits::input_parameter< const arma::vec& >::type sig2(sig2SEXP); Rcpp::traits::input_parameter< const arma::vec& >::type U_beginning(U_beginningSEXP); - rcpp_result_gen = Rcpp::wrap(createU_helper_mat(olocs, ondx, curqys, curqzs, vijs, aijs, full_const, nugget, sig2, U_beginning)); + Rcpp::traits::input_parameter< const int >::type n_cores(n_coresSEXP); + rcpp_result_gen = Rcpp::wrap(createU_helper_mat(olocs, ondx, curqys, curqzs, vijs, aijs, full_const, nugget, sig2, U_beginning, n_cores)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_PrestoGP_na_omit_c", (DL_FUNC) &_PrestoGP_na_omit_c, 1}, - {"_PrestoGP_createU_helper_mat", (DL_FUNC) &_PrestoGP_createU_helper_mat, 10}, + {"_PrestoGP_createU_helper_mat", (DL_FUNC) &_PrestoGP_createU_helper_mat, 11}, {NULL, NULL, 0} }; diff --git a/src/createUMC.cpp b/src/createUMC.cpp index 151acfd..d063ddb 100644 --- a/src/createUMC.cpp +++ b/src/createUMC.cpp @@ -51,7 +51,8 @@ arma::sp_mat createU_helper_mat(const arma::mat &olocs, const arma::vec &ondx, const arma::mat &aijs, const arma::mat &full_const, const arma::vec &nugget, const arma::vec &sig2, - const arma::vec &U_beginning) { + const arma::vec &U_beginning, + const int n_cores) { int n = arma::as_scalar(ondx.n_elem); int m = arma::as_scalar(curqys.n_rows); int n_inds = 2 * n * (m + 3); @@ -69,6 +70,9 @@ arma::sp_mat createU_helper_mat(const arma::mat &olocs, const arma::vec &ondx, // feeder(2, arma::span(0,6)) = U_beginning.t(); int ind = 7; // int ind = 0; + if (n_cores > -1) { + omp_set_num_threads(n_cores); + } #ifdef _OPENMP #pragma omp parallel for #endif diff --git a/tests/testthat/test-PrestoGP_Model.R b/tests/testthat/test-PrestoGP_Model.R index 28cb315..8b5ce2f 100644 --- a/tests/testthat/test-PrestoGP_Model.R +++ b/tests/testthat/test-PrestoGP_Model.R @@ -1,3 +1,48 @@ +test_that("omp.cores not numeric", { + source("sim_vecchia_small.R") + pgp.model1 <- new("VecchiaModel") + expect_error( + prestogp_fit(pgp.model1, y, X, locs, omp.cores = "foo"), + "omp.cores must be a positive integer >= 1" + ) +}) + +test_that("omp.cores not a scalar", { + source("sim_vecchia_small.R") + pgp.model1 <- new("VecchiaModel") + expect_error( + prestogp_fit(pgp.model1, y, X, locs, omp.cores = c(1, 2)), + "omp.cores must be a positive integer >= 1" + ) +}) + +test_that("omp.cores negative", { + source("sim_vecchia_small.R") + pgp.model1 <- new("VecchiaModel") + expect_error( + prestogp_fit(pgp.model1, y, X, locs, omp.cores = -2), + "omp.cores must be a positive integer >= 1" + ) +}) + +test_that("omp.cores zero", { + source("sim_vecchia_small.R") + pgp.model1 <- new("VecchiaModel") + expect_error( + prestogp_fit(pgp.model1, y, X, locs, omp.cores = 0), + "omp.cores must be a positive integer >= 1" + ) +}) + +test_that("omp.cores not an integer", { + source("sim_vecchia_small.R") + pgp.model1 <- new("VecchiaModel") + expect_error( + prestogp_fit(pgp.model1, y, X, locs, omp.cores = 2.5), + "omp.cores must be a positive integer >= 1" + ) +}) + test_that("beta.hat not numeric", { source("sim_vecchia_small.R") pgp.model1 <- new("VecchiaModel") From 0eb1dc10d047cefaa2c48fce58fb953c20ce4c24 Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Tue, 20 Jan 2026 15:24:53 -0500 Subject: [PATCH 16/19] Fixed issues caused by numerically singular V matrices --- DESCRIPTION | 2 +- R/Log_Likelihood.R | 38 ++++++++++++++++++++++++++++ R/PrestoGP_Util_Functions.R | 50 ++++++++++++++++++++++++++++++++++++- 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 2d942e6..f293d46 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9051 +Version: 0.2.0.9052 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/R/Log_Likelihood.R b/R/Log_Likelihood.R index b9692ed..be8175e 100644 --- a/R/Log_Likelihood.R +++ b/R/Log_Likelihood.R @@ -59,6 +59,20 @@ negloglik.full <- function(logparams, d, y, param.seq) { -1 * mvtnorm::dmvnorm(y, rep(0, N), cov.mat, log = TRUE) } +vecchia_likelihood <- function(z, vecchia.approx, covparms, nuggets, + covmodel = "matern") { + if (vecchia.approx$cond.yz == "zy") + warning("cond.yz='zy' will produce a poor likelihood approximation. Use 'SGV' instead.") + removeNAs <- getFromNamespace("removeNAs", "GPvecchia") + removeNAs() + U.obj <- createU(vecchia.approx, covparms, nuggets, covmodel) + res <- try(junk <- vecchia_likelihood_U(z, U.obj), silent = TRUE) + if (inherits(res, "try-error")) { + junk <- -1 * Inf + } + junk +} + #' Evaluation of the multivariate Vecchia likelihood #' #' This function is used to evaluate the multivariate Vecchia likelihood. @@ -118,6 +132,30 @@ vecchia_Mlikelihood <- function(z, vecchia.approx, covparams) { } +vecchia_likelihood_U <- function(z, U.obj) { + U <- U.obj$U + latent <- U.obj$latent + zord <- z[U.obj$ord.z] + const <- sum(!latent) * log(2 * pi) + z1 <- Matrix::crossprod(U[!latent, ], zord) + quadform.num <- sum(z1^2) + logdet.num <- -2 * sum(log(Matrix::diag(U))) + if (sum(latent) == 0) { + logdet.denom <- quadform.denom <- 0 + } else { + U.y <- U[latent, ] + z2 <- as.numeric(U.y %*% z1) + V.ord <- U2V(U.obj) + z3 <- Matrix::solve(V.ord, rev(z2), system = "L") + quadform.denom <- sum(z3^2) + logdet.denom <- -2 * sum(log(Matrix::diag(V.ord))) + } + neg2loglik <- logdet.num - logdet.denom + quadform.num - quadform.denom + + const + loglik <- -neg2loglik / 2 + loglik +} + ############################################################################## ### Flexible Multivariate Matern Negative Loglikelihood Function ########### diff --git a/R/PrestoGP_Util_Functions.R b/R/PrestoGP_Util_Functions.R index 1481cb8..6137485 100644 --- a/R/PrestoGP_Util_Functions.R +++ b/R/PrestoGP_Util_Functions.R @@ -226,6 +226,44 @@ revMat <- function(mat) { mat.out } +vecchia_prediction <- function(z, vecchia.approx, covparms, nuggets, + var.exact, covmodel = "matern", return.values = "all") { + removeNAs <- getFromNamespace("removeNAs", "GPvecchia") + removeNAs() + U.obj <- createU(vecchia.approx, covparms, nuggets, covmodel) + V.ord <- U2V(U.obj) + if (length(U.obj$zero.nugg) > 0) + warning("Rows/cols of V have been removed for data with zero noise") + vecchia_mean <- getFromNamespace("vecchia_mean", "GPvecchia") + V.singular <- FALSE + res <- try(vecchia.mean <- vecchia_mean(z, U.obj, V.ord), silent = TRUE) + if (inherits(res, "try-error")) { + warning("V is numerically singular. Predicted means are unreliable.") + V.ord.pd <- Matrix::nearPD(V.ord)$mat + V.singular <- TRUE + vecchia.mean <- vecchia_mean(z, U.obj, V.ord.pd) + } + return.list <- list(mu.pred = vecchia.mean$mu.pred, + mu.obs = vecchia.mean$mu.obs, var.pred = NULL, var.obs = NULL, + V.ord = NULL, U.obj = NULL) + if (return.values == "meanmat" || return.values == "all") { + return.list$V.ord <- V.ord + return.list$U.obj <- U.obj + } + if (return.values == "meanvar" || return.values == "all") { + if (V.singular) { + stop("V is numerically singular. Prediction variance cannot be computed.") + } + if (missing(var.exact)) + var.exact <- (sum(!vecchia.approx$obs) < 4 * 10000) + vecchia_var <- getFromNamespace("vecchia_var", "GPvecchia") + vars.vecchia <- vecchia_var(U.obj, V.ord, exact = var.exact) + return.list$var.pred <- vars.vecchia$vars.pred + return.list$var.obs <- vars.vecchia$vars.obs + } + return.list +} + #' Multivariate Vecchia prediction #' #' This function is used to make predictions based on multivariate Vecchia @@ -296,7 +334,14 @@ vecchia_Mprediction <- function(z, vecchia.approx, covparms, var.exact = NULL, r # if (length(U.obj$zero.nugg) > 0) # warning("Rows/cols of V have been removed for data with zero noise") vecchia_mean <- getFromNamespace("vecchia_mean", "GPvecchia") - vecchia.mean <- vecchia_mean(z, U.obj, V.ord) + V.singular <- FALSE + res <- try(vecchia.mean <- vecchia_mean(z, U.obj, V.ord), silent = TRUE) + if (inherits(res, "try-error")) { + warning("V is numerically singular. Predicted means are unreliable.") + V.ord.pd <- Matrix::nearPD(V.ord)$mat + V.singular <- TRUE + vecchia.mean <- vecchia_mean(z, U.obj, V.ord.pd) + } return.list <- list( mu.pred = vecchia.mean$mu.pred, mu.obs = vecchia.mean$mu.obs, var.pred = NULL, var.obs = NULL, V.ord = NULL, U.obj = NULL @@ -306,6 +351,9 @@ vecchia_Mprediction <- function(z, vecchia.approx, covparms, var.exact = NULL, r return.list$U.obj <- U.obj } if (return.values == "meanvar" || return.values == "all") { + if (V.singular) { + stop("V is numerically singular. Prediction variance cannot be computed.") + } if (is.null(var.exact)) { var.exact <- (sum(!vecchia.approx$obs) < 4 * 10000) } From 848f7961237b218ec193b4a2b354fff7e2d1556b Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Tue, 20 Jan 2026 16:16:05 -0500 Subject: [PATCH 17/19] Modifed the NEWS.md file --- NEWS.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/NEWS.md b/NEWS.md index 8114166..c050767 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,21 @@ +# PrestoGP 0.2.0.9052 (2026-1-20) + +## BUG FIXES + +* Created local versions of several GPvecchia utility functions (e.g., + `vecchia_likelihood`, `vecchia_prediction`) that are robust to numerically + singular U/V matrices. + +* Modified `vecchia_prediction` and `vecchia_Mprediction` to avoid crashes + when the estimated V matrix is numerically singular. + +# PrestoGP 0.2.0.9051 (2026-1-14) + +## NEW FEATURES + +* Added a parameter `omp.cores` to `prestogp_fit` to specify the number of + cores used by OMP when computing the U matrix. + # PrestoGP 0.2.0.9050 (2025-11-13) ## BUG FIXES From d4d98c904d88764ed222d20e786fd7adfe85a5fa Mon Sep 17 00:00:00 2001 From: Eric Bair Date: Tue, 26 May 2026 17:58:44 -0400 Subject: [PATCH 18/19] Fixed a bug where then length check on beta.hat was invalid --- DESCRIPTION | 4 ++-- NEWS.md | 7 +++++++ R/PrestoGP_Model.R | 3 +-- man/PrestoGP-package.Rd | 1 + 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f293d46..7b50f38 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: PrestoGP Type: Package Title: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes -Version: 0.2.0.9052 +Version: 0.2.0.9053 Authors@R: c( person(given = "Eric", family = "Bair", @@ -44,7 +44,6 @@ Imports: License: GPL-3 Encoding: UTF-8 VignetteBuilder: knitr -RoxygenNote: 7.3.3 Collate: 'Log_Likelihood.R' 'PrestoGP-package.R' @@ -67,3 +66,4 @@ Suggests: testthat (>= 3.0.0) Config/testthat/edition: 3 URL: https://niehs.github.io/PrestoGP/, https://github.com/NIEHS/PrestoGP +Config/roxygen2/version: 8.0.0 diff --git a/NEWS.md b/NEWS.md index c050767..9ba59ad 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,10 @@ +# PrestoGP 0.2.0.9053 (2026-5-26) + +## BUG FIXES + +* Fixed a bug where specifying the beta.hat parameter to `prestogp_fit` + caused an error due to a faulty length check. + # PrestoGP 0.2.0.9052 (2026-1-20) ## BUG FIXES diff --git a/R/PrestoGP_Model.R b/R/PrestoGP_Model.R index 6fd0b45..17e7cb9 100644 --- a/R/PrestoGP_Model.R +++ b/R/PrestoGP_Model.R @@ -1013,8 +1013,7 @@ setMethod( if (!is.vector(beta.hat) | !is.numeric(beta.hat)) { stop("beta.hat parameter must be a numeric vector") } - if (length(beta.hat) != (ncol(model@X_train) + - length(model@locs_train))) { + if (length(beta.hat) != (ncol(model@X_train) + 1)) { stop("Length of beta.hat must match the number of predictors") } beta.hat <- as.matrix(beta.hat) diff --git a/man/PrestoGP-package.Rd b/man/PrestoGP-package.Rd index 84e2edb..7b9c43a 100644 --- a/man/PrestoGP-package.Rd +++ b/man/PrestoGP-package.Rd @@ -23,6 +23,7 @@ Useful links: Authors: \itemize{ + \item Eric Bair \email{eric.bair@sciome.com} \item Brian Kidd \item Eric Wimberley \item Deepak Mav From fda72c8e8213981bf0d57375f09da9d0bb303f5f Mon Sep 17 00:00:00 2001 From: sciome-bot Date: Tue, 2 Jun 2026 14:33:08 -0400 Subject: [PATCH 19/19] Pull request #88: Fix prestogp_fit stability and beta.hat validation