From 2ce73ced5f3c7e915db65146338d2147b0157aa9 Mon Sep 17 00:00:00 2001 From: Sciome Bot Date: Tue, 20 Aug 2024 12:23:28 -0400 Subject: [PATCH] Pull request #54: Faster imputation Squashed commit of the following: commit edef68fe245572e3166194949163893c8d5f305f Merge: 1144744 ca1db91 Author: Eric Bair Date: Tue Aug 20 12:19:27 2024 -0400 Pull request #53: Faster imputation Merge in STAT/prestogp from eb-dev to master * commit 'ca1db918136625308410d0ae6a37c5d834292fc2': Faster imputation commit ca1db918136625308410d0ae6a37c5d834292fc2 Author: Eric Bair Date: Mon Aug 19 20:40:28 2024 -0400 Faster imputation commit 1144744233a78c7f779607e41e17a5efeb7a4363 Merge: 30ee16f 3d3ff39 Author: sciome-bot Date: Tue Jul 30 10:09:31 2024 -0400 Merge branch 'main-sciome' commit 3d3ff39dd2ce80a8f20de4d3fb4af412d3f798ad Merge: a80245d f661f11 Author: sciome-bot Date: Tue Jul 30 09:38:32 2024 -0400 Merge branch 'main' into main-sciome commit 30ee16f394a5129c21ac78ff5a4e8dc0cd90ba0c Merge: bc7485f fe89b1d Author: Eric Bair Date: Tue Jul 30 08:21:10 2024 -0400 Fixed an R CMD check issue * commit 'fe89b1d98a2c721a591248bbd350def08b1b8a29': Fixed an R CMD check issue commit fe89b1d98a2c721a591248bbd350def08b1b8a29 Author: Eric Bair Date: Mon Jul 29 16:26:09 2024 -0400 Fixed an R CMD check issue commit bc7485f1e0b3e6fd71eb1c600b81afede2900368 Merge: aa730b5 ad848a2 Author: Eric Bair Date: Mon Jul 29 10:50:32 2024 -0400 Improved imputation, bug fixes * commit 'ad848a27747b933f69f4405a33dac346e4a7d51a': Improved imputation, bug fixes Improved imputation, bug fixes commit f661f1154b6fc3d8ca69385f9dd4279ee505e906 Merge: bcecebd 052209a Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Thu Jul 25 13:29:24 2024 -0400 Merge pull request #66 from NIEHS/kpm-logo usethis logo for site commit 052209a8d3c5969808a365eca1e2226faa1239d4 Author: kyle-messier Date: Thu Jul 25 12:48:25 2024 -0400 removing link in readme commit 613d6d04eae4a54b84e9c3d9da1c77f90ca37b83 Author: kyle-messier Date: Thu Jul 25 09:15:00 2024 -0400 usethis logo for site commit ad848a27747b933f69f4405a33dac346e4a7d51a Author: Eric Bair Date: Tue Jul 23 04:31:47 2024 -0400 Improved imputation, bug fixes commit 5a2b45ca362fa74fdf1eb1c7ea62915a2e63e498 Author: Eric Bair Date: Tue Jul 23 04:22:44 2024 -0400 Improved imputation, bug fixes commit bcecebd320d12c54c920ab0cc1fe176b15bdb740 Merge: 1d3285c 7f5cc9d Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Sat Jul 20 13:39:54 2024 -0400 Merge pull request #65 from NIEHS/kyle-messier-patch-1 Update README.md commit 7f5cc9d2cb130eb7df98b449266e10863860ab12 Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Sat Jul 20 13:39:43 2024 -0400 Update README.md commit 1d3285c465f509744a756ad1feaf50d0d9cd2c4b Merge: 4402255 c8254d4 Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Fri Jul 19 21:24:23 2024 -0400 Merge pull request #64 from NIEHS/kyle-messier-patch-3 Update README.md commit c8254d47927747f6a727d9ba856ee07b50e388b1 Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Fri Jul 19 21:24:13 2024 -0400 Update README.md commit 44022558347ca5ba8ca6d1616cf9386c8fa5ff66 Merge: 0306390 ed0bd09 Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Fri Jul 19 20:43:58 2024 -0400 Merge pull request #63 from NIEHS/kyle-messier-patch-2 Update _pkgdown.yml commit ed0bd0964674a7d7e5ee09e207586b8d1ebc5b1b Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Fri Jul 19 20:01:18 2024 -0400 Update _pkgdown.yml commit 030639021c23310be29653d304c7742452d9d8dc Merge: 96b046f 3dfa637 Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Fri Jul 19 15:13:54 2024 -0400 Merge pull request #62 from NIEHS/kyle-messier-patch-1 Update README.md commit 3dfa6375629d2417bc66d0c521b6b5cdda25fbf9 Author: {SET}group <127860447+kyle-messier@users.noreply.github.com> Date: Thu Jul 18 22:17:04 2024 -0400 Update README.md Fixing badges and workflows from previous direct commit ... and 65 more commits --- DESCRIPTION | 2 +- NAMESPACE | 2 + R/PrestoGP-package.R | 3 +- R/PrestoGP_CreateU_Multivariate.R | 2 +- R/PrestoGP_Multivariate_Vecchia.R | 182 ++++++++++++++++++++++++++---- R/PrestoGP_Vecchia.R | 143 +++++++++++++++++++---- README.md | 8 +- _pkgdown.yml | 5 + man/PrestoGP-package.Rd | 2 + man/figures/logo.png | Bin 0 -> 68642 bytes 10 files changed, 304 insertions(+), 45 deletions(-) create mode 100644 man/figures/logo.png diff --git a/DESCRIPTION b/DESCRIPTION index 48cc691..f449b8f 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.9033 +Version: 0.2.0.9034 Authors@R: c( person(given = "Eric", family = "Bair", diff --git a/NAMESPACE b/NAMESPACE index 5b4f687..13e12bd 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -23,6 +23,7 @@ import(MASS) import(Matrix) import(fields) import(glmnet) +importFrom(RANN,nn2) importFrom(aod,wald.test) importFrom(dplyr,"%>%") importFrom(foreach,"%dopar%") @@ -39,6 +40,7 @@ importFrom(rlang,enquos) importFrom(stats,coef) importFrom(stats,optim) importFrom(stats,predict) +importFrom(stats,rnorm) importFrom(stats,var) importFrom(tmvtnorm,rtmvnorm) importFrom(truncnorm,etruncnorm) diff --git a/R/PrestoGP-package.R b/R/PrestoGP-package.R index 2412371..d05d540 100644 --- a/R/PrestoGP-package.R +++ b/R/PrestoGP-package.R @@ -10,11 +10,12 @@ #' @importFrom methods validObject #' @importFrom stats coef #' @importFrom utils getFromNamespace -#' @importFrom stats optim predict var +#' @importFrom stats optim predict var rnorm #' @importFrom aod wald.test #' @importFrom dplyr %>% #' @importFrom truncnorm rtruncnorm #' @importFrom truncnorm etruncnorm #' @importFrom tmvtnorm rtmvnorm +#' @importFrom RANN nn2 ## usethis namespace: end NULL diff --git a/R/PrestoGP_CreateU_Multivariate.R b/R/PrestoGP_CreateU_Multivariate.R index a472409..2757f42 100644 --- a/R/PrestoGP_CreateU_Multivariate.R +++ b/R/PrestoGP_CreateU_Multivariate.R @@ -182,7 +182,7 @@ knn_indices <- function(ordered_locs, query, n_neighbors, dist_func, dist_func_c "distances" = dists[nearest_neighbors] )) } else { - cur.nn <- RANN::nn2(ordered_locs, query, n_neighbors) + cur.nn <- nn2(ordered_locs, query, n_neighbors) return(list("indices" = cur.nn$nn.idx, "distances" = cur.nn$nn.dists)) } } diff --git a/R/PrestoGP_Multivariate_Vecchia.R b/R/PrestoGP_Multivariate_Vecchia.R index ee93d0c..611ba41 100644 --- a/R/PrestoGP_Multivariate_Vecchia.R +++ b/R/PrestoGP_Multivariate_Vecchia.R @@ -328,6 +328,7 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, vecchia.approx <- model@vecchia_approx params <- model@covparams param.seq <- model@param_sequence + P <- length(model@locs_train) if (!model@apanasovich) { olocs.scaled <- vecchia.approx$locsord for (i in 1:vecchia.approx$P) { @@ -343,17 +344,53 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, vecchia.approx$locsord <- olocs.scaled params <- c(params[1:param.seq[1, 2]], rep(1, vecchia.approx$P), params[param.seq[3, 1]:param.seq[5, 2]]) - param.seq <- create.param.sequence(vecchia.approx$P) } - U.obj <- createUMultivariate(vecchia.approx, params) - Sigma.hat <- solve(U.obj$U %*% t(U.obj$U)) - Sigma.hat <- Sigma.hat[U.obj$latent, U.obj$latent] - Sigma.hat <- Sigma.hat[order(U.obj$ord), order(U.obj$ord)] + locs.scaled <- scale_locs(model, model@locs_train) + locs.all <- NULL nugget.seq <- NULL - for (i in 1:vecchia.approx$P) { + ndx <- list() + 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)] + } + } + 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 <- Sigma.hat + nugget.seq * diag(nrow = nrow(Sigma.hat)) @@ -366,13 +403,65 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, yhat.ni <- X %*% cur.coef[-1] yhat.ni <- yhat.ni + mean(y[!miss]) - mean(yhat.ni[!miss]) - mu.miss <- as.vector(yhat.ni[miss] + Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], y[!miss] - yhat.ni[!miss])) - Sigma.miss <- Sigma.hat[miss, miss] - Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], Sigma.hat[!miss, miss]) - - y.na.mat <- rtmvnorm(n.mi, mean = mu.miss, sigma = Sigma.miss, - upper = lod[miss], algorithm = "gibbs") + if (parallel) { + y.na.mat <- foreach(i = which(miss), .combine = cbind) %dopar% { + cur.nn <- locs.nn[i, ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(10, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(10, mu.miss, as.numeric(Sigma.miss)) + } + cur.out + } + } else { + y.na.mat <- matrix(nrow = 10, ncol = sum(miss)) + + for (i in seq_len(ncol(y.na.mat))) { + cur.nn <- locs.nn[which(miss)[i], ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(10, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(10, mu.miss, as.numeric(Sigma.miss)) + } + y.na.mat[, i] <- cur.out + } + } coef.mat <- matrix(nrow = n.mi, ncol = (ncol(X) + 1)) for (i in 1:n.mi) { @@ -384,7 +473,7 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, cur.glmnet <- cv.glmnet(as.matrix(Xt), as.matrix(yt), alpha = model@alpha, family = family, nfolds = nfolds, foldid = foldid, parallel = parallel) - coef.mat[i, ] <- as.matrix(coef(cur.glmnet, cur.glmnet$lambda.min)) + coef.mat[i, ] <- as.matrix(coef(cur.glmnet, s = "lambda.min")) } last.coef <- cur.coef cur.coef <- colMeans(coef.mat) @@ -392,13 +481,66 @@ setMethod("impute_y_lod", "MultivariateVecchiaModel", function(model, lod, yhat.ni <- X %*% cur.coef[-1] yhat.ni <- yhat.ni + mean(y[!miss]) - mean(yhat.ni[!miss]) - mu.miss <- as.vector(yhat.ni[miss] + Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], y[!miss] - yhat.ni[!miss])) - Sigma.miss <- Sigma.hat[miss, miss] - Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], Sigma.hat[!miss, miss]) + if (parallel) { + y.na.mat <- foreach(i = which(miss), .combine = cbind) %dopar% { + cur.nn <- locs.nn[i, ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(100, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(100, mu.miss, as.numeric(Sigma.miss)) + } + cur.out + } + } else { + y.na.mat <- matrix(nrow = 100, ncol = sum(miss)) + + for (i in seq_len(ncol(y.na.mat))) { + cur.nn <- locs.nn[which(miss)[i], ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(100, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(100, mu.miss, as.numeric(Sigma.miss)) + } + y.na.mat[, i] <- cur.out + } + } - y.na.mat <- rtmvnorm(100, mean = mu.miss, sigma = Sigma.miss, - upper = lod[miss], algorithm = "gibbs") model@Y_train[miss] <- colMeans(y.na.mat) invisible(model) }) diff --git a/R/PrestoGP_Vecchia.R b/R/PrestoGP_Vecchia.R index 05a132f..d128f17 100644 --- a/R/PrestoGP_Vecchia.R +++ b/R/PrestoGP_Vecchia.R @@ -215,7 +215,7 @@ setMethod("impute_y", "VecchiaModel", function(model) { }) setMethod("impute_y_lod", "VecchiaModel", function(model, lod, - n.mi = 10, eps = 0.01, maxit = 5, family, nfolds, foldid, parallel) { + n.mi = 10, eps = 0.01, maxit = 10, family, nfolds, foldid, parallel) { y <- model@Y_train X <- model@X_train miss <- !model@Y_obs @@ -229,11 +229,11 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, params <- c(params[1], 1, params[3:4]) } - U.obj <- createU(vecchia.approx, params[1:3], params[4]) - Sigma.hat <- solve(U.obj$U %*% t(U.obj$U)) - Sigma.hat <- Sigma.hat[U.obj$latent, U.obj$latent] - Sigma.hat <- Sigma.hat[order(U.obj$ord), order(U.obj$ord)] - Sigma.hat <- Sigma.hat + params[4] * diag(nrow = nrow(Sigma.hat)) + locs.scaled <- scale_locs(model, model@locs_train)[[1]] + locs.nn <- nn2(locs.scaled, k = model@n_neighbors)$nn.idx + Sigma.hat <- params[1] * Matern(rdist(locs.scaled), range = params[2], + smoothness = params[3]) + params[4] * diag(nrow = nrow(locs.scaled)) + cur.coef <- as.vector(model@beta) last.coef <- rep(Inf, ncol(X) + 1) itn <- 0 @@ -243,13 +243,65 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, yhat.ni <- X %*% cur.coef[-1] yhat.ni <- yhat.ni + mean(y[!miss]) - mean(yhat.ni[!miss]) - mu.miss <- as.vector(yhat.ni[miss] + Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], y[!miss] - yhat.ni[!miss])) - Sigma.miss <- Sigma.hat[miss, miss] - Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], Sigma.hat[!miss, miss]) + if (parallel) { + y.na.mat <- foreach(i = which(miss), .combine = cbind) %dopar% { + cur.nn <- locs.nn[i, ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(10, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(10, mu.miss, as.numeric(Sigma.miss)) + } + cur.out + } + } else { + y.na.mat <- matrix(nrow = 10, ncol = sum(miss)) - y.na.mat <- rtmvnorm(n.mi, mean = mu.miss, sigma = Sigma.miss, - upper = lod[miss], algorithm = "gibbs") + for (i in seq_len(ncol(y.na.mat))) { + cur.nn <- locs.nn[which(miss)[i], ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(10, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(10, mu.miss, as.numeric(Sigma.miss)) + } + y.na.mat[, i] <- cur.out + } + } coef.mat <- matrix(nrow = n.mi, ncol = (ncol(X) + 1)) for (i in 1:n.mi) { @@ -261,7 +313,7 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, cur.glmnet <- cv.glmnet(as.matrix(Xt), as.matrix(yt), alpha = model@alpha, family = family, nfolds = nfolds, foldid = foldid, parallel = parallel) - coef.mat[i, ] <- as.matrix(coef(cur.glmnet, cur.glmnet$lambda.min)) + coef.mat[i, ] <- as.matrix(coef(cur.glmnet, s = "lambda.min")) } last.coef <- cur.coef cur.coef <- colMeans(coef.mat) @@ -269,13 +321,66 @@ setMethod("impute_y_lod", "VecchiaModel", function(model, lod, yhat.ni <- X %*% cur.coef[-1] yhat.ni <- yhat.ni + mean(y[!miss]) - mean(yhat.ni[!miss]) - mu.miss <- as.vector(yhat.ni[miss] + Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], y[!miss] - yhat.ni[!miss])) - Sigma.miss <- Sigma.hat[miss, miss] - Sigma.hat[miss, !miss] %*% - solve(Sigma.hat[!miss, !miss], Sigma.hat[!miss, miss]) + if (parallel) { + y.na.mat <- foreach(i = which(miss), .combine = cbind) %dopar% { + cur.nn <- locs.nn[i, ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(100, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(100, mu.miss, as.numeric(Sigma.miss)) + } + cur.out + } + } else { + y.na.mat <- matrix(nrow = 100, ncol = sum(miss)) + + for (i in seq_len(ncol(y.na.mat))) { + cur.nn <- locs.nn[which(miss)[i], ] + cur.miss <- miss[cur.nn] + cur.y <- y[cur.nn] + cur.yhat <- yhat.ni[cur.nn] + cur.Sigma <- Sigma.hat[cur.nn, cur.nn] + if (sum(cur.miss) == length(cur.miss)) { + mu.miss <- cur.yhat + Sigma.miss <- cur.Sigma + } else { + mu.miss <- as.vector(cur.yhat[cur.miss] + + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.y[!cur.miss] - cur.yhat[!cur.miss])) + Sigma.miss <- cur.Sigma[cur.miss, cur.miss] - + cur.Sigma[cur.miss, !cur.miss, drop = FALSE] %*% + solve(cur.Sigma[!cur.miss, !cur.miss], + cur.Sigma[!cur.miss, cur.miss, drop = FALSE]) + } + if (length(mu.miss) > 1) { + cur.out <- rtmvnorm(100, mean = mu.miss, sigma = Sigma.miss, + upper = lod[cur.nn][cur.miss], algorithm = "gibbs")[, 1] + } else { + cur.out <- rnorm(100, mu.miss, as.numeric(Sigma.miss)) + } + y.na.mat[, i] <- cur.out + } + } - y.na.mat <- rtmvnorm(100, mean = mu.miss, sigma = Sigma.miss, - upper = lod[miss], algorithm = "gibbs") model@Y_train[miss] <- colMeans(y.na.mat) invisible(model) }) diff --git a/README.md b/README.md index 593f4bf..c5ac076 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -## **PrestoGP**: **P**enalized **Re**gression on **S**patio-**T**emporal **O**utcomes using **G**aussian **P**rocess +# **PrestoGP**: **P**enalized **Re**gression on **S**patio-**T**emporal **O**utcomes using **G**aussian **P**rocess + + [![R-CMD-check](https://github.com/NIEHS/PrestoGP/actions/workflows/check-standard.yaml/badge.svg)](https://github.com/NIEHS/PrestoGP/actions/workflows/check-standard.yaml) [![test-coverage-local](https://github.com/NIEHS/PrestoGP/actions/workflows/test-coverage.yaml/badge.svg)](https://github.com/NIEHS/PrestoGP/actions/workflows/test-coverage.yaml) @@ -8,9 +10,9 @@ [![Lifecycle: experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) -PrestoGP Logo -# Overview + +# Overview PrestoGP is an R package for scalable penalized regression on spatio-temporal outcomes using Gaussian processes. The package includes the methods described in the paper "Scalable penalized spatiotemporal land-use regression for ground-level nitrogen dioxide" by Messier and Katzfuss (2020). The package is designed to handle big data and is useful for large-scale geospatial exposure assessment and geophysical modeling. PrestoGP expands the methods in Messier and Katzfuss (2020) to include the following important feature: diff --git a/_pkgdown.yml b/_pkgdown.yml index 5f11815..5487abc 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,4 +1,9 @@ url: https://niehs.github.io/PrestoGP/ template: bootstrap: 5 + bootswatch: minty +navbar: + structure: + left: [reference, articles, search] + right: [github] diff --git a/man/PrestoGP-package.Rd b/man/PrestoGP-package.Rd index 2ad6f73..674f053 100644 --- a/man/PrestoGP-package.Rd +++ b/man/PrestoGP-package.Rd @@ -6,6 +6,8 @@ \alias{PrestoGP-package} \title{PrestoGP: Penalized Regression for Spatio-Temporal Outcomes via Gaussian Processes} \description{ +\if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} + Simultaneous variable seletion and estimation of LUR models with spatiotemporally correlated errors that is scalable for big data. } \seealso{ diff --git a/man/figures/logo.png b/man/figures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7acf96c1227821898315b081299d2c0c1f9783 GIT binary patch literal 68642 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