From 4ba7cf1a54649b600d88c512c028d8eb524ff00c Mon Sep 17 00:00:00 2001 From: Amalan-ConStat Date: Wed, 8 Jan 2025 22:13:05 +1000 Subject: [PATCH] Rprofvis is used for optimisation of code --- .Rbuildignore | 2 +- DESCRIPTION | 5 +- NAMESPACE | 3 + NeEDS4BigData.Rproj | 2 +- R/ALoptimalGLMSub.R | 51 ++-- R/AoptimalGauLMSub.R | 22 +- R/AoptimalMCGLMSub.R | 54 ++-- R/Big_data.R | 45 ++- R/LCCsampling.R | 10 +- R/LeverageSampling.R | 103 +++---- R/modelMissLinSub.R | 120 ++++---- R/modelMissLogSub.R | 77 ++--- R/modelMissPoiSub.R | 130 ++++---- R/modelRobustLinSub.R | 45 ++- R/modelRobustLogSub.R | 45 ++- R/modelRobustPoiSub.R | 45 ++- _pkgdown.yml | 6 +- inst/WORDLIST | 7 +- man/ALoptimalGLMSub.Rd | 9 +- man/AoptimalGauLMSub.Rd | 3 +- man/AoptimalMCGLMSub.Rd | 9 +- man/GenGLMdata.Rd | 30 +- man/LCCsampling.Rd | 2 +- man/LeverageSampling.Rd | 6 +- man/modelRobustLinSub.Rd | 5 +- man/modelRobustLogSub.Rd | 3 +- man/modelRobustPoiSub.Rd | 3 +- renv.lock | 151 ++++++---- renv/activate.R | 105 ++++++- tests/testthat/test-GenGLMdata.R | 4 +- vignettes/Basic_Sampling_Lin_Reg.Rmd | 18 +- vignettes/Basic_Sampling_Log_Reg.Rmd | 36 ++- vignettes/Basic_Sampling_Poi_Reg.Rmd | 32 +- vignettes/Benchmarking_model_based.Rmd | 271 +++++++++++++++++ vignettes/Benchmarking_model_robust.Rmd | 284 ++++++++++++++++++ vignettes/Linear_Regression.Rmd | 16 +- vignettes/Logistic_Regression.Rmd | 10 +- vignettes/Poisson_Regression.Rmd | 10 +- .../additionaldata/Results_Model_based.Rdata | Bin 0 -> 106387 bytes .../additionaldata/Results_Model_robust.Rdata | Bin 0 -> 109087 bytes 40 files changed, 1248 insertions(+), 531 deletions(-) create mode 100644 vignettes/Benchmarking_model_based.Rmd create mode 100644 vignettes/Benchmarking_model_robust.Rmd create mode 100644 vignettes/additionaldata/Results_Model_based.Rdata create mode 100644 vignettes/additionaldata/Results_Model_robust.Rdata diff --git a/.Rbuildignore b/.Rbuildignore index ae62917..5b2ee19 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -21,4 +21,4 @@ ^CRAN-SUBMISSION$ ^doc$ ^Meta$ -^vignettes$ +^vignettes diff --git a/DESCRIPTION b/DESCRIPTION index 5134b47..b455f9e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -13,6 +13,8 @@ License: MIT + file LICENSE URL: https://github.com/Amalan-ConStat/NeEDS4BigData,https://amalan-constat.github.io/NeEDS4BigData/index.html BugReports: https://github.com/Amalan-ConStat/NeEDS4BigData/issues +Depends: + R (>= 4.0.0) Imports: dplyr, foreach, @@ -21,6 +23,7 @@ Imports: ggplot2, ggridges, matrixStats, + mvnfast, psych, Rdpack, Rfast, @@ -42,6 +45,4 @@ Language: en-GB LazyData: true LazyDataCompression: xz RoxygenNote: 7.3.1 -Depends: - R (>= 3.5.0) Config/testthat/edition: 3 diff --git a/NAMESPACE b/NAMESPACE index f275c34..5c9db53 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -31,10 +31,13 @@ importFrom(Rdpack,reprompt) importFrom(Rfast,rowprods) importFrom(dplyr,group_by) importFrom(dplyr,summarise) +importFrom(gam,lo) importFrom(gam,s) importFrom(ggh4x,facet_grid2) importFrom(matrixStats,rowSums2) +importFrom(mvnfast,rmvn) importFrom(psych,tr) importFrom(rlang,.data) importFrom(tidyr,pivot_longer) importFrom(tidyr,starts_with) +importFrom(utils,combn) diff --git a/NeEDS4BigData.Rproj b/NeEDS4BigData.Rproj index b6d689d..473c4a7 100644 --- a/NeEDS4BigData.Rproj +++ b/NeEDS4BigData.Rproj @@ -19,6 +19,6 @@ StripTrailingWhitespace: Yes BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace,vignette +PackageRoxygenize: rd,collate,namespace SpellingDictionary: en_GB diff --git a/R/ALoptimalGLMSub.R b/R/ALoptimalGLMSub.R index 03102b5..17dc365 100644 --- a/R/ALoptimalGLMSub.R +++ b/R/ALoptimalGLMSub.R @@ -64,8 +64,7 @@ #' #' r1<-300; r2<-rep(600,50); Original_Data<-Full_Data$Complete_Data; #' -#' ALoptimalGLMSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' ALoptimalGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' family = "linear")->Results #' @@ -77,8 +76,7 @@ #' #' r1<-300; r2<-rep(600,50); Original_Data<-Full_Data$Complete_Data; #' -#' ALoptimalGLMSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' ALoptimalGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' family = "logistic")->Results #' @@ -90,8 +88,7 @@ #' #' r1<-300; r2<-rep(600,50); Original_Data<-Full_Data$Complete_Data; #' -#' ALoptimalGLMSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' ALoptimalGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' family = "poisson")->Results #' @@ -129,7 +126,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ if(family %in% c("linear")){ PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] @@ -137,8 +134,8 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ pinv.prop <- N pinv.prop <- 1/PI.prop[idx.prop] - beta.prop<-solve(a=t(x.prop)%*%x.prop,b=t(x.prop)%*%y.prop) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(x.prop),b= crossprod(x.prop,y.prop)) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Epsilon.prop<-Y-Xbeta_Final @@ -161,7 +158,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ PI.mVc<-PI.mVc/sum(PI.mVc) ## mMSE - PI.mMSE<-sqrt(Epsilon.prop^2 * matrixStats::rowSums2((X %*% solve(t(X)%*%X))^2)) + PI.mMSE<-sqrt(Epsilon.prop^2 * matrixStats::rowSums2((X %*% solve(crossprod(X)))^2)) PI.mMSE<-PI.mMSE/sum(PI.mMSE) message("Step 1 of the algorithm completed.\n") @@ -169,7 +166,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ for (i in 1:length(r2)) { ## mVc - idx.mVc <- sample(1:N, r2[i]-r1, T, PI.mVc) + idx.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mVc) x.mVc <- X[c(idx.mVc, idx.prop),] y.mVc <- Y[c(idx.mVc, idx.prop)] @@ -178,8 +175,8 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ pi4_r<-sqrt(r2[i]*pinv.mVc^(-1)) X_r4<-x.mVc/pi4_r Y_r4<-y.mVc/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Sample.mVc[[i+1]]<-idx.mVc; @@ -191,7 +188,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ } ## mMSE - idx.mMSE <- sample(1:N, r2[i]-r1, T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mMSE) x.mMSE <- X[c(idx.mMSE, idx.prop),] y.mMSE <- Y[c(idx.mMSE, idx.prop)] @@ -200,8 +197,8 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ pi4_r<-sqrt(r2[i]*pinv.mMSE^(-1)) X_r4<-x.mMSE/pi4_r Y_r4<-y.mMSE/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Sample.mMSE[[i+1]]<-idx.mMSE; @@ -242,7 +239,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ n0 <- N - n1 PI.prop <- rep(1/(2*n0), N) PI.prop[Y==1] <- 1/(2*n1) - idx.prop <- sample(1:N, r1, T, PI.prop) + idx.prop <- sample(1:N, size = r1, replace = TRUE, prob = PI.prop) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] @@ -274,7 +271,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ ## mMSE p.prop <- P.prop[idx.prop] w.prop <- p.prop * (1 - p.prop) - W.prop <- solve(t(x.prop) %*% (x.prop * w.prop * pinv.prop)) + W.prop <- solve(crossprod(x.prop,x.prop * w.prop * pinv.prop)) PI.mMSE<-sqrt((Y - P.prop)^2 * matrixStats::rowSums2((X%*%W.prop)^2)) PI.mMSE <- PI.mMSE/sum(PI.mMSE) @@ -284,7 +281,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ for (i in 1:length(r2)) { ## mVc - idx.mVc <- sample(1:N, r2[i]-r1, T, PI.mVc) + idx.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mVc) x.mVc <- X[c(idx.mVc, idx.prop), ] y.mVc <- Y[c(idx.mVc, idx.prop)] @@ -307,7 +304,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ Utility_mVc[i,-1]<-c(psych::tr(V_Final),det(solve(V_Final))) ## mMSE - idx.mMSE <- sample(1:N, r2[i]-r1, T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mMSE) x.mMSE <- X[c(idx.mMSE, idx.prop),] y.mMSE <- Y[c(idx.mMSE, idx.prop)] @@ -356,14 +353,14 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ } if(family %in% "poisson"){ PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) x.prop<-X[idx.prop,] y.prop <- Y[idx.prop,] pinv.prop <- N pinv.prop <- 1/PI.prop[idx.prop] - fit.prop <- stats::glm(y.prop~x.prop-1,family = "poisson") + fit.prop <- stats::glm(y.prop~x.prop-1,family = "quasipoisson") beta.prop <- fit.prop$coefficients if(anyNA(beta.prop)){ @@ -389,7 +386,7 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ ## mMSE w.prop <- P.prop[idx.prop] - W.prop <- solve(t(x.prop) %*% (x.prop * w.prop * pinv.prop)) + W.prop <- solve(crossprod(x.prop,x.prop * w.prop * pinv.prop)) PI.mMSE<-sqrt((Y - P.prop)^2 * matrixStats::rowSums2((X%*%W.prop)^2)) PI.mMSE <- PI.mMSE/sum(PI.mMSE) @@ -399,13 +396,13 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ for (i in 1:length(r2)) { ## mVc - idx.mVc <- sample(1:N, r2[i]-r1, T, PI.mVc) + idx.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mVc) x.mVc <- X[c(idx.mVc, idx.prop),] y.mVc <- Y[c(idx.mVc, idx.prop)] pinv.mVc<-c(1 / PI.mVc[idx.mVc], pinv.prop) - fit.mVc <-stats::glm(y.mVc~x.mVc-1, family = "poisson",weights=pinv.mVc) + fit.mVc <-stats::glm(y.mVc~x.mVc-1, family = "quasipoisson",weights=pinv.mVc) Sample.mVc[[i+1]]<-idx.mVc; beta.mVc[i,-1] <- fit.mVc$coefficients @@ -422,13 +419,13 @@ ALoptimalGLMSub <- function(r1,r2,Y,X,N,family){ Utility_mVc[i,-1]<-c(psych::tr(V_Final),det(solve(V_Final))) ## mMSE - idx.mMSE <- sample(1:N, r2[i]-r1, T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mMSE) x.mMSE <- X[c(idx.mMSE, idx.prop),] y.mMSE <- Y[c(idx.mMSE, idx.prop)] pinv.mMSE<-c(1 / PI.mMSE[idx.mMSE], pinv.prop) - fit.mMSE <- stats::glm(y.mMSE~x.mMSE-1, family = "poisson",weights=pinv.mMSE) + fit.mMSE <- stats::glm(y.mMSE~x.mMSE-1, family = "quasipoisson",weights=pinv.mMSE) Sample.mMSE[[i+1]]<-idx.mMSE; beta.mMSE[i,-1] <-fit.mMSE$coefficients diff --git a/R/AoptimalGauLMSub.R b/R/AoptimalGauLMSub.R index 8826d23..98a9dca 100644 --- a/R/AoptimalGauLMSub.R +++ b/R/AoptimalGauLMSub.R @@ -52,14 +52,14 @@ #' #' r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; #' -#' AoptimalGauLMSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' AoptimalGauLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]), #' N = nrow(Original_Data))->Results #' #' plot_Beta(Results) #' #' @importFrom Rdpack reprompt +#' @importFrom matrixStats rowSums2 #' @export AoptimalGauLMSub <- function(r1,r2,Y,X,N){ if(any(is.na(c(r1,r2,N))) | any(is.nan(c(r1,r2,N)))){ @@ -70,7 +70,7 @@ AoptimalGauLMSub <- function(r1,r2,Y,X,N){ stop("r1 or N has a value greater than length one") } - if(any(is.na(cbind(Y,X))) | any(is.nan(cbind(Y,X)))){ + if(anyNA(Y) | anyNA(X) | any(is.nan(Y)) | any(is.nan(X)) ){ stop("NA or Infinite or NAN values in the Y or X") } @@ -83,7 +83,7 @@ AoptimalGauLMSub <- function(r1,r2,Y,X,N){ } PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] @@ -91,8 +91,8 @@ AoptimalGauLMSub <- function(r1,r2,Y,X,N){ pinv.prop <- N pinv.prop <- 1/PI.prop[idx.prop] - beta.prop<-solve(a=t(x.prop)%*%x.prop,b=t(x.prop)%*%y.prop) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(x.prop),b= crossprod(x.prop,y.prop)) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Epsilon.prop<-Y-Xbeta_Final @@ -101,7 +101,7 @@ AoptimalGauLMSub <- function(r1,r2,Y,X,N){ } Second <- (Epsilon.prop^2 - Var.prop)^2/(4 * N^2 * Var.prop) - ML_Inv <- solve(t(X)%*%X) + ML_Inv <- solve(crossprod(X)) beta.mMSE<-matrix(nrow = length(r2),ncol = ncol(X)+1 ) Var_Epsilon<-matrix(nrow = length(r2),ncol = 2) @@ -114,7 +114,7 @@ AoptimalGauLMSub <- function(r1,r2,Y,X,N){ colnames(Var_Epsilon)<-c("r2","A-Optimality") ## mMSE - PI.mMSE <- sqrt(Epsilon.prop^2 * rowSums((X %*% ML_Inv)^2) + Second) + PI.mMSE <- sqrt(Epsilon.prop^2 * matrixStats::rowSums2((X %*% ML_Inv)^2) + Second) PI.mMSE <- PI.mMSE/sum(PI.mMSE) message("Step 1 of the algorithm completed.\n") @@ -122,7 +122,7 @@ AoptimalGauLMSub <- function(r1,r2,Y,X,N){ for (i in 1:length(r2)) { ## mMSE - idx.mMSE <- sample(1:N, r2[i]-r1, T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mMSE) x.mMSE <- X[c(idx.mMSE, idx.prop),] y.mMSE <- Y[c(idx.mMSE, idx.prop)] @@ -131,8 +131,8 @@ AoptimalGauLMSub <- function(r1,r2,Y,X,N){ pi4_r<-sqrt(r2[i]*pinv.mMSE^(-1)) X_r4<-x.mMSE/pi4_r Y_r4<-y.mMSE/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Sample.mMSE[[i+1]]<-idx.mMSE; diff --git a/R/AoptimalMCGLMSub.R b/R/AoptimalMCGLMSub.R index 0806ca4..91dd46b 100644 --- a/R/AoptimalMCGLMSub.R +++ b/R/AoptimalMCGLMSub.R @@ -59,8 +59,7 @@ #' #' r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; #' -#' AoptimalMCGLMSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' AoptimalMCGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' family = "linear")->Results #' @@ -72,8 +71,7 @@ #' #' r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; #' -#' AoptimalMCGLMSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' AoptimalMCGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' family = "logistic")->Results #' @@ -85,8 +83,7 @@ #' #' r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; #' -#' AoptimalMCGLMSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' AoptimalMCGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' family = "poisson")->Results #' @@ -94,7 +91,6 @@ #' #' @importFrom Rdpack reprompt #' @import stats -#' @importFrom psych tr #' @importFrom matrixStats rowSums2 #' @export AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ @@ -124,7 +120,7 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ if(family %in% c("linear")){ PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] @@ -132,8 +128,8 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ pinv.prop <- N pinv.prop <- 1/PI.prop[idx.prop] - beta.prop<-solve(a=t(x.prop)%*%x.prop,b=t(x.prop)%*%y.prop) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(x.prop),b= crossprod(x.prop,y.prop)) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Epsilon.prop<-Y-Xbeta_Final @@ -152,7 +148,7 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ colnames(Var_Epsilon)<-c("r2","A-Optimality") ## mMSE - PI.mMSE<-sqrt(matrixStats::rowSums2((X %*% solve(t(X)%*%X))^2)) + PI.mMSE<-sqrt(matrixStats::rowSums2((X %*% solve(crossprod(X)))^2)) PI.mMSE<-PI.mMSE/sum(PI.mMSE) message("Step 1 of the algorithm completed.\n") @@ -160,17 +156,17 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ for (i in 1:length(r2)) { ## mMSE - idx.mMSE <- sample(1:N, r2[i], T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.mMSE) - x.mMSE <- X[c(idx.mMSE),] - y.mMSE <- Y[c(idx.mMSE)] + x.mMSE <- X[idx.mMSE,] + y.mMSE <- Y[idx.mMSE] pinv.mMSE<-c(1 / PI.mMSE[idx.mMSE]) pi4_r<-sqrt(r2[i]*pinv.mMSE^(-1)) X_r4<-x.mMSE/pi4_r Y_r4<-y.mMSE/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final1<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Sample.mMSE[[i+1]]<-idx.mMSE @@ -209,7 +205,7 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ n0 <- N - n1 PI.prop <- rep(1/(2*n0), N) PI.prop[Y==1] <- 1/(2*n1) - idx.prop <- sample(1:N, r1, T, PI.prop) + idx.prop <- sample(1:N, size = r1, replace = TRUE, prob = PI.prop) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] @@ -234,7 +230,7 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ ## mMSE p.prop <- P.prop[idx.prop] w.prop <- p.prop * (1 - p.prop) - W.prop <- r1*solve(t(x.prop) %*% (x.prop * w.prop * pinv.prop)) + W.prop <- r1*solve(crossprod(x.prop,(x.prop * w.prop * pinv.prop))) PI.mMSE<-sqrt(P.prop*(1-P.prop))*sqrt(matrixStats::rowSums2((X%*%W.prop)^2)) PI.mMSE <- PI.mMSE/sum(PI.mMSE) @@ -244,10 +240,10 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ for (i in 1:length(r2)) { ## mMSE - idx.mMSE <- sample(1:N, r2[i], T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.mMSE) - x.mMSE <- X[c(idx.mMSE),] - y.mMSE <- Y[c(idx.mMSE)] + x.mMSE <- X[idx.mMSE,] + y.mMSE <- Y[idx.mMSE] fit.mMSE <- .getMLE(x=x.mMSE, y=y.mMSE,w=c(1 / PI.mMSE[idx.mMSE])) Sample.mMSE[[i+1]]<-idx.mMSE @@ -279,14 +275,14 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ } if(family %in% "poisson"){ PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) - x.prop<-X[idx.prop,] + x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] pinv.prop <- N pinv.prop <- 1/PI.prop[idx.prop] - fit.prop <- stats::glm(y.prop~x.prop-1,family = "poisson") + fit.prop <- stats::glm(y.prop~x.prop-1,family = "quasipoisson") beta.prop <- fit.prop$coefficients if(anyNA(beta.prop)){ @@ -305,7 +301,7 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ ## mMSE w.prop <- P.prop[idx.prop] - W.prop <- r1*solve(t(x.prop) %*% (x.prop * w.prop * pinv.prop)) + W.prop <- r1*solve(crossprod(x.prop,x.prop * w.prop * pinv.prop)) PI.mMSE<-sqrt(P.prop)*sqrt(matrixStats::rowSums2((X%*%W.prop)^2)) PI.mMSE <- PI.mMSE/sum(PI.mMSE) @@ -315,13 +311,13 @@ AoptimalMCGLMSub <- function(r1,r2,Y,X,N,family){ for (i in 1:length(r2)) { ## mMSE - idx.mMSE <- sample(1:N, r2[i], T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.mMSE) - x.mMSE <- X[c(idx.mMSE),] - y.mMSE <- Y[c(idx.mMSE)] + x.mMSE <- X[idx.mMSE,] + y.mMSE <- Y[idx.mMSE] pinv.mMSE<-c(1 / PI.mMSE[idx.mMSE]) - fit.mMSE <- stats::glm(y.mMSE~x.mMSE-1, family = "poisson",weights=pinv.mMSE) + fit.mMSE <- stats::glm(y.mMSE~x.mMSE-1, family = "quasipoisson",weights=pinv.mMSE) Sample.mMSE[[i+1]]<-idx.mMSE beta.mMSE[i,-1] <-fit.mMSE$coefficients diff --git a/R/Big_data.R b/R/Big_data.R index 8eb4c30..8a584b5 100644 --- a/R/Big_data.R +++ b/R/Big_data.R @@ -86,14 +86,14 @@ #' Generate data for Generalised Linear Models #' #' Function to simulate big data under linear, logistic and Poisson regression for sampling. -#' Covariate data X is through Normal or Uniform distribution for linear regression. -#' Covariate data X is through Exponential or Normal or Uniform distribution for logistic regression. +#' Covariate data X is through Normal, Multivariate Normal or Uniform distribution for linear regression. +#' Covariate data X is through Exponential, Normal, Multivariate Normal or Uniform distribution for logistic regression. #' Covariate data X is through Normal or Uniform distribution for Poisson regression. #' #' @usage #' GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,family) #' -#' @param Dist a character value for the distribution "Normal" or "Uniform or "Exponential" +#' @param Dist a character value for the distribution "Normal", "MVNormal", "Uniform or "Exponential" #' @param Dist_Par a list of parameters for the distribution that would generate data for covariate X #' @param No_Of_Var number of variables #' @param Beta a vector for the model parameters, including the intercept @@ -105,8 +105,8 @@ #' regression types. #' #' We have limited the covariate data generation for -#' linear regression through normal and uniform distribution, -#' logistic regression through exponential, normal and uniform and +#' linear regression through normal, multivariate normal and uniform distribution, +#' logistic regression through exponential, normal, multivariate normal and uniform distribution #' Poisson regression through normal and uniform distribution. #' #' @return @@ -118,17 +118,30 @@ #' \insertRef{lee1996hierarchical}{NeEDS4BigData} #' #' @examples -#' Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1,Error_Variance=0.5) -#' No_Of_Var<-2; Beta<-c(-1,2,1); N<-5000; Family<-"linear" +#' No_Of_Var<-2; Beta<-c(-1,2,1); N<-5000; +#' +#' # Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1,Error_Variance=0.5) +#' Dist<-"MVNormal"; +#' Dist_Par<-list(Mean=rep(0,No_Of_Var),Variance=diag(rep(2,No_Of_Var)),Error_Variance=0.5) +#' # Dist<-"Uniform"; Dist_Par<-list(Min=0,Max=1) +#' +#' Family<-"linear" #' Results<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) #' -#' Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1); Family<-"logistic" +#' Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1); +#' # Dist<-"MVNormal"; Dist_Par<-list(Mean=rep(0,No_Of_Var),Variance=diag(rep(2,No_Of_Var))) +#' # Dist<-"Exponential"; Dist_Par<-list(Rate=3) +#' # Dist<-"Uniform"; Dist_Par<-list(Min=0,Max=1) +#' +#' Family<-"logistic" #' Results<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) #' -#' Dist<-"Normal"; Family<-"poisson" +#' # Dist<-"Normal"; +#' Dist<-"Uniform"; Family<-"poisson" #' Results<-GenGLMdata(Dist,NULL,No_Of_Var,Beta,N,Family) #' #' @import stats +#' @importFrom mvnfast rmvn #' @export GenGLMdata<-function(Dist,Dist_Par,No_Of_Var,Beta,N,family){ if(any(is.na(c(Dist,Beta,No_Of_Var,N,family))) | any(is.nan(c(Dist,No_Of_Var,Beta,N,family)))){ @@ -148,14 +161,14 @@ GenGLMdata<-function(Dist,Dist_Par,No_Of_Var,Beta,N,family){ } if(family == "linear"){ - if(!(Dist == "Normal" | Dist == "Uniform")){ - stop("For linear regression select the distribution 'Normal' \n or 'Uniform' to generate the covarate data") + if(!(Dist == "Normal" | Dist == "MVNormal" | Dist == "Uniform")){ + stop("For linear regression select the distribution 'Normal', 'MVNormal' \n or 'Uniform' to generate the covarate data") } } if(family == "logistic"){ - if(!(Dist == "Exponential" | Dist == "Normal" | Dist == "Uniform")){ - stop("For logistic regression select the distribution 'Exponential', \n 'Normal' or 'Uniform' to generate the covarate data") + if(!(Dist == "Exponential" | Dist == "Normal" | Dist == "MVNormal" | Dist == "Uniform")){ + stop("For logistic regression select the distribution 'Exponential', \n 'Normal', 'MVNormal' or 'Uniform' to generate the covarate data") } } @@ -169,6 +182,9 @@ GenGLMdata<-function(Dist,Dist_Par,No_Of_Var,Beta,N,family){ if(Dist %in% "Normal"){ X<-replicate(No_Of_Var,stats::rnorm(n = N, mean = Dist_Par$Mean, sd = sqrt(Dist_Par$Variance))) } + if(Dist %in% "MVNormal"){ + X<-mvnfast::rmvn(n = N, mu = Dist_Par$Mean, sigma = sqrt(Dist_Par$Variance)) + } if(Dist %in% "Uniform"){ X<-replicate(No_Of_Var,stats::runif(n = N, min = Dist_Par$Min, max = Dist_Par$Max)) } @@ -193,6 +209,9 @@ GenGLMdata<-function(Dist,Dist_Par,No_Of_Var,Beta,N,family){ if(Dist %in% "Normal"){ X<-replicate(No_Of_Var,stats::rnorm(n = N, mean = Dist_Par$Mean, sd = sqrt(Dist_Par$Variance))) } + if(Dist %in% "MVNormal"){ + X<-mvnfast::rmvn(n = N, mu = Dist_Par$Mean, sigma = sqrt(Dist_Par$Variance)) + } if(Dist %in% "Uniform"){ X<-replicate(No_Of_Var,stats::runif(n = N, min = Dist_Par$Min, max = Dist_Par$Max)) } diff --git a/R/LCCsampling.R b/R/LCCsampling.R index 4586b9a..5a7ca19 100644 --- a/R/LCCsampling.R +++ b/R/LCCsampling.R @@ -52,7 +52,7 @@ #' #' r1<-300; r2<-rep(100*c(6,9,12),50); Original_Data<-Full_Data$Complete_Data; #' -#' LCCsampling(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' LCCsampling(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]), #' N = nrow(Original_Data))->Results #' @@ -85,7 +85,7 @@ LCCsampling<-function(r1,r2,Y,X,N){ n0 <- N - n1 PI.prop <- rep(1/(2*n0), N) PI.prop[Y==1] <- 1/(2*n1) - idx.prop <- sample(1:N, r1, T, PI.prop) + idx.prop <- sample(1:N, size = r1, replace = TRUE, prob = PI.prop) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] @@ -115,10 +115,10 @@ LCCsampling<-function(r1,r2,Y,X,N){ for(i in 1:length(r2)){ ## local case control sampling - idx.LCC <- sample(1:N, r2[i], T, PI.LCC) + idx.LCC <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.LCC) - x.LCC <- X[c(idx.LCC),] - y.LCC <- Y[c(idx.LCC)] + x.LCC <- X[idx.LCC,] + y.LCC <- Y[idx.LCC] pinv.LCC <- 1 fit.LCC <- .getMLE(x=x.LCC, y=y.LCC, w=pinv.LCC) beta.prop <- fit.LCC$par+beta.prop_start diff --git a/R/LeverageSampling.R b/R/LeverageSampling.R index d74512e..a2ca6b0 100644 --- a/R/LeverageSampling.R +++ b/R/LeverageSampling.R @@ -61,7 +61,7 @@ #' #' r<-rep(100*c(6,10),50); Original_Data<-Full_Data$Complete_Data; #' -#' LeverageSampling(r = r, Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' LeverageSampling(r = r, Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' S_alpha = 0.95, #' family = "linear")->Results @@ -74,7 +74,7 @@ #' #' r<-rep(100*c(6,10),50); Original_Data<-Full_Data$Complete_Data; #' -#' LeverageSampling(r = r, Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' LeverageSampling(r = r, Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' S_alpha = 0.95, #' family = "logistic")->Results @@ -87,7 +87,7 @@ #' #' r<-rep(100*c(6,10),50); Original_Data<-Full_Data$Complete_Data; #' -#' LeverageSampling(r = r, Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' LeverageSampling(r = r, Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' S_alpha = 0.95, #' family = "poisson")->Results @@ -142,17 +142,17 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ for (i in 1:length(r)) { # basic leverage sampling - idx.blev <- sample(1:N, size = r[i], replace = TRUE, PI.blev) + idx.blev <- sample(1:N, size = r[i], replace = TRUE, prob = PI.blev) - x.blev <- as.matrix(X[idx.blev,]) - y.blev <- as.matrix(Y[idx.blev]) + x.blev <- X[idx.blev,] + y.blev <- Y[idx.blev] wgt <- 1 / PI.blev[idx.blev] - Temp_Data <- data.frame(y = y.blev,x.blev, wgt = wgt) - lm.blev <- stats::lm(y ~ . - 1, weights = Temp_Data$wgt, data = Temp_Data[,-ncol(Temp_Data)]) + Temp_Data <- data.frame(y = y.blev,x.blev) + lm.blev <- stats::lm(y ~ . - 1, weights = wgt, data = Temp_Data) beta.prop<-stats::coefficients(lm.blev) - Xbeta_Final<-as.vector(X%*%beta.prop) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Sample.blev[[i]]<-idx.blev @@ -164,10 +164,10 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ } # unweighted leverage sampling - lm.uwlev <- stats::lm(y ~ . - 1, data = Temp_Data[,-ncol(Temp_Data)]) + lm.uwlev <- stats::lm(y ~ . - 1, data = Temp_Data) beta.prop<-stats::coefficients(lm.uwlev) - Xbeta_Final<-as.vector(X%*%beta.prop) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Sample.uwlev[[i]]<-idx.blev @@ -179,17 +179,17 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ } # shrinkage leverage sampling - idx.slev <- sample(N, size = r[i], replace = TRUE, PI.slev) + idx.slev <- sample(N, size = r[i], replace = TRUE, prob = PI.slev) - x.slev <- as.matrix(X[idx.slev,]) - y.slev <- as.matrix(Y[idx.slev]) + x.slev <- X[idx.slev,] + y.slev <- Y[idx.slev] wgt <- 1 / PI.slev[idx.slev] - Temp_Data <- data.frame(y = y.slev,x.slev, wgt = wgt) - lm.slev <- stats::lm(y ~ . - 1, weights = wgt, data = Temp_Data[,-ncol(Temp_Data)]) + Temp_Data <- data.frame(y = y.slev,x.slev) + lm.slev <- stats::lm(y ~ . - 1, weights = wgt, data = Temp_Data) beta.prop<-stats::coefficients(lm.slev) - Xbeta_Final<-as.vector(X%*%beta.prop) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Sample.slev[[i]]<-idx.slev @@ -233,7 +233,7 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ n0 <- N - n1 PI.prop <- rep(1/(2*n0), N) PI.prop[Y==1] <- 1/(2*n1) - idx.prop <- sample(1:N, r1, T, PI.prop) + idx.prop <- sample(1:N, size = r1, replace = TRUE, prob = PI.prop) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] @@ -247,21 +247,9 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ p.prop<-1 - 1 / (1 + exp(X%*% beta.prop)) w.prop<-as.vector(sqrt(p.prop*(1-p.prop))) X_bar<- w.prop*X - XX_Inv<-solve(t(X_bar)%*%X_bar) + XX_Inv<-solve(crossprod(X_bar)) - # X_Temp<-X - # PP <-apply(X_Temp,1,function(X_Temp){ - # P.prop <- 1 - 1 / (1 + exp(X_Temp%*% beta.prop)) - # W.prop <- sqrt(P.prop*(1-P.prop)) - # x_bar <- W.prop%*%X_Temp - # x_bar%*%XX_Inv%*%t(x_bar) - # }) - - # Precompute terms outside the loop - P.prop <- 1 - 1 / (1 + exp(X %*% beta.prop)) - W.prop <- sqrt(P.prop * (1 - P.prop)) - X_bar_s <- as.vector(W.prop) * X - PP <- rowSums((X_bar_s %*% XX_Inv) * X_bar_s) + PP <- rowSums((X_bar %*% XX_Inv) * X_bar) PI.blev <- PP / sum(PP) PI.slev <- S_alpha * PI.blev + (1-S_alpha) * 1 / N @@ -278,8 +266,8 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ # basic leverage sampling idx.blev <- sample(N, size = r[i], replace = TRUE, PI.blev) - x.blev <- as.matrix(X[idx.blev,]) - y.blev <- as.matrix(Y[idx.blev]) + x.blev <- X[idx.blev,] + y.blev <- Y[idx.blev] wgt <- 1 / PI.blev[idx.blev] fit.blev <- .getMLE(x=x.blev, y=as.vector(y.blev), w=wgt) @@ -306,8 +294,8 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ # shrinkage leverage sampling idx.slev <- sample(1:N, size = r[i], replace = TRUE, PI.slev) - x.slev <- as.matrix(X[idx.slev,]) - y.slev <- as.matrix(Y[idx.slev]) + x.slev <- X[idx.slev,] + y.slev <- Y[idx.slev] wgt <- 1 / PI.slev[idx.slev] fit.slev <- .getMLE(x=x.slev, y=as.vector(y.slev), w=wgt) @@ -343,35 +331,26 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ if(family %in% c("poisson")){ r1<-round(min(r/2)) PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) - x.prop<-X[idx.prop,] + x.prop <- X[idx.prop,] y.prop <- Y[idx.prop,] pinv.prop <- N pinv.prop <- 1/PI.prop[idx.prop] - fit.prop <- stats::glm(y.prop~x.prop-1,family = "poisson") + fit.prop <- stats::glm(y.prop~x.prop-1,family = "quasipoisson") beta.prop <- fit.prop$coefficients if(anyNA(beta.prop)){ stop("There are NA or NaN values in the model parameters") } - p.prop<-as.vector(sqrt(exp(X%*% beta.prop))) - X_bar<- p.prop*X - XX_Inv<-solve(t(X_bar)%*%X_bar) - - # X_Temp<-X; - # PP <-apply(X_Temp,1,function(X_Temp){ - # P.prop <- sqrt(exp(X_Temp%*%beta.prop)) - # x_bar <- P.prop%*%X_Temp - # x_bar%*%XX_Inv%*%t(x_bar) - # }) + p.prop<-exp(X%*% beta.prop) + w.prop<-as.vector(sqrt(p.prop)) + X_bar<- w.prop*X + XX_Inv<-solve(crossprod(X_bar)) # Precompute terms outside the loop - P.prop <- 1 - 1 / (1 + exp(X %*% beta.prop)) - W.prop <- sqrt(P.prop * (1 - P.prop)) - X_bar_s <- as.vector(W.prop) * X - PP <- rowSums((X_bar_s %*% XX_Inv) * X_bar_s) + PP <- rowSums((X_bar %*% XX_Inv) * X_bar) PI.blev <- PP / sum(PP) PI.slev <- S_alpha * PI.blev + (1-S_alpha) * 1 / N @@ -386,13 +365,13 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ for (i in 1:length(r)) { # basic leverage sampling - idx.blev <- sample(1:N, size = r[i], replace = TRUE, PI.blev) + idx.blev <- sample(1:N, size = r[i], replace = TRUE, prob = PI.blev) - x.blev <- as.matrix(X[idx.blev,]) - y.blev <- as.matrix(Y[idx.blev]) + x.blev <- X[idx.blev,] + y.blev <- Y[idx.blev] wgt <- 1 / PI.blev[idx.blev] - fit.blev <-stats::glm(y.blev~x.blev-1, family = "poisson",weights=wgt) + fit.blev <-stats::glm(y.blev~x.blev-1, family = "quasipoisson",weights=wgt) beta.prop <- fit.blev$coefficients Sample.blev[[i]]<-idx.blev @@ -403,7 +382,7 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ } # unweighted leverage sampling - fit.uwlev <- stats::glm(y.blev~x.blev-1, family = "poisson") + fit.uwlev <- stats::glm(y.blev~x.blev-1, family = "quasipoisson") beta.prop<-fit.uwlev$coefficients Sample.uwlev[[i]]<-idx.blev @@ -414,13 +393,13 @@ LeverageSampling<-function(r,Y,X,N,S_alpha,family){ } # shrinkage leverage sampling - idx.slev <- sample(1:N, size = r[i], replace = TRUE, PI.slev) + idx.slev <- sample(1:N, size = r[i], replace = TRUE, prob = PI.slev) - x.slev <- as.matrix(X[idx.slev,]) - y.slev <- as.matrix(Y[idx.slev]) + x.slev <- X[idx.slev,] + y.slev <- Y[idx.slev] wgt <- 1 / PI.slev[idx.slev] - fit.slev <- stats::glm(y.slev~x.slev-1, family = "poisson",weights = wgt) + fit.slev <- stats::glm(y.slev~x.slev-1, family = "quasipoisson",weights = wgt) beta.prop <- fit.slev$coefficients Sample.slev[[i]]<-idx.slev diff --git a/R/modelMissLinSub.R b/R/modelMissLinSub.R index 2b3498d..c5e7f29 100644 --- a/R/modelMissLinSub.R +++ b/R/modelMissLinSub.R @@ -97,7 +97,9 @@ #' @import stats #' @import foreach #' @importFrom gam s +#' @importFrom gam lo #' @importFrom Rfast rowprods +#' @importFrom utils combn #' @importFrom psych tr #' @export modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ @@ -132,31 +134,37 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ message("50% or >=50% of the big data is used to help find AMSE for the subsamples, \nthis could take some time.") } - idx.prop <- sample(1:N, r1, T) + main_effects <- paste0("s(X", 1:ncol(X[, -1]), ")") + + if(ncol(X[,-1]) == 2 ){ + two_way_interactions <- utils::combn(colnames(X[, -1]), 2, + function(cols){paste0("lo(", paste(cols, collapse = "*"), ")")}) + + my_formula<-stats::as.formula(paste("Y ~ ",paste(main_effects,collapse = " + "),"+", + paste(two_way_interactions,collapse = " + "))) + } else{ + my_formula<-stats::as.formula(paste("Y ~ ",paste(main_effects,collapse = " + "))) + } + + idx.prop <- sample(1:N, size = r1, replace = TRUE) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop] - beta.prop<-solve(a=t(x.prop)%*%x.prop,b=t(x.prop)%*%y.prop) - Xbeta_Final<-as.vector(X%*%beta.prop) + beta.prop<-solve(a=crossprod(x.prop),b=crossprod(x.prop,y.prop)) + Xbeta_Final<-X%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N - - Xbeta.prop<-X%*%beta.prop - Epsilon.prop<-Y-Xbeta.prop - - my_formula<-stats::as.formula(paste("Y ~ ",paste(paste0("s(X",1:ncol(x.prop[,-1]),")"),collapse = " + "),"+", - paste(paste0("s(",paste0(colnames(x.prop[,-1]),collapse = "*"),")"), - collapse = " + "))) + Epsilon.prop<-Y-Xbeta_Final #calculate f_hat Assumed_Data<-data.frame(Y=y.prop,x.prop) fit_GAM<-gam::gam(my_formula,data=Assumed_Data) Xbeta_GAM<-gam::predict.Gam(fit_GAM,newdata = data.frame(X)) - f_estimate<-Xbeta_GAM-Xbeta.prop + f_estimate<-Xbeta_GAM-Xbeta_Final Var_GAM.prop<-sum((Y-Xbeta_GAM)^2)/N if(proportion*N != r1){ - idx.proportion <- sample(1:N, ceiling(proportion*N), T) + idx.proportion <- sample(1:N, size = ceiling(proportion*N), replace = TRUE) Y_proportion<-Y[idx.proportion] X_proportion<-X[idx.proportion,] @@ -164,14 +172,13 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ fit_GAM_Proportion<-gam::gam(my_formula,data=Proportion_Data) Xbeta_GAM_Proportion<-gam::predict.Gam(fit_GAM_Proportion,newdata = data.frame(X)) - beta_proportion<-solve(a=t(X_proportion)%*%X_proportion,b=t(X_proportion)%*%Y_proportion) + beta_proportion<-solve(a=crossprod(X_proportion),b=crossprod(X_proportion,Y_proportion)) Xbeta_proportion<-X%*%beta_proportion Var_GAM_Full<-sum((Y-Xbeta_GAM_Proportion)^2)/N Var_Full<-sum((Y-Xbeta_proportion)^2)/N F_Estimate_Full<-Xbeta_GAM_Proportion-Xbeta_proportion - } - else{ + } else { Var_GAM_Full<-Var_GAM.prop ; Var_Full<-Var.prop ; F_Estimate_Full<-f_estimate } @@ -180,7 +187,7 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ PI.mVc <- PI.mVc / sum(PI.mVc) # mMSE - PI.mMSE <- sqrt(Epsilon.prop^2 * rowSums((X %*% solve(t(X)%*%X))^2)) + PI.mMSE <- sqrt(Epsilon.prop^2 * rowSums((X %*% solve(crossprod(X)))^2)) PI.mMSE <- PI.mMSE / sum(PI.mMSE) Tempsy_Var_Gam_Var<-Var_GAM.prop*Var.prop^(-2) @@ -192,7 +199,8 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ f_r1 <- f_estimate[c(idx.prop, a)] Temp_Solve<-solve(crossprod(X_r1)) - Temp1 <- tcrossprod(X_r1 %*% Temp_Solve, X_r1) + Temp_Xr1_Solve<-X_r1 %*% Temp_Solve + Temp1 <- tcrossprod(Temp_Xr1_Solve,X_r1) L1_r1 <- Tempsy_Var_Gam_Var*psych::tr(Temp1) Temp_f_r1 <- Temp1 %*% f_r1 @@ -202,9 +210,9 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ L1_r1 + L2_r1 } - Temp1<-X[idx.prop,]%*%solve(t(X[idx.prop,])%*%X[idx.prop,])%*%t(X[idx.prop,]) + Temp1<-X[idx.prop,]%*%solve(crossprod(X[idx.prop,]))%*%t(X[idx.prop,]) L1_r1 <- Tempsy_Var_Gam_Var*psych::tr(Temp1) - L2_r1 <- sum((Var.prop^(-1)*(Temp1%*%f_estimate[idx.prop]-f_estimate[idx.prop]))^2) + L2_r1 <- sum((Var_prop_inv*(Temp1%*%f_estimate[idx.prop]-f_estimate[idx.prop]))^2) L_All_Temp<-L1_r1+L2_r1 L_All_Final<-abs(L_All_Temp-L_All) @@ -258,10 +266,12 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ message("Step 1 of the algorithm completed.\n") + VarFull_Inv<-Var_Full^(-1) + for (i in 1:length(r2)) { # mVc - idx.mVc <- sample(1:N, r2[i]-r1, T, PI.mVc) + idx.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mVc) x.mVc <- X[c(idx.mVc, idx.prop),] y.mVc <- Y[c(idx.mVc, idx.prop)] @@ -270,21 +280,21 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ pi4_r<-sqrt(r2[i]*w.mVc^(-1)) X_r4<-x.mVc/pi4_r Y_r4<-y.mVc/pi4_r - beta_mVc[i,]<-c(r2[i],solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4)) - Xbeta_Final<-as.vector(X%*%beta_mVc[i,-1]) + beta_mVc[i,]<-c(r2[i],solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4))) + Xbeta_Final<-X%*%beta_mVc[i,-1] Var_Epsilon[i,2]<-sum((Y-Xbeta_Final)^2)/N - Temp1<-x.mVc%*%solve(t(x.mVc)%*%x.mVc)%*%t(x.mVc) + Temp1<-x.mVc%*%solve(crossprod(x.mVc))%*%t(x.mVc) L1_r1 <- Tempsy_Var_Gam_Var_AMSE*psych::tr(Temp1) - L2_r1 <- sum((Var_Full^(-1)*(Temp1%*%F_Estimate_Full[c(idx.mVc,idx.prop)] - - F_Estimate_Full[c(idx.mVc, idx.prop)]))^2) + L2_r1 <- sum((VarFull_Inv*(Temp1%*%F_Estimate_Full[c(idx.mVc,idx.prop)] - + F_Estimate_Full[c(idx.mVc, idx.prop)]))^2) AMSE_Sample_mVc[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) idx.mVc->Sample.mVc[[i+1]] # mMSE - idx.mMSE <- sample(1:N, r2[i]-r1, T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mMSE) x.mMSE <- X[c(idx.mMSE, idx.prop),] y.mMSE <- Y[c(idx.mMSE, idx.prop)] @@ -293,21 +303,21 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ pi4_r<-sqrt(r2[i]*w.mMSE^(-1)) X_r4<-x.mMSE/pi4_r Y_r4<-y.mMSE/pi4_r - beta_mMSE[i,]<-c(r2[i],solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4)) - Xbeta_Final<-as.vector(X%*%beta_mMSE[i,-1]) + beta_mMSE[i,]<-c(r2[i],solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4))) + Xbeta_Final<-X%*%beta_mMSE[i,-1] Var_Epsilon[i,3]<-sum((Y-Xbeta_Final)^2)/N - Temp1<-x.mMSE%*%solve(t(x.mMSE)%*%x.mMSE)%*%t(x.mMSE) + Temp1<-x.mMSE%*%solve(crossprod(x.mMSE))%*%t(x.mMSE) L1_r1 <- Tempsy_Var_Gam_Var_AMSE*psych::tr(Temp1) - L2_r1 <- sum((Var_Full^(-1)*(Temp1%*%F_Estimate_Full[c(idx.mMSE,idx.prop)]- - F_Estimate_Full[c(idx.mMSE, idx.prop)]))^2) + L2_r1 <- sum((VarFull_Inv*(Temp1%*%F_Estimate_Full[c(idx.mMSE,idx.prop)]- + F_Estimate_Full[c(idx.mMSE, idx.prop)]))^2) AMSE_Sample_mMSE[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) idx.mMSE->Sample.mMSE[[i+1]] # RLmAMSE - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE) x.RLmAMSE <- X[c(idx.RLmAMSE),] y.RLmAMSE <- Y[c(idx.RLmAMSE)] @@ -316,14 +326,14 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ pi4_r<-sqrt(r2[i]*w.RLmAMSE^(-1)) X_r4<-x.RLmAMSE/pi4_r Y_r4<-y.RLmAMSE/pi4_r - beta_RLmAMSE[i,]<-c(r2[i],solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4)) - Xbeta_Final<-as.vector(X%*%beta_RLmAMSE[i,-1]) + beta_RLmAMSE[i,]<-c(r2[i],solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4))) + Xbeta_Final<-X%*%beta_RLmAMSE[i,-1] Var_Epsilon[i,4]<-sum((Y-Xbeta_Final)^2)/N - Temp1<-x.RLmAMSE%*%solve(t(x.RLmAMSE)%*%x.RLmAMSE)%*%t(x.RLmAMSE) + Temp1<-x.RLmAMSE%*%solve(crossprod(x.RLmAMSE))%*%t(x.RLmAMSE) L1_r1 <- Tempsy_Var_Gam_Var_AMSE*psych::tr(Temp1) - L2_r1 <- sum((Var_Full^(-1)*(Temp1%*%F_Estimate_Full[c(idx.RLmAMSE)] - - F_Estimate_Full[c(idx.RLmAMSE)]))^2) + L2_r1 <- sum((VarFull_Inv*(Temp1%*%F_Estimate_Full[c(idx.RLmAMSE)] - + F_Estimate_Full[c(idx.RLmAMSE)]))^2) AMSE_Sample_RLmAMSE[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) @@ -332,7 +342,7 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ for(j in 1:length(Alpha)) { # RLmAMSE Log Odds - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE_LO[,j]) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE_LO[,j]) x.RLmAMSE <- X[c(idx.RLmAMSE),] y.RLmAMSE <- Y[c(idx.RLmAMSE)] @@ -341,21 +351,21 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ pi4_r<-sqrt(r2[i]*w.RLmAMSE^(-1)) X_r4<-x.RLmAMSE/pi4_r Y_r4<-y.RLmAMSE/pi4_r - beta_RLmAMSE_LO[[j]][i,]<-c(r2[i],solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4)) - Xbeta_Final<-as.vector(X%*%beta_RLmAMSE_LO[[j]][i,-1]) + beta_RLmAMSE_LO[[j]][i,]<-c(r2[i],solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4))) + Xbeta_Final<-X%*%beta_RLmAMSE_LO[[j]][i,-1] Var_RLmAMSE_LO[i,j]<-sum((Y-Xbeta_Final)^2)/N - Temp1<-x.RLmAMSE%*%solve(t(x.RLmAMSE)%*%x.RLmAMSE)%*%t(x.RLmAMSE) + Temp1<-x.RLmAMSE%*%solve(crossprod(x.RLmAMSE))%*%t(x.RLmAMSE) L1_r1 <- Tempsy_Var_Gam_Var_AMSE*psych::tr(Temp1) - L2_r1 <- sum((Var_Full^(-1)*(Temp1%*%F_Estimate_Full[c(idx.RLmAMSE)]- - F_Estimate_Full[c(idx.RLmAMSE)]))^2) + L2_r1 <- sum((VarFull_Inv*(Temp1%*%F_Estimate_Full[c(idx.RLmAMSE)]- + F_Estimate_Full[c(idx.RLmAMSE)]))^2) AMSE_Sample_RLmAMSE_LO[[j]][i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) idx.RLmAMSE->Sample.RLmAMSE_LO[[j]][[i+1]] # Model robust RLmAMSE # RLmAMSE Power - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE_Pow[,j]) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE_Pow[,j]) x.RLmAMSE <- X[c(idx.RLmAMSE),] y.RLmAMSE <- Y[c(idx.RLmAMSE)] @@ -364,14 +374,14 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ pi4_r<-sqrt(r2[i]*w.RLmAMSE^(-1)) X_r4<-x.RLmAMSE/pi4_r Y_r4<-y.RLmAMSE/pi4_r - beta_RLmAMSE_Pow[[j]][i,]<-c(r2[i],solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4)) - Xbeta_Final<-as.vector(X%*%beta_RLmAMSE_Pow[[j]][i,-1]) + beta_RLmAMSE_Pow[[j]][i,]<-c(r2[i],solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4))) + Xbeta_Final<-X%*%beta_RLmAMSE_Pow[[j]][i,-1] Var_RLmAMSE_Pow[i,j]<-sum((Y-Xbeta_Final)^2)/N - Temp1<-x.RLmAMSE%*%solve(t(x.RLmAMSE)%*%x.RLmAMSE)%*%t(x.RLmAMSE) + Temp1<-x.RLmAMSE%*%solve(crossprod(x.RLmAMSE))%*%t(x.RLmAMSE) L1_r1 <- Tempsy_Var_Gam_Var_AMSE*psych::tr(Temp1) - L2_r1 <- sum((Var_Full^(-1)*(Temp1%*%F_Estimate_Full[c(idx.RLmAMSE)] - - F_Estimate_Full[c(idx.RLmAMSE)]))^2) + L2_r1 <- sum((VarFull_Inv*(Temp1%*%F_Estimate_Full[c(idx.RLmAMSE)] - + F_Estimate_Full[c(idx.RLmAMSE)]))^2) AMSE_Sample_RLmAMSE_Pow[[j]][i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) @@ -403,15 +413,15 @@ modelMissLinSub <- function(r1,r2,Y,X,N,Alpha,proportion){ Var_Data<-cbind.data.frame(Var_Epsilon,Var_RLmAMSE_LO,Var_RLmAMSE_Pow) colnames(Var_Data)<-c("r2","A-Optimality","L-Optimality","RLmAMSE", - paste0("RLmAMSE Log Odds ",Alpha), - paste0("RLmAMSE Power ",Alpha)) + paste0("RLmAMSE Log Odds ",Alpha), + paste0("RLmAMSE Power ",Alpha)) # AMSE Sample Data AMSE_Sample_Data<-cbind.data.frame("Method"=rep(Sampling_Methods,each=length(r2)), - rbind(AMSE_Sample_mMSE,AMSE_Sample_mVc, - AMSE_Sample_RLmAMSE, - do.call(rbind,AMSE_Sample_RLmAMSE_LO), - do.call(rbind,AMSE_Sample_RLmAMSE_Pow))) + rbind(AMSE_Sample_mMSE,AMSE_Sample_mVc, + AMSE_Sample_RLmAMSE, + do.call(rbind,AMSE_Sample_RLmAMSE_LO), + do.call(rbind,AMSE_Sample_RLmAMSE_Pow))) colnames(AMSE_Sample_Data)[-1]<-c("r2","Variance","Bias.2","AMSE") AMSE_Sample_Data[,-c(1,2)]<-AMSE_Sample_Data[,-c(1,2)]/r2 diff --git a/R/modelMissLogSub.R b/R/modelMissLogSub.R index 7e7187c..70416c7 100644 --- a/R/modelMissLogSub.R +++ b/R/modelMissLogSub.R @@ -96,6 +96,7 @@ #' @import foreach #' @importFrom gam s #' @importFrom Rfast rowprods +#' @importFrom utils combn #' @importFrom psych tr #' @export modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ @@ -130,11 +131,23 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ message("50% or >=50% of the big data is used to help find AMSE for the subsamples, \nthis could take some time.") } + main_effects <- paste0("s(X", 1:ncol(X[, -1]), ")") + + if(ncol(X[,-1]) == 2 ){ + two_way_interactions <- utils::combn(colnames(X[, -1]), 2, + function(cols){paste0("lo(", paste(cols, collapse = "*"), ")")}) + + my_formula<-stats::as.formula(paste("Y ~ ",paste(main_effects,collapse = " + "),"+", + paste(two_way_interactions,collapse = " + "))) + } else{ + my_formula<-stats::as.formula(paste("Y ~ ",paste(main_effects,collapse = " + "))) + } + n1 <- sum(Y) n0 <- N - n1 PI.prop <- rep(1/(2*n0), N) PI.prop[Y==1] <- 1/(2*n1) - idx.prop <- sample(1:N, r1, T, PI.prop) + idx.prop <- sample(1:N, size = r1, replace = TRUE, prob = PI.prop) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop] @@ -146,20 +159,17 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ if (anyNA(beta.prop)){ stop("There are NA or NaN values in the model parameters") } - P.prop <- 1 - 1 / (1 + exp(X %*% beta.prop)) - - my_formula<-stats::as.formula(paste("Y ~ ",paste(paste0("s(X",1:ncol(x.prop[,-1]),")"),collapse = " + "),"+", - paste(paste0("s(",paste0(colnames(x.prop[,-1]),collapse = "*"),")"), - collapse = " + "))) + Xbeta_Final<-X %*% beta.prop + P.prop <- 1 - 1 / (1 + exp(Xbeta_Final)) # calculate f_hat Assumed_Data<-data.frame(Y=y.prop,x.prop) fit_GAM<-gam::gam(my_formula,data=Assumed_Data,family = "binomial") Xbeta_GAM<-gam::predict.Gam(fit_GAM,newdata = data.frame(X)) - f_estimate<-Xbeta_GAM - X%*%beta.prop + f_estimate<-Xbeta_GAM - Xbeta_Final if(proportion*N != r1){ - idx.proportion <- sample(1:N, ceiling(proportion*N), T, PI.prop) + idx.proportion <- sample(1:N, size = ceiling(proportion*N), replace = TRUE, prob = PI.prop) Y_proportion <- Y[idx.proportion] X_proportion <- X[idx.proportion,] @@ -175,8 +185,7 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ F_Estimate_Full<-Xbeta_GAM_proportion - Xbeta_proportion Beta_Estimate_Full<-beta.proportion - } - else { + } else { Beta_Estimate_Full<- beta.prop ; F_Estimate_Full<-f_estimate } @@ -187,7 +196,7 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ # mMSE p.prop <- P.prop[idx.prop] w.prop <- p.prop * (1 - p.prop) - W.prop <- solve(t(x.prop) %*% (x.prop * w.prop * pinv.prop)) + W.prop <- solve(crossprod(x.prop, x.prop * w.prop * pinv.prop)) PI.mMSE <- sqrt((Y - P.prop)^2 * rowSums((X%*%W.prop)^2)) PI.mMSE <- PI.mMSE / sum(PI.mMSE) @@ -214,18 +223,18 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ diff <- XH_b_r1 - f_r1 L2_r1 <- sum((W_r1 * diff)^2) - c(L1_r1+L2_r1) + L1_r1+L2_r1 } p_r1<-1-1/(1+exp(X[idx.prop,]%*%beta.prop)) W_r1<-as.vector(p_r1*(1-p_r1)) - H_r1 <-solve(t(X[idx.prop,]) %*% (X[idx.prop,] * W_r1)) + H_r1 <-solve(crossprod(X[idx.prop,], X[idx.prop,] * W_r1)) Temp1<-(W_r1*X[idx.prop,])%*%H_r1 p_Tr1<-1-1/(1+exp((X[idx.prop,] %*% beta.prop) + f_estimate[idx.prop])) W_Tr1<-as.vector(p_Tr1*(1-p_Tr1)) - H_Tr1 <-(t(X[idx.prop,]) %*% (X[idx.prop,] * W_Tr1)) - b_r1 <-(t(X[idx.prop,]) %*% (p_Tr1-p_r1)) + H_Tr1 <-crossprod(X[idx.prop,], X[idx.prop,] * W_Tr1) + b_r1 <-crossprod(X[idx.prop,], p_Tr1-p_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((X[idx.prop,]%*%H_r1%*%b_r1)-f_estimate[idx.prop]))^2) @@ -276,7 +285,7 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ for (i in 1:length(r2)) { # mVc - idx.mVc <- sample(1:N, r2[i]-r1, T, PI.mVc) + idx.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mVc) x.mVc <- X[c(idx.mVc, idx.prop),] y.mVc <- Y[c(idx.mVc, idx.prop)] @@ -289,20 +298,20 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ p_r1<-1-1/(1+exp(x.mVc%*%Beta_Estimate_Full)) W_r1<-as.vector(p_r1*(1-p_r1)) - H_r1 <-solve(t(x.mVc) %*% (x.mVc * W_r1)) + H_r1 <-solve(crossprod(x.mVc, x.mVc * W_r1)) Temp1<-(W_r1*x.mVc)%*%H_r1 p_Tr1<-1-1/(1+exp((x.mVc %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.mVc, idx.prop)])) W_Tr1<-as.vector(p_Tr1*(1-p_Tr1)) - H_Tr1 <-(t(x.mVc) %*% (x.mVc * W_Tr1)) - b_r1 <-(t(x.mVc) %*% (p_Tr1-p_r1)) + H_Tr1 <-crossprod(x.mVc, x.mVc * W_Tr1) + b_r1 <-crossprod(x.mVc, p_Tr1-p_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((x.mVc%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.mVc, idx.prop)]))^2) AMSE_Sample_mVc[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) # mMSE - idx.mMSE <- sample(1:N, r2[i]-r1, T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mMSE) x.mMSE <- X[c(idx.mMSE, idx.prop),] y.mMSE <- Y[c(idx.mMSE, idx.prop)] @@ -315,20 +324,20 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ p_r1<-1-1/(1+exp(x.mMSE%*%Beta_Estimate_Full)) W_r1<-as.vector(p_r1*(1-p_r1)) - H_r1 <-solve(t(x.mMSE) %*% (x.mMSE * W_r1)) + H_r1 <-solve(crossprod(x.mMSE, x.mMSE * W_r1)) Temp1<-(W_r1 * x.mMSE)%*%H_r1 p_Tr1<-1-1/(1+exp((x.mMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.mMSE, idx.prop)])) W_Tr1<-as.vector(p_Tr1*(1-p_Tr1)) - H_Tr1 <-(t(x.mMSE) %*% (x.mMSE * W_Tr1)) - b_r1 <-(t(x.mMSE) %*% (p_Tr1-p_r1)) + H_Tr1 <-crossprod(x.mMSE, x.mMSE * W_Tr1) + b_r1 <-crossprod(x.mMSE, p_Tr1-p_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((x.mMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.mMSE, idx.prop)]))^2) AMSE_Sample_mMSE[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) # RLmAMSE - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE) x.RLmAMSE <- X[c(idx.RLmAMSE),] y.RLmAMSE <- Y[c(idx.RLmAMSE)] @@ -341,13 +350,13 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ p_r1<-1-1/(1+exp(x.RLmAMSE%*%Beta_Estimate_Full)) W_r1<-as.vector(p_r1*(1-p_r1)) - H_r1 <-solve(t(x.RLmAMSE) %*% (x.RLmAMSE * W_r1)) + H_r1 <-solve(crossprod(x.RLmAMSE, x.RLmAMSE * W_r1)) Temp1<-(W_r1 * x.RLmAMSE)%*%H_r1 p_Tr1<-1-1/(1+exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.RLmAMSE)])) W_Tr1<-as.vector(p_Tr1*(1-p_Tr1)) - H_Tr1 <-(t(x.RLmAMSE) %*% (x.RLmAMSE * W_Tr1)) - b_r1 <-(t(x.RLmAMSE) %*% (p_Tr1-p_r1)) + H_Tr1 <-crossprod(x.RLmAMSE, x.RLmAMSE * W_Tr1) + b_r1 <- crossprod(x.RLmAMSE, p_Tr1-p_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.RLmAMSE)]))^2) @@ -356,7 +365,7 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ for (j in 1:length(Alpha)) { # RLmAMSE Log Odds - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE_LO[,j]) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE_LO[,j]) x.RLmAMSE <- X[c(idx.RLmAMSE),] y.RLmAMSE <- Y[c(idx.RLmAMSE)] @@ -369,20 +378,20 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ p_r1<-1-1/(1+exp(x.RLmAMSE%*%Beta_Estimate_Full)) W_r1<-as.vector(p_r1*(1-p_r1)) - H_r1 <-solve(t(x.RLmAMSE) %*% (x.RLmAMSE * W_r1)) + H_r1 <-solve(crossprod(x.RLmAMSE, x.RLmAMSE * W_r1)) Temp1<-(W_r1 * x.RLmAMSE)%*%H_r1 p_Tr1<-1-1/(1+exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.RLmAMSE)])) W_Tr1<-as.vector(p_Tr1*(1-p_Tr1)) - H_Tr1 <-(t(x.RLmAMSE) %*% (x.RLmAMSE * W_Tr1)) - b_r1 <-(t(x.RLmAMSE) %*% (p_Tr1-p_r1)) + H_Tr1 <-crossprod(x.RLmAMSE, x.RLmAMSE * W_Tr1) + b_r1 <-crossprod(x.RLmAMSE, p_Tr1-p_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.RLmAMSE)]))^2) AMSE_Sample_RLmAMSE_LO[[j]][i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) # RLmAMSE Power - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE_Pow[,j]) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE_Pow[,j]) x.RLmAMSE <- X[c(idx.RLmAMSE),] y.RLmAMSE <- Y[c(idx.RLmAMSE)] @@ -400,8 +409,8 @@ modelMissLogSub <- function(r1,r2,Y,X,N,Alpha,proportion){ p_Tr1<-1-1/(1+exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.RLmAMSE)])) W_Tr1<-as.vector(p_Tr1*(1-p_Tr1)) - H_Tr1 <-(t(x.RLmAMSE) %*% (x.RLmAMSE * W_Tr1)) - b_r1 <-(t(x.RLmAMSE) %*% (p_Tr1-p_r1)) + H_Tr1 <-crossprod(x.RLmAMSE, x.RLmAMSE * W_Tr1) + b_r1 <- crossprod(x.RLmAMSE, p_Tr1-p_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.RLmAMSE)]))^2) diff --git a/R/modelMissPoiSub.R b/R/modelMissPoiSub.R index b8dceb5..a71b6eb 100644 --- a/R/modelMissPoiSub.R +++ b/R/modelMissPoiSub.R @@ -97,6 +97,7 @@ #' @import foreach #' @importFrom gam s #' @importFrom Rfast rowprods +#' @importFrom utils combn #' @importFrom psych tr #' @export modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ @@ -131,52 +132,60 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ message("50% or >=50% of the big data is used to help find AMSE for the subsamples, \nthis could take some time.") } + main_effects <- paste0("s(X", 1:ncol(X[, -1]), ")") + + if(ncol(X[,-1]) %in% c(2:3) ){ + two_way_interactions <- utils::combn(colnames(X[, -1]), 2, + function(cols){paste0("lo(", paste(cols, collapse = "*"), ")")}) + + my_formula<-stats::as.formula(paste("Y ~ ",paste(main_effects,collapse = " + "),"+", + paste(two_way_interactions,collapse = " + "))) + } else { + my_formula<-stats::as.formula(paste("Y ~ ",paste(main_effects,collapse = " + "))) + } + PI.prop <- rep(1/N,N) - idx.prop <- sample(1:N, r1, T,PI.prop) + idx.prop <- sample(1:N, size = r1, replace = TRUE, prob = PI.prop) x.prop <- X[idx.prop,] y.prop <- Y[idx.prop] pinv.prop <- rep(N,r1) - fit.prop <- stats::glm(y.prop~x.prop-1,family="poisson") + fit.prop <- stats::glm(y.prop~x.prop-1,family="quasipoisson") beta.prop <- fit.prop$coefficients if (anyNA(beta.prop)){ stop("There are NA or NaN values in the model parameters") } - Lambda.prop <- exp(X %*% beta.prop) - - my_formula<-stats::as.formula(paste("Y ~ ",paste(paste0("gam::s(X",1:ncol(x.prop[,-1]),")"),collapse = " + "),"+", - paste(paste0("gam::s(",paste0(colnames(x.prop[,-1]),collapse = "*"),")"), - collapse = " + "))) + Xbeta_Final <- X %*% beta.prop + Lambda.prop <- exp(Xbeta_Final) #calculate f_hat Assumed_Data<-data.frame(Y=y.prop,x.prop) - fit_GAM<-gam::gam(my_formula,data=Assumed_Data,family = "poisson") + fit_GAM<-gam::gam(my_formula,data=Assumed_Data,family = "quasipoisson") Xbeta_GAM<-gam::predict.Gam(fit_GAM,newdata = data.frame(X)) Lambda_GAM<-exp(Xbeta_GAM) - f_estimate<-Xbeta_GAM - X %*% beta.prop + f_estimate<-Xbeta_GAM - Xbeta_Final if(proportion*N != r1){ - idx.proportion <- sample(1:N, ceiling(proportion*N), T, PI.prop) + idx.proportion <- sample(1:N, size = ceiling(proportion*N), replace = TRUE, prob = PI.prop) Y_proportion <- Y[idx.proportion] X_proportion <- X[idx.proportion,] pinv.proportion <- rep(N,ceiling(proportion*N)) - fit.proportion <- stats::glm(Y_proportion~X_proportion-1,family="poisson") + fit.proportion <- stats::glm(Y_proportion~X_proportion-1,family="quasipoisson") beta.proportion <- fit.proportion$coefficients Xbeta_proportion <- X %*% beta.proportion Assumed_Data<-data.frame(Y=Y_proportion,X_proportion) - fit_GAM_proportion<-gam::gam(my_formula,data=Assumed_Data,family = "poisson") + fit_GAM_proportion<-gam::gam(my_formula,data=Assumed_Data,family = "quasipoisson") Xbeta_GAM_proportion<-gam::predict.Gam(fit_GAM_proportion,newdata = data.frame(X)) F_Estimate_Full<-Xbeta_GAM_proportion - Xbeta_proportion Beta_Estimate_Full<-beta.proportion - } - else { + } else { Beta_Estimate_Full<- beta.prop ; F_Estimate_Full<-f_estimate } @@ -187,7 +196,7 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ # mMSE lambda.prop <- Lambda.prop[idx.prop] w.prop <- lambda.prop - W.prop <- solve(t(x.prop) %*% (x.prop * w.prop * pinv.prop)) + W.prop <- solve(crossprod(x.prop, x.prop * w.prop * pinv.prop)) PI.mMSE <- sqrt((Y - Lambda.prop)^2 * rowSums((X%*%W.prop)^2)) PI.mMSE <- PI.mMSE / sum(PI.mMSE) @@ -197,14 +206,14 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ X_r1<-X[c(idx.prop,a),] lambda_r1<-exp(X_r1%*%beta.prop) W_r1<-as.vector(lambda_r1) - H_r1 <-solve(t(X_r1) %*% (X_r1 * W_r1)) + H_r1 <-solve(crossprod(X_r1,X_r1 * W_r1)) Temp1<-(W_r1*X_r1)%*%H_r1 f_r1<-f_estimate[c(idx.prop,a)] lambda_Tr1<-exp((X_r1 %*% beta.prop) + f_r1) W_Tr1<-as.vector(lambda_Tr1) - H_Tr1 <-(t(X_r1) %*% (X_r1 * W_Tr1)) - b_r1 <-(t(X_r1) %*% (lambda_Tr1-lambda_r1)) + H_Tr1 <- crossprod(X_r1, X_r1 * W_Tr1) + b_r1 <- crossprod(X_r1, lambda_Tr1-lambda_r1) Temp1_H <- Temp1 %*% H_Tr1 diag_Temp <- rowSums(Temp1_H * Temp1) @@ -215,18 +224,18 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ diff <- XH_b_r1 - f_r1 L2_r1 <- sum((W_r1 * diff)^2) - c(L1_r1+L2_r1) + L1_r1+L2_r1 } lambda_r1<-exp(X[idx.prop,]%*%beta.prop) W_r1<-as.vector(lambda_r1) - H_r1 <-solve(t(X[idx.prop,]) %*% (X[idx.prop,]*W_r1)) + H_r1 <-solve(crossprod(X[idx.prop,], X[idx.prop,]*W_r1)) Temp1<-(W_r1*X[idx.prop,])%*%H_r1 lambda_Tr1<-exp((X[idx.prop,] %*% beta.prop) + f_estimate[idx.prop]) W_Tr1<-as.vector(lambda_Tr1) - H_Tr1 <-(t(X[idx.prop,]) %*% (X[idx.prop,]*W_Tr1)) - b_r1 <-(t(X[idx.prop,]) %*% (lambda_Tr1-lambda_r1)) + H_Tr1 <- crossprod(X[idx.prop,], X[idx.prop,]*W_Tr1) + b_r1 <- crossprod(X[idx.prop,], lambda_Tr1-lambda_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((X[idx.prop,]%*%H_r1%*%b_r1)-f_estimate[idx.prop]))^2) @@ -277,12 +286,13 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ for (i in 1:length(r2)) { # mVc - idx.mVc <- sample(1:N, r2[i]-r1, T, PI.mVc) + idx.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mVc) x.mVc <- X[c(idx.mVc, idx.prop),] y.mVc <- Y[c(idx.mVc, idx.prop)] - fit.mVc <- stats::glm(y.mVc~x.mVc-1,family="poisson",weights = c(1 / PI.mVc[idx.mVc], pinv.prop)) + fit.mVc <- stats::glm(y.mVc~x.mVc-1,family="quasipoisson", + weights = c(1 / PI.mVc[idx.mVc], pinv.prop)) beta_mVc[i,] <- c(r2[i],fit.mVc$coefficients) @@ -290,25 +300,26 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ lambda_r1<-exp(x.mVc%*%Beta_Estimate_Full) W_r1<-as.vector(lambda_r1) - H_r1 <-solve(t(x.mVc) %*% (x.mVc * W_r1)) + H_r1 <-solve(crossprod(x.mVc, x.mVc * W_r1)) Temp1<-(W_r1 * x.mVc)%*%H_r1 lambda_Tr1<-exp((x.mVc %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.mVc, idx.prop)]) W_Tr1<-as.vector(lambda_Tr1) - H_Tr1 <-(t(x.mVc) %*% (x.mVc * W_Tr1)) - b_r1 <-(t(x.mVc) %*% (lambda_Tr1-lambda_r1)) + H_Tr1 <- crossprod(x.mVc, x.mVc * W_Tr1) + b_r1 <- crossprod(x.mVc, lambda_Tr1-lambda_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((x.mVc%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.mVc, idx.prop)]))^2) AMSE_Sample_mVc[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) # mMSE - idx.mMSE <- sample(1:N, r2[i]-r1, T, PI.mMSE) + idx.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI.mMSE) x.mMSE <- X[c(idx.mMSE, idx.prop),] y.mMSE <- Y[c(idx.mMSE, idx.prop)] - fit.mMSE <- stats::glm(y.mMSE~x.mMSE-1,family = "poisson", weights =c(1 / PI.mMSE[idx.mMSE], pinv.prop) ) + fit.mMSE <- stats::glm(y.mMSE~x.mMSE-1,family = "quasipoisson", + weights =c(1 / PI.mMSE[idx.mMSE], pinv.prop) ) beta_mMSE[i,] <- c(r2[i],fit.mMSE$coefficients) @@ -316,25 +327,26 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ lambda_r1<-exp(x.mMSE%*%Beta_Estimate_Full) W_r1<-as.vector(lambda_r1) - H_r1 <-solve(t(x.mMSE) %*% (x.mMSE * W_r1)) + H_r1 <-solve(crossprod(x.mMSE, x.mMSE * W_r1)) Temp1<-(W_r1*x.mMSE)%*%H_r1 lambda_Tr1<-exp((x.mMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.mMSE, idx.prop)]) W_Tr1<-as.vector(lambda_Tr1) - H_Tr1 <-(t(x.mMSE) %*% (x.mMSE * W_Tr1)) - b_r1 <-(t(x.mMSE) %*% (lambda_Tr1-lambda_r1)) + H_Tr1 <- crossprod(x.mMSE, x.mMSE * W_Tr1) + b_r1 <- crossprod(x.mMSE, lambda_Tr1-lambda_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) L2_r1 <- sum((W_r1*((x.mMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.mMSE, idx.prop)]))^2) AMSE_Sample_mMSE[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) # RLmAMSE - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE) - x.RLmAMSE <- X[c(idx.RLmAMSE),] - y.RLmAMSE <- Y[c(idx.RLmAMSE)] + x.RLmAMSE <- X[idx.RLmAMSE,] + y.RLmAMSE <- Y[idx.RLmAMSE] - fit.RLmAMSE <- stats::glm(y.RLmAMSE~x.RLmAMSE-1,family="poisson",weights = c(1 / PI.RLmAMSE[idx.RLmAMSE])) + fit.RLmAMSE <- stats::glm(y.RLmAMSE~x.RLmAMSE-1,family="quasipoisson", + weights = c(1 / PI.RLmAMSE[idx.RLmAMSE])) beta_RLmAMSE[i,] <- c(r2[i],fit.RLmAMSE$coefficients) @@ -342,27 +354,28 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ lambda_r1<-exp(x.RLmAMSE%*%Beta_Estimate_Full) W_r1<-as.vector(lambda_r1) - H_r1 <-solve(t(x.RLmAMSE) %*% (x.RLmAMSE * W_r1)) + H_r1 <-solve(crossprod(x.RLmAMSE, x.RLmAMSE * W_r1)) Temp1<-(W_r1*x.RLmAMSE)%*%H_r1 - lambda_Tr1<-exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.RLmAMSE)]) + lambda_Tr1<-exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[idx.RLmAMSE]) W_Tr1<-as.vector(lambda_Tr1) - H_Tr1 <-(t(x.RLmAMSE) %*% (x.RLmAMSE * W_Tr1)) - b_r1 <-(t(x.RLmAMSE) %*% (lambda_Tr1-lambda_r1)) + H_Tr1 <- crossprod(x.RLmAMSE, x.RLmAMSE * W_Tr1) + b_r1 <- crossprod(x.RLmAMSE, lambda_Tr1-lambda_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) - L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.RLmAMSE)]))^2) + L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[idx.RLmAMSE]))^2) AMSE_Sample_RLmAMSE[i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) for (j in 1:length(Alpha)) { # RLmAMSE Log Odds - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE_LO[,j]) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE_LO[,j]) - x.RLmAMSE <- X[c(idx.RLmAMSE),] - y.RLmAMSE <- Y[c(idx.RLmAMSE)] + x.RLmAMSE <- X[idx.RLmAMSE,] + y.RLmAMSE <- Y[idx.RLmAMSE] - fit.RLmAMSE <- stats::glm(y.RLmAMSE~x.RLmAMSE-1,family="poisson",weights = c(1 / PI.RLmAMSE_LO[idx.RLmAMSE,j])) + fit.RLmAMSE <- stats::glm(y.RLmAMSE~x.RLmAMSE-1,family="quasipoisson", + weights = c(1 / PI.RLmAMSE_LO[idx.RLmAMSE,j])) beta_RLmAMSE_LO[[j]][i,] <- c(r2[i],fit.RLmAMSE$coefficients) @@ -370,25 +383,26 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ lambda_r1<-exp(x.RLmAMSE%*%Beta_Estimate_Full) W_r1<-as.vector(lambda_r1) - H_r1 <-solve(t(x.RLmAMSE) %*% (x.RLmAMSE * W_r1)) + H_r1 <-solve(crossprod(x.RLmAMSE, x.RLmAMSE * W_r1)) Temp1<-(W_r1*x.RLmAMSE)%*%H_r1 - lambda_Tr1<-exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.RLmAMSE)]) + lambda_Tr1<-exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[idx.RLmAMSE]) W_Tr1<-as.vector(lambda_Tr1) - H_Tr1 <-(t(x.RLmAMSE) %*% (x.RLmAMSE * W_Tr1)) - b_r1 <-(t(x.RLmAMSE) %*% (lambda_Tr1-lambda_r1)) + H_Tr1 <- crossprod(x.RLmAMSE, x.RLmAMSE * W_Tr1) + b_r1 <- crossprod(x.RLmAMSE, lambda_Tr1-lambda_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) - L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.RLmAMSE)]))^2) + L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[idx.RLmAMSE]))^2) AMSE_Sample_RLmAMSE_LO[[j]][i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) # RLmAMSE Power - idx.RLmAMSE <- sample(1:N, r2[i], T, PI.RLmAMSE_Pow[,j]) + idx.RLmAMSE <- sample(1:N, size = r2[i], replace = TRUE, prob = PI.RLmAMSE_Pow[,j]) - x.RLmAMSE <- X[c(idx.RLmAMSE),] - y.RLmAMSE <- Y[c(idx.RLmAMSE)] + x.RLmAMSE <- X[idx.RLmAMSE,] + y.RLmAMSE <- Y[idx.RLmAMSE] - fit.RLmAMSE <- stats::glm(y.RLmAMSE~x.RLmAMSE-1,family="poisson",weights = c(1 / PI.RLmAMSE_Pow[idx.RLmAMSE,j])) + fit.RLmAMSE <- stats::glm(y.RLmAMSE~x.RLmAMSE-1,family="quasipoisson", + weights = c(1 / PI.RLmAMSE_Pow[idx.RLmAMSE,j])) beta_RLmAMSE_Pow[[j]][i,] <- c(r2[i],fit.RLmAMSE$coefficients) @@ -399,12 +413,12 @@ modelMissPoiSub <- function(r1,r2,Y,X,N,Alpha,proportion){ H_r1 <-solve(t(x.RLmAMSE) %*% (x.RLmAMSE * W_r1)) Temp1<-(W_r1*x.RLmAMSE)%*%H_r1 - lambda_Tr1<-exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[c(idx.RLmAMSE)]) + lambda_Tr1<-exp((x.RLmAMSE %*% Beta_Estimate_Full) + F_Estimate_Full[idx.RLmAMSE]) W_Tr1<-as.vector(lambda_Tr1) - H_Tr1 <-(t(x.RLmAMSE) %*% (x.RLmAMSE * W_Tr1)) - b_r1 <-(t(x.RLmAMSE) %*% (lambda_Tr1-lambda_r1)) + H_Tr1 <- crossprod(x.RLmAMSE, x.RLmAMSE * W_Tr1) + b_r1 <- crossprod(x.RLmAMSE, lambda_Tr1-lambda_r1) L1_r1 <- psych::tr(Temp1%*%H_Tr1%*%t(Temp1)) - L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[c(idx.RLmAMSE)]))^2) + L2_r1 <- sum((W_r1*((x.RLmAMSE%*%H_r1%*%b_r1) - F_Estimate_Full[idx.RLmAMSE]))^2) AMSE_Sample_RLmAMSE_Pow[[j]][i,]<-c(r2[i],L1_r1,L2_r1,L1_r1+L2_r1) } diff --git a/R/modelRobustLinSub.R b/R/modelRobustLinSub.R index 8612e1f..a1e6881 100644 --- a/R/modelRobustLinSub.R +++ b/R/modelRobustLinSub.R @@ -64,7 +64,7 @@ #' indexes<-1:ceiling(nrow(Electric_consumption)*0.005) #' Original_Data<-cbind(Electric_consumption[indexes,1],1, #' Electric_consumption[indexes,-1]) -#' colnames(Original_Data)<-c("Y",paste0("X",0:ncol(Original_Data[,-c(1,2)]))) +#' colnames(Original_Data)<-c("Y",paste0("X",0:ncol(Original_Data[,-c(1,2)]))) #' for (j in 3:5) { #' Original_Data[,j]<-scale(Original_Data[,j]) #' } @@ -91,8 +91,7 @@ #' #' r1<-300; r2<-rep(100*c(6,12),25); #' -#' modelRobustLinSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' modelRobustLinSub(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' Apriori_probs = rep(1/length(All_Models),length(All_Models)), #' All_Combinations = All_Models, @@ -133,7 +132,7 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov } PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) x.prop<-lapply(1:length(All_Combinations),function(j){ X[idx.prop,All_Covariates %in% All_Combinations[[j]]] @@ -145,8 +144,8 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov pinv.prop <- 1/PI.prop[idx.prop] fit.prop <- lapply(1:length(All_Combinations), function(j){ - beta.prop<-solve(a=t(x.prop[[j]])%*%x.prop[[j]],b=t(x.prop[[j]])%*%y.prop) - Xbeta_Final<-as.vector(X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop) + beta.prop<-solve(a=crossprod(x.prop[[j]]),b=crossprod(x.prop[[j]],y.prop)) + Xbeta_Final<-X[,All_Covariates %in% All_Combinations[[j]]]%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N Epsilon.prop<-Y-Xbeta_Final return(list("beta.prop"=beta.prop,"Var.prop"=Var.prop,"Epsilon.prop"=Epsilon.prop)) @@ -199,18 +198,10 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov PI_MR.mVc<-matrixStats::rowSums2(do.call(cbind,PI_Single.mVc)%*%diag(Apriori_probs)) # Model Robust Results ## mMSE - # PI_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ # Single Model Results - # PI.mMSE<-sqrt(fit.prop[[j]]$Epsilon.prop^2 * - # matrixStats::rowSums2((X[,All_Covariates %in% All_Combinations[[j]] ] %*% - # solve(t(X[,All_Covariates %in% All_Combinations[[j]] ])%*% - # X[,All_Covariates %in% All_Combinations[[j]] ]))^2)) - # return(PI.mMSE/sum(PI.mMSE)) - # }) - # For efficient row-wise operations PI_Single.mMSE <- lapply(seq_along(All_Combinations), function(j) { X_sub <- X[, All_Covariates %in% All_Combinations[[j]], drop = FALSE] - XtX_inv <- solve(crossprod(X_sub)) # More efficient than t(X) %*% X + XtX_inv <- solve(crossprod(X_sub)) row_sums_squared <- matrixStats::rowSums2((X_sub %*% XtX_inv)^2) PI.mMSE <- sqrt(fit.prop[[j]]$Epsilon.prop^2 * row_sums_squared) PI.mMSE / sum(PI.mMSE) @@ -223,9 +214,9 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov { ## mVc idx_Single.mVc <- lapply(1:length(All_Combinations), function(j){ - sample(1:N, r2[i]-r1, T, PI_Single.mVc[[j]]) # Single Model Results + sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_Single.mVc[[j]]) # Single Model Results }) - idx_MR.mVc <- sample(1:N, r2[i]-r1, T, PI_MR.mVc) # Model Robust Results + idx_MR.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_MR.mVc) # Model Robust Results x_Single.mVc <-lapply(1:length(All_Combinations),function(j){ # Single Model Results X[c(idx_Single.mVc[[j]], idx.prop),All_Covariates %in% All_Combinations[[j]] ] @@ -245,8 +236,8 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov pi4_r<-sqrt(r2[i]*pinv_Single.mVc^(-1)) X_r4<-x_Single.mVc[[j]]/pi4_r Y_r4<-y_Single.mVc[[j]]/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) - Xbeta_Final<-as.vector(X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final<-X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N return(list("beta.prop"=beta.prop,"Var.prop"=Var.prop)) }) @@ -255,8 +246,8 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov pi4_r<-sqrt(r2[i]*pinv_MR.mVc^(-1)) X_r4<-x_MR.mVc[[j]]/pi4_r Y_r4<-y_MR.mVc/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) # Model Robust Results - Xbeta_Final<-as.vector(X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final<-X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N return(list("beta.prop"=beta.prop,"Var.prop"=Var.prop)) }) @@ -279,9 +270,9 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov ## mMSE idx_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ - sample(1:N, r2[i]-r1, T, PI_Single.mMSE[[j]]) # Single Model Results + sample(1:N, size = r2[i]-r1, replace = T, prob = PI_Single.mMSE[[j]]) # Single Model Results }) - idx_MR.mMSE <- sample(1:N, r2[i]-r1, T, PI_MR.mMSE) # Model Robust Results + idx_MR.mMSE <- sample(1:N, size = r2[i]-r1, replace = T, prob = PI_MR.mMSE) # Model Robust Results x_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ X[c(idx_Single.mMSE[[j]], idx.prop),All_Covariates %in% All_Combinations[[j]] ] # Single Model Results @@ -301,8 +292,8 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov pi4_r<-sqrt(r2[i]*pinv_Single.mMSE^(-1)) X_r4<-x_Single.mMSE[[j]]/pi4_r Y_r4<-y_Single.mMSE[[j]]/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) - Xbeta_Final<-as.vector(X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final<-X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N return(list("beta.prop"=beta.prop,"Var.prop"=Var.prop)) }) @@ -311,8 +302,8 @@ modelRobustLinSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov pi4_r<-sqrt(r2[i]*pinv_MR.mMSE^(-1)) X_r4<-x_MR.mMSE[[j]]/pi4_r Y_r4<-y_MR.mMSE/pi4_r - beta.prop<-solve(a=t(X_r4)%*%X_r4,b=t(X_r4)%*%Y_r4) # Model Robust Results - Xbeta_Final<-as.vector(X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop) + beta.prop<-solve(a=crossprod(X_r4),b=crossprod(X_r4,Y_r4)) + Xbeta_Final<-X[,All_Covariates %in% All_Combinations[[j]] ]%*%beta.prop Var.prop<-sum((Y-Xbeta_Final)^2)/N return(list("beta.prop"=beta.prop,"Var.prop"=Var.prop)) }) diff --git a/R/modelRobustLogSub.R b/R/modelRobustLogSub.R index 2a1bc5c..2adf2da 100644 --- a/R/modelRobustLogSub.R +++ b/R/modelRobustLogSub.R @@ -91,8 +91,7 @@ #' #' r1<-300; r2<-rep(100*c(6,12),25); #' -#' modelRobustLogSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' modelRobustLogSub(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' Apriori_probs = rep(1/length(All_Models),length(All_Models)), #' All_Combinations = All_Models, @@ -137,7 +136,7 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov n0 <- N - n1 PI.prop <- rep(1/(2*n0), N) PI.prop[Y==1] <- 1/(2*n1) - idx.prop <- sample(1:N, r1, T, PI.prop) + idx.prop <- sample(1:N, size = r1, replace = TRUE, prob = PI.prop) x.prop<-lapply(1:length(All_Combinations),function(j){ X[idx.prop,All_Covariates %in% All_Combinations[[j]] ] @@ -211,7 +210,7 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov p_Single.prop[[j]] * (1 - p_Single.prop[[j]]) # Single Model Results }) W_Single.prop <- lapply(1:length(All_Combinations),function(j){ - solve(t(x.prop[[j]]) %*% (x.prop[[j]] * w_Single.prop[[j]] * pinv.prop)) # Single Model Results + solve(crossprod(x.prop[[j]],x.prop[[j]] * w_Single.prop[[j]] * pinv.prop)) # Single Model Results }) PI_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ PI.mMSE<-sqrt((Y - P.prop[[j]])^2 * matrixStats::rowSums2((X[,All_Covariates %in% All_Combinations[[j]] ]%*% @@ -226,9 +225,9 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov { ## mVc idx_Single.mVc <- lapply(1:length(All_Combinations), function(j){ - sample(1:N, r2[i]-r1, T, PI_Single.mVc[[j]]) # Single Model Results + sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_Single.mVc[[j]]) # Single Model Results }) - idx_MR.mVc <- sample(1:N, r2[i]-r1, T, PI_MR.mVc) # Model Robust Results + idx_MR.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_MR.mVc) # Model Robust Results x_Single.mVc <-lapply(1:length(All_Combinations),function(j){ X[c(idx_Single.mVc[[j]], idx.prop),All_Covariates %in% All_Combinations[[j]] ] # Single Model results @@ -244,7 +243,7 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov fit_Single.mVc <-lapply(1:length(All_Combinations), function(j){ .getMLE(x=x_Single.mVc[[j]], y=y_Single.mVc[[j]], - w=c(1 / PI_Single.mVc[[j]][idx_Single.mVc[[j]]], pinv.prop)) # Single Model Results + w=c(1 / PI_Single.mVc[[j]][idx_Single.mVc[[j]]], pinv.prop)) # Single Model Results }) fit_MR.mVc <- lapply(1:length(All_Combinations),function(j){ @@ -268,12 +267,10 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov V_Final<-lapply(1:length(All_Combinations),function(j){ pi<-1-1/(1 + exp(x_Single.mVc[[j]] %*% beta.mVc_Single[[j]][i,-1])) W<-as.vector(pi*(1-pi)*c(1 / PI_Single.mVc[[j]][idx_Single.mVc[[j]]], pinv.prop)) - Mx<-solve((t(x_Single.mVc[[j]]) %*% (x_Single.mVc[[j]] * W))) - + Mx<-solve(crossprod(x_Single.mVc[[j]],x_Single.mVc[[j]] * W)) Middle<-((as.vector(y_Single.mVc[[j]])-as.vector(pi))* as.vector(c(1 / PI_Single.mVc[[j]][idx_Single.mVc[[j]]], pinv.prop)))^2 - V_Temp<-(t(x_Single.mVc[[j]]) %*% (x_Single.mVc[[j]] * Middle) ) - + V_Temp<-crossprod(x_Single.mVc[[j]],x_Single.mVc[[j]] * Middle) Mx %*% V_Temp %*% Mx }) @@ -286,11 +283,9 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov V_Final<-lapply(1:length(All_Combinations),function(j){ pi<-1-1/(1+exp(x_MR.mVc[[j]] %*% beta.mVc_MR[[j]][i,-1])) W<-as.vector(pi*(1-pi)*c(1 / PI_MR.mVc[idx_MR.mVc], pinv.prop)) - Mx<-solve((t(x_MR.mVc[[j]]) %*% (x_MR.mVc[[j]] * W) )) - + Mx<-solve(crossprod(x_MR.mVc[[j]], x_MR.mVc[[j]] * W)) Middle<-((as.vector(y_MR.mVc)-as.vector(pi))*as.vector(c(1 / PI_MR.mVc[idx_MR.mVc], pinv.prop)))^2 - V_Temp<-(t(x_MR.mVc[[j]]) %*% (x_MR.mVc[[j]] * Middle)) - + V_Temp<-crossprod(x_MR.mVc[[j]], x_MR.mVc[[j]] * Middle) Mx %*% V_Temp %*% Mx }) @@ -301,9 +296,9 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov ## mMSE idx_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ - sample(1:N, r2[i]-r1, T, PI_Single.mMSE[[j]]) # Single Model Results + sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_Single.mMSE[[j]]) # Single Model Results }) - idx_MR.mMSE <- sample(1:N, r2[i]-r1, T, PI_MR.mMSE) # Model Robust Results + idx_MR.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_MR.mMSE) # Model Robust Results x_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ X[c(idx_Single.mMSE[[j]], idx.prop),All_Covariates %in% All_Combinations[[j]] ] # Single Model Results @@ -319,7 +314,7 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov fit_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ .getMLE(x=x_Single.mMSE[[j]], y=y_Single.mMSE[[j]], - w=c(1 / PI_Single.mMSE[[j]][idx_Single.mMSE[[j]]], pinv.prop)) # Single Model Results + w=c(1 / PI_Single.mMSE[[j]][idx_Single.mMSE[[j]]], pinv.prop)) # Single Model Results }) fit_MR.mMSE <- lapply(1:length(All_Combinations), function(j){ @@ -345,12 +340,10 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov V_Final<-lapply(1:length(All_Combinations),function(j){ pi<-1-1/(1 + exp(x_Single.mMSE[[j]] %*% beta.mMSE_Single[[j]][i,-1])) W<-as.vector(pi*(1-pi)*c(1 / PI_Single.mMSE[[j]][idx_Single.mMSE[[j]]], pinv.prop)) - Mx<-solve((t(x_Single.mMSE[[j]]) %*% (x_Single.mMSE[[j]] * W))) - + Mx<-solve(crossprod(x_Single.mMSE[[j]], x_Single.mMSE[[j]] * W)) Middle<-((as.vector(y_Single.mMSE[[j]])-as.vector(pi))* as.vector(c(1 / PI_Single.mMSE[[j]][idx_Single.mMSE[[j]]], pinv.prop)))^2 - V_Temp<-(t(x_Single.mMSE[[j]]) %*% (x_Single.mMSE[[j]] * Middle)) - + V_Temp<-crossprod(x_Single.mMSE[[j]], x_Single.mMSE[[j]] * Middle) Mx %*% V_Temp %*% Mx }) @@ -363,11 +356,9 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov V_Final<-lapply(1:length(All_Combinations),function(j){ pi<-1-1/(1+exp(x_MR.mMSE[[j]] %*% beta.mMSE_MR[[j]][i,-1])) W<-as.vector(pi*(1-pi)*c(1 / PI_MR.mMSE[idx_MR.mMSE], pinv.prop)) - Mx<-solve((t(x_MR.mMSE[[j]]) %*% (x_MR.mMSE[[j]] * W))) - + Mx<-solve(crossprod(x_MR.mMSE[[j]], x_MR.mMSE[[j]] * W)) Middle<-((as.vector(y_MR.mMSE)-as.vector(pi))*as.vector(c(1 / PI_MR.mMSE[idx_MR.mMSE], pinv.prop)))^2 - V_Temp<-(t(x_MR.mMSE[[j]]) %*% (x_MR.mMSE[[j]] * Middle)) - + V_Temp<-crossprod(x_MR.mMSE[[j]], x_MR.mMSE[[j]] * Middle) Mx %*% V_Temp %*% Mx }) @@ -426,7 +417,7 @@ modelRobustLogSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov msg <- "NA" while (loop <= Loop) { pr <- c(1 - 1 / (1 + exp(x %*% beta))) - H <- t(x) %*% (pr * (1 - pr) * w * x) + H <- crossprod(x,(pr * (1 - pr) * w * x)) S <- colSums((y - pr) * w * x) tryCatch( {shs <- NA diff --git a/R/modelRobustPoiSub.R b/R/modelRobustPoiSub.R index 9a6de83..606bd1f 100644 --- a/R/modelRobustPoiSub.R +++ b/R/modelRobustPoiSub.R @@ -93,8 +93,7 @@ #' #' r1<-300; r2<-rep(100*c(6,12),25); #' -#' modelRobustPoiSub(r1 = r1, r2 = r2, -#' Y = as.matrix(Original_Data[,colnames(Original_Data) %in% c("Y")]), +#' modelRobustPoiSub(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), #' X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), #' Apriori_probs = rep(1/length(All_Models),length(All_Models)), #' All_Combinations = All_Models, @@ -137,7 +136,7 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov } PI.prop <- rep(1/N, N) - idx.prop <- sample(1:N, r1, T) + idx.prop <- sample(1:N, size = r1, replace = TRUE) x.prop<-lapply(1:length(All_Combinations),function(j){ X[idx.prop,All_Covariates %in% All_Combinations[[j]]] @@ -149,7 +148,7 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov pinv.prop <- 1/PI.prop[idx.prop] fit.prop <- lapply(1:length(All_Combinations), function(j){ - stats::glm(y.prop~x.prop[[j]]-1,family = "poisson") + stats::glm(y.prop~x.prop[[j]]-1,family = "quasipoisson") }) beta.prop<-list() @@ -210,7 +209,7 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov P.prop[[j]][idx.prop] # Single Model Results }) W_Single.prop <- lapply(1:length(All_Combinations),function(j){ - solve(t(x.prop[[j]]) %*% (x.prop[[j]] * w_Single.prop[[j]] * pinv.prop)) # Single Model Results + solve(crossprod(x.prop[[j]], x.prop[[j]] * w_Single.prop[[j]] * pinv.prop)) # Single Model Results }) PI_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ # Single Model Results PI.mMSE<-sqrt((Y - P.prop[[j]])^2 * @@ -225,9 +224,9 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov { ## mVc idx_Single.mVc <- lapply(1:length(All_Combinations), function(j){ - sample(1:N, r2[i]-r1, T, PI_Single.mVc[[j]]) # Single Model Results + sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_Single.mVc[[j]]) # Single Model Results }) - idx_MR.mVc <- sample(1:N, r2[i]-r1, T, PI_MR.mVc) # Model Robust Results + idx_MR.mVc <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_MR.mVc) # Model Robust Results x_Single.mVc <-lapply(1:length(All_Combinations),function(j){ # Single Model Results X[c(idx_Single.mVc[[j]], idx.prop),All_Covariates %in% All_Combinations[[j]] ] @@ -244,11 +243,11 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov fit_Single.mVc <-lapply(1:length(All_Combinations), function(j){ # Single Model Results pinv_Single.mVc<-c(1 / PI_Single.mVc[[j]][idx_Single.mVc[[j]]], pinv.prop) - stats::glm(y_Single.mVc[[j]]~x_Single.mVc[[j]]-1, family = "poisson",weights=pinv_Single.mVc) + stats::glm(y_Single.mVc[[j]]~x_Single.mVc[[j]]-1, family = "quasipoisson",weights=pinv_Single.mVc) }) fit_MR.mVc <- lapply(1:length(All_Combinations),function(j){ - stats::glm(y_MR.mVc~x_MR.mVc[[j]]-1,family="poisson",weights=pinv_MR.mVc) # Model Robust Results + stats::glm(y_MR.mVc~x_MR.mVc[[j]]-1,family="quasipoisson",weights=pinv_MR.mVc) # Model Robust Results }) for (j in 1:length(All_Combinations)) @@ -268,9 +267,8 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov V_Final<-lapply(1:length(All_Combinations),function(j){ pi<-c(exp(x_Single.mVc[[j]] %*% beta.mVc_Single[[j]][i,-1])) pinv_Single.mVc<-c(1 / PI_Single.mVc[[j]][idx_Single.mVc[[j]]], pinv.prop) - Mx<-solve(t(x_Single.mVc[[j]]) %*% (x_Single.mVc[[j]] * pi * pinv_Single.mVc)) - V_Temp<-t(x_Single.mVc[[j]]) %*% (x_Single.mVc[[j]]*((as.vector(y_Single.mVc[[j]])-pi)*pinv_Single.mVc)^2) - + Mx<-solve(crossprod(x_Single.mVc[[j]], x_Single.mVc[[j]] * pi * pinv_Single.mVc)) + V_Temp<-crossprod(x_Single.mVc[[j]], x_Single.mVc[[j]]*((as.vector(y_Single.mVc[[j]])-pi)*pinv_Single.mVc)^2) Mx %*% V_Temp %*% Mx }) @@ -282,9 +280,8 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov # Model Robust Results V_Final<-lapply(1:length(All_Combinations),function(j){ pi<- c(exp(x_MR.mVc[[j]] %*% beta.mVc_MR[[j]][i,-1])) - Mx<-solve(t(x_MR.mVc[[j]]) %*% (x_MR.mVc[[j]]*pi*pinv_MR.mVc)) - V_Temp<-t(x_MR.mVc[[j]]) %*% (x_MR.mVc[[j]]*((as.vector(y_MR.mVc)-pi)*pinv_MR.mVc)^2) - + Mx<-solve(crossprod(x_MR.mVc[[j]], x_MR.mVc[[j]]*pi*pinv_MR.mVc)) + V_Temp<-crossprod(x_MR.mVc[[j]], x_MR.mVc[[j]]*((as.vector(y_MR.mVc)-pi)*pinv_MR.mVc)^2) Mx %*% V_Temp %*% Mx }) @@ -295,9 +292,9 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov ## mMSE idx_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ - sample(1:N, r2[i]-r1, T, PI_Single.mMSE[[j]]) # Single Model Results + sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_Single.mMSE[[j]]) # Single Model Results }) - idx_MR.mMSE <- sample(1:N, r2[i]-r1, T, PI_MR.mMSE) # Model Robust Results + idx_MR.mMSE <- sample(1:N, size = r2[i]-r1, replace = TRUE, prob = PI_MR.mMSE) # Model Robust Results x_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ X[c(idx_Single.mMSE[[j]], idx.prop),All_Covariates %in% All_Combinations[[j]] ] # Single Model Results @@ -314,11 +311,11 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov fit_Single.mMSE <- lapply(1:length(All_Combinations),function(j){ # Single Model Results pinv_Single.mMSE<-c(1 / PI_Single.mMSE[[j]][idx_Single.mMSE[[j]]], pinv.prop) - stats::glm(y_Single.mMSE[[j]]~x_Single.mMSE[[j]]-1, family = "poisson",weights=pinv_Single.mMSE) + stats::glm(y_Single.mMSE[[j]]~x_Single.mMSE[[j]]-1, family = "quasipoisson",weights=pinv_Single.mMSE) }) fit_MR.mMSE <- lapply(1:length(All_Combinations), function(j){ # Model Robust Results - stats::glm(y_MR.mMSE~x_MR.mMSE[[j]]-1, family = "poisson",weights=pinv_MR.mMSE) + stats::glm(y_MR.mMSE~x_MR.mMSE[[j]]-1, family = "quasipoisson",weights=pinv_MR.mMSE) }) for (j in 1:length(All_Combinations)) @@ -340,9 +337,8 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov V_Final<-lapply(1:length(All_Combinations),function(j){ pi<-c(exp(x_Single.mMSE[[j]] %*% beta.mMSE_Single[[j]][i,-1])) pinv_Single.mMSE<-c(1 / PI_Single.mMSE[[j]][idx_Single.mMSE[[j]]], pinv.prop) - Mx<-solve(t(x_Single.mMSE[[j]]) %*% (x_Single.mMSE[[j]]*pi*pinv_Single.mMSE)) - V_Temp<-t(x_Single.mMSE[[j]]) %*% (x_Single.mMSE[[j]]*((as.vector(y_Single.mMSE[[j]])-pi)*pinv_Single.mMSE)^2) - + Mx<-solve(crossprod(x_Single.mMSE[[j]], x_Single.mMSE[[j]]*pi*pinv_Single.mMSE)) + V_Temp<-crossprod(x_Single.mMSE[[j]], x_Single.mMSE[[j]]*((as.vector(y_Single.mMSE[[j]])-pi)*pinv_Single.mMSE)^2) Mx %*% V_Temp %*% Mx }) @@ -354,9 +350,8 @@ modelRobustPoiSub <- function(r1,r2,Y,X,N,Apriori_probs,All_Combinations,All_Cov # Model Robust Results V_Final<-lapply(1:length(All_Combinations),function(j){ pi<-c(exp(x_MR.mMSE[[j]] %*% beta.mMSE_MR[[j]][i,-1])) - Mx<-solve(t(x_MR.mMSE[[j]]) %*% (x_MR.mMSE[[j]]*pi*pinv_MR.mMSE)) - V_Temp<-t(x_MR.mMSE[[j]]) %*% (x_MR.mMSE[[j]]*((as.vector(y_MR.mMSE)-pi)*pinv_MR.mMSE)^2) - + Mx<-solve(crossprod(x_MR.mMSE[[j]], x_MR.mMSE[[j]]*pi*pinv_MR.mMSE)) + V_Temp<-crossprod(x_MR.mMSE[[j]], x_MR.mMSE[[j]]*((as.vector(y_MR.mMSE)-pi)*pinv_MR.mMSE)^2) Mx %*% V_Temp %*% Mx }) diff --git a/_pkgdown.yml b/_pkgdown.yml index 8e664c5..fff3af1 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -10,7 +10,7 @@ template: primary: "#003366" development: - mode: auto + mode: release navbar: title: NeEDS4BigData @@ -35,6 +35,10 @@ navbar: href: articles/Basic_Sampling_Poi_Reg.html - text: Poisson Regression - Model robust and misspecification href: articles/Poisson_Regression.html + - text: Benchmarking - Model based subsampling + href: articles/Benchmarking_model_based.html + - text: Benchmarking - Model robust subsampling + href: articles/Benchmarking_model_robust.html - text: Versions href: news/index.html right: diff --git a/inst/WORDLIST b/inst/WORDLIST index 5f27af9..e847ea8 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,6 +1,5 @@ AMSE Abhinav -Apriori Berard BigData CodeFactor @@ -8,25 +7,21 @@ Fanaee Hebrail LmAMSE MJ +MVNormal NeEDS Poisson RLmAMSE Rajen Sceaux UCI -Var codecov -criterions doi endogeneity esign frac ggplot ldots -misspecifications nonskin -packag -packageversion poisson softmax th diff --git a/man/ALoptimalGLMSub.Rd b/man/ALoptimalGLMSub.Rd index 9697367..5ce7142 100644 --- a/man/ALoptimalGLMSub.Rd +++ b/man/ALoptimalGLMSub.Rd @@ -69,8 +69,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(600,50); Original_Data<-Full_Data$Complete_Data; -ALoptimalGLMSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +ALoptimalGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), family = "linear")->Results @@ -82,8 +81,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(600,50); Original_Data<-Full_Data$Complete_Data; -ALoptimalGLMSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +ALoptimalGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), family = "logistic")->Results @@ -95,8 +93,7 @@ Full_Data<-GenGLMdata(Dist,NULL,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(600,50); Original_Data<-Full_Data$Complete_Data; -ALoptimalGLMSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +ALoptimalGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), family = "poisson")->Results diff --git a/man/AoptimalGauLMSub.Rd b/man/AoptimalGauLMSub.Rd index d19259a..822f594 100644 --- a/man/AoptimalGauLMSub.Rd +++ b/man/AoptimalGauLMSub.Rd @@ -58,8 +58,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; -AoptimalGauLMSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +AoptimalGauLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]), N = nrow(Original_Data))->Results diff --git a/man/AoptimalMCGLMSub.Rd b/man/AoptimalMCGLMSub.Rd index 5f51f5e..5c1470a 100644 --- a/man/AoptimalMCGLMSub.Rd +++ b/man/AoptimalMCGLMSub.Rd @@ -66,8 +66,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; -AoptimalMCGLMSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +AoptimalMCGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), family = "linear")->Results @@ -79,8 +78,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; -AoptimalMCGLMSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +AoptimalMCGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), family = "logistic")->Results @@ -92,8 +90,7 @@ Full_Data<-GenGLMdata(Dist,NULL,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(100*c(6,12),50); Original_Data<-Full_Data$Complete_Data; -AoptimalMCGLMSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +AoptimalMCGLMSub(r1 = r1, r2 = r2,Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), family = "poisson")->Results diff --git a/man/GenGLMdata.Rd b/man/GenGLMdata.Rd index 4572397..f1f2a08 100644 --- a/man/GenGLMdata.Rd +++ b/man/GenGLMdata.Rd @@ -7,7 +7,7 @@ GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,family) } \arguments{ -\item{Dist}{a character value for the distribution "Normal" or "Uniform or "Exponential"} +\item{Dist}{a character value for the distribution "Normal", "MVNormal", "Uniform or "Exponential"} \item{Dist_Par}{a list of parameters for the distribution that would generate data for covariate X} @@ -26,8 +26,8 @@ The output of \code{GenGLMdata} gives a list of } \description{ Function to simulate big data under linear, logistic and Poisson regression for sampling. -Covariate data X is through Normal or Uniform distribution for linear regression. -Covariate data X is through Exponential or Normal or Uniform distribution for logistic regression. +Covariate data X is through Normal, Multivariate Normal or Uniform distribution for linear regression. +Covariate data X is through Exponential, Normal, Multivariate Normal or Uniform distribution for logistic regression. Covariate data X is through Normal or Uniform distribution for Poisson regression. } \details{ @@ -35,19 +35,31 @@ Big data for the Generalised Linear Models are generated by the "linear", "logis regression types. We have limited the covariate data generation for -linear regression through normal and uniform distribution, -logistic regression through exponential, normal and uniform and +linear regression through normal, multivariate normal and uniform distribution, +logistic regression through exponential, normal, multivariate normal and uniform distribution Poisson regression through normal and uniform distribution. } \examples{ -Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1,Error_Variance=0.5) -No_Of_Var<-2; Beta<-c(-1,2,1); N<-5000; Family<-"linear" +No_Of_Var<-2; Beta<-c(-1,2,1); N<-5000; + +# Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1,Error_Variance=0.5) +Dist<-"MVNormal"; +Dist_Par<-list(Mean=rep(0,No_Of_Var),Variance=diag(rep(2,No_Of_Var)),Error_Variance=0.5) +# Dist<-"Uniform"; Dist_Par<-list(Min=0,Max=1) + +Family<-"linear" Results<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) -Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1); Family<-"logistic" +Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1); +# Dist<-"MVNormal"; Dist_Par<-list(Mean=rep(0,No_Of_Var),Variance=diag(rep(2,No_Of_Var))) +# Dist<-"Exponential"; Dist_Par<-list(Rate=3) +# Dist<-"Uniform"; Dist_Par<-list(Min=0,Max=1) + +Family<-"logistic" Results<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) -Dist<-"Normal"; Family<-"poisson" +# Dist<-"Normal"; +Dist<-"Uniform"; Family<-"poisson" Results<-GenGLMdata(Dist,NULL,No_Of_Var,Beta,N,Family) } diff --git a/man/LCCsampling.Rd b/man/LCCsampling.Rd index 51e38ee..bd7ce26 100644 --- a/man/LCCsampling.Rd +++ b/man/LCCsampling.Rd @@ -58,7 +58,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r1<-300; r2<-rep(100*c(6,9,12),50); Original_Data<-Full_Data$Complete_Data; -LCCsampling(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +LCCsampling(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]), N = nrow(Original_Data))->Results diff --git a/man/LeverageSampling.Rd b/man/LeverageSampling.Rd index cecaff1..03c3ac9 100644 --- a/man/LeverageSampling.Rd +++ b/man/LeverageSampling.Rd @@ -67,7 +67,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r<-rep(100*c(6,10),50); Original_Data<-Full_Data$Complete_Data; -LeverageSampling(r = r, Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +LeverageSampling(r = r, Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), S_alpha = 0.95, family = "linear")->Results @@ -80,7 +80,7 @@ Full_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) r<-rep(100*c(6,10),50); Original_Data<-Full_Data$Complete_Data; -LeverageSampling(r = r, Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +LeverageSampling(r = r, Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), S_alpha = 0.95, family = "logistic")->Results @@ -93,7 +93,7 @@ Full_Data<-GenGLMdata(Dist,NULL,No_Of_Var,Beta,N,Family) r<-rep(100*c(6,10),50); Original_Data<-Full_Data$Complete_Data; -LeverageSampling(r = r, Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +LeverageSampling(r = r, Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), S_alpha = 0.95, family = "poisson")->Results diff --git a/man/modelRobustLinSub.Rd b/man/modelRobustLinSub.Rd index ed5d132..8030587 100644 --- a/man/modelRobustLinSub.Rd +++ b/man/modelRobustLinSub.Rd @@ -73,7 +73,7 @@ where \eqn{q=1,\ldots,Q} and \eqn{Q} is the number of models in the model set. indexes<-1:ceiling(nrow(Electric_consumption)*0.005) Original_Data<-cbind(Electric_consumption[indexes,1],1, Electric_consumption[indexes,-1]) - colnames(Original_Data)<-c("Y",paste0("X",0:ncol(Original_Data[,-c(1,2)]))) +colnames(Original_Data)<-c("Y",paste0("X",0:ncol(Original_Data[,-c(1,2)]))) for (j in 3:5) { Original_Data[,j]<-scale(Original_Data[,j]) } @@ -100,8 +100,7 @@ names(All_Models)<-paste0("Model_",1:length(All_Models)) r1<-300; r2<-rep(100*c(6,12),25); -modelRobustLinSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +modelRobustLinSub(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), Apriori_probs = rep(1/length(All_Models),length(All_Models)), All_Combinations = All_Models, diff --git a/man/modelRobustLogSub.Rd b/man/modelRobustLogSub.Rd index 22a216b..aaf6564 100644 --- a/man/modelRobustLogSub.Rd +++ b/man/modelRobustLogSub.Rd @@ -100,8 +100,7 @@ names(All_Models)<-paste0("Model_",1:length(All_Models)) r1<-300; r2<-rep(100*c(6,12),25); -modelRobustLogSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +modelRobustLogSub(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), Apriori_probs = rep(1/length(All_Models),length(All_Models)), All_Combinations = All_Models, diff --git a/man/modelRobustPoiSub.Rd b/man/modelRobustPoiSub.Rd index 89763b2..5ea1535 100644 --- a/man/modelRobustPoiSub.Rd +++ b/man/modelRobustPoiSub.Rd @@ -102,8 +102,7 @@ names(All_Models)<-paste0("Model_",1:length(All_Models)) r1<-300; r2<-rep(100*c(6,12),25); -modelRobustPoiSub(r1 = r1, r2 = r2, - Y = as.matrix(Original_Data[,colnames(Original_Data) \%in\% c("Y")]), +modelRobustPoiSub(r1 = r1, r2 = r2, Y = as.matrix(Original_Data[,1]), X = as.matrix(Original_Data[,-1]),N = nrow(Original_Data), Apriori_probs = rep(1/length(All_Models),length(All_Models)), All_Combinations = All_Models, diff --git a/renv.lock b/renv.lock index aa810b4..a06ab8e 100644 --- a/renv.lock +++ b/renv.lock @@ -9,6 +9,13 @@ ] }, "Packages": { + "BH": { + "Package": "BH", + "Version": "1.87.0-1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "468d9a03ba57f22ebde50060fd13ba9f" + }, "GPArotation": { "Package": "GPArotation", "Version": "2024.3-1", @@ -22,9 +29,9 @@ }, "MASS": { "Package": "MASS", - "Version": "7.3-61", + "Version": "7.3-64", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "grDevices", @@ -33,11 +40,11 @@ "stats", "utils" ], - "Hash": "0cafd6f0500e5deba33be22c46bf6055" + "Hash": "49d2d8090b74c1179df1aff16201caf8" }, "Matrix": { "Package": "Matrix", - "Version": "1.7-0", + "Version": "1.7-1", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -50,7 +57,7 @@ "stats", "utils" ], - "Hash": "1920b2f11133b12350024297d8a4ff4a" + "Hash": "5122bb14d8736372411f955e1b16bc8a" }, "R6": { "Package": "R6", @@ -74,20 +81,20 @@ }, "Rcpp": { "Package": "Rcpp", - "Version": "1.0.12", + "Version": "1.0.13-1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "methods", "utils" ], - "Hash": "5ea2700d21e038ace58269ecdbeb9ec0" + "Hash": "6b868847b365672d6c1677b1608da9ed" }, "RcppArmadillo": { "Package": "RcppArmadillo", - "Version": "0.12.8.4.0", + "Version": "14.2.2-1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "Rcpp", @@ -95,7 +102,7 @@ "stats", "utils" ], - "Hash": "a535dd90aa8ec9a2e63a8f79b4a1bf43" + "Hash": "9da7c242d94a8419d045f6b3a64b9765" }, "RcppGSL": { "Package": "RcppGSL", @@ -110,13 +117,13 @@ }, "RcppParallel": { "Package": "RcppParallel", - "Version": "5.1.7", + "Version": "5.1.9", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R" ], - "Hash": "a45594a00f5dbb073d5ec9f48592a08a" + "Hash": "f38a72a419b91faac0ce5d9eee04c120" }, "RcppZiggurat": { "Package": "RcppZiggurat", @@ -136,9 +143,9 @@ }, "Rdpack": { "Package": "Rdpack", - "Version": "2.6.1", + "Version": "2.6", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "methods", @@ -146,13 +153,13 @@ "tools", "utils" ], - "Hash": "24a964d2cf75ad25d7b843856c8d4c93" + "Hash": "3e1384ada5d3948b392e98b11434d972" }, "Rfast": { "Package": "Rfast", - "Version": "2.1.0", + "Version": "2.1.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "Rcpp", @@ -160,18 +167,18 @@ "RcppParallel", "RcppZiggurat" ], - "Hash": "79e8394e1fa06a4ae954b70ca9b16e8f" + "Hash": "994cb1d45f644b5fdf59df4a2dfb57ed" }, "cli": { "Package": "cli", - "Version": "3.6.2", + "Version": "3.6.3", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "utils" ], - "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" + "Hash": "b21916dd77a27642b447374a5d30ecf3" }, "codetools": { "Package": "codetools", @@ -185,9 +192,9 @@ }, "colorspace": { "Package": "colorspace", - "Version": "2.1-0", + "Version": "2.1-1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "grDevices", @@ -195,17 +202,17 @@ "methods", "stats" ], - "Hash": "f20c47fd52fae58b4e377c37bb8c335b" + "Hash": "d954cb1c57e8d8b756165d7ba18aa55a" }, "cpp11": { "Package": "cpp11", - "Version": "0.4.7", + "Version": "0.5.1", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R" ], - "Hash": "5a295d7d963cc5035284dcdbaf334f4e" + "Hash": "9df43854f1c84685d095ed6270b52387" }, "dplyr": { "Package": "dplyr", @@ -264,7 +271,7 @@ }, "gam": { "Package": "gam", - "Version": "1.22-4", + "Version": "1.22-5", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -274,7 +281,7 @@ "splines", "stats" ], - "Hash": "1d00ef061ca18a5d4dc4483bb75599cb" + "Hash": "453698a6f7535fbb77841e8015b5ee57" }, "generics": { "Package": "generics", @@ -289,7 +296,7 @@ }, "ggh4x": { "Package": "ggh4x", - "Version": "0.2.8", + "Version": "0.3.0", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -303,7 +310,7 @@ "stats", "vctrs" ], - "Hash": "012d7705b4cdc7b5ee89895aeefc1d45" + "Hash": "8e0e5e8db2bda5c3bdc48268afa5afea" }, "ggplot2": { "Package": "ggplot2", @@ -330,20 +337,34 @@ ], "Hash": "44c6a2f8202d5b7e878ea274b1092426" }, + "ggridges": { + "Package": "ggridges", + "Version": "0.5.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "ggplot2", + "grid", + "scales", + "withr" + ], + "Hash": "66488692cb8621bc78df1b9b819497a6" + }, "glue": { "Package": "glue", - "Version": "1.7.0", + "Version": "1.8.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "methods" ], - "Hash": "e0b3a53876554bd45879e596cdb10a52" + "Hash": "5899f1eaa825580172bb56c08266f37c" }, "gtable": { "Package": "gtable", - "Version": "0.3.5", + "Version": "0.3.6", "Source": "Repository", "Repository": "RSPM", "Requirements": [ @@ -352,9 +373,10 @@ "glue", "grid", "lifecycle", - "rlang" + "rlang", + "stats" ], - "Hash": "e18861963cbc65a27736e02b3cd3c4a0" + "Hash": "de949855009e2d4d0e52a844e30617ae" }, "isoband": { "Package": "isoband", @@ -429,13 +451,13 @@ }, "matrixStats": { "Package": "matrixStats", - "Version": "1.3.0", + "Version": "1.4.1", "Source": "Repository", - "Repository": "RSPM", + "Repository": "CRAN", "Requirements": [ "R" ], - "Hash": "4b3ea27a19d669c0405b38134d89a9d1" + "Hash": "8885ffb1f46e820dede6b2ca9442abca" }, "mgcv": { "Package": "mgcv", @@ -475,11 +497,23 @@ ], "Hash": "4fd8900853b746af55b81fda99da7695" }, + "mvnfast": { + "Package": "mvnfast", + "Version": "0.2.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "BH", + "Rcpp", + "RcppArmadillo" + ], + "Hash": "e65cac8e8501bdfbdca0412c37bb18c9" + }, "nlme": { "Package": "nlme", - "Version": "3.1-165", + "Version": "3.1-166", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "graphics", @@ -487,16 +521,15 @@ "stats", "utils" ], - "Hash": "2769a88be217841b1f33ed469675c3cc" + "Hash": "ccbb8846be320b627e6aa2b4616a2ded" }, "pillar": { "Package": "pillar", - "Version": "1.9.0", + "Version": "1.10.0", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "cli", - "fansi", "glue", "lifecycle", "rlang", @@ -504,7 +537,7 @@ "utils", "vctrs" ], - "Hash": "15da5a8412f317beeee6175fbc76f4bb" + "Hash": "101ca350beea21261a15ba169d7a8513" }, "pkgconfig": { "Package": "pkgconfig", @@ -518,7 +551,7 @@ }, "psych": { "Package": "psych", - "Version": "2.4.6.26", + "Version": "2.4.12", "Source": "Repository", "Repository": "CRAN", "Requirements": [ @@ -532,7 +565,7 @@ "parallel", "stats" ], - "Hash": "4448d5f3ac3e2cbf79074391d494637e" + "Hash": "b6659cfdaf2545e88959f00bdb0a0951" }, "purrr": { "Package": "purrr", @@ -551,7 +584,7 @@ }, "rbibutils": { "Package": "rbibutils", - "Version": "2.2.16", + "Version": "2.3", "Source": "Repository", "Repository": "RSPM", "Requirements": [ @@ -559,17 +592,17 @@ "tools", "utils" ], - "Hash": "8c06968e0a5b0209c5f34239b1302336" + "Hash": "dfc034a172fd88fc66b1a703894c4185" }, "renv": { "Package": "renv", - "Version": "1.0.7", + "Version": "1.0.11", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "utils" ], - "Hash": "397b7b2a265bc5a7a06852524dabae20" + "Hash": "47623f66b4e80b3b0587bc5d7b309888" }, "rlang": { "Package": "rlang", @@ -726,15 +759,15 @@ }, "withr": { "Package": "withr", - "Version": "3.0.0", + "Version": "3.0.2", "Source": "Repository", - "Repository": "CRAN", + "Repository": "RSPM", "Requirements": [ "R", "grDevices", "graphics" ], - "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + "Hash": "cc2d62c76458d425210d1eb1478b30b4" } } } diff --git a/renv/activate.R b/renv/activate.R index d13f993..0eb5108 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,7 +2,7 @@ local({ # the requested version of renv - version <- "1.0.7" + version <- "1.0.11" attr(version, "sha") <- NULL # the project directory @@ -98,6 +98,66 @@ local({ unloadNamespace("renv") # load bootstrap tools + ansify <- function(text) { + if (renv_ansify_enabled()) + renv_ansify_enhanced(text) + else + renv_ansify_default(text) + } + + renv_ansify_enabled <- function() { + + override <- Sys.getenv("RENV_ANSIFY_ENABLED", unset = NA) + if (!is.na(override)) + return(as.logical(override)) + + pane <- Sys.getenv("RSTUDIO_CHILD_PROCESS_PANE", unset = NA) + if (identical(pane, "build")) + return(FALSE) + + testthat <- Sys.getenv("TESTTHAT", unset = "false") + if (tolower(testthat) %in% "true") + return(FALSE) + + iderun <- Sys.getenv("R_CLI_HAS_HYPERLINK_IDE_RUN", unset = "false") + if (tolower(iderun) %in% "false") + return(FALSE) + + TRUE + + } + + renv_ansify_default <- function(text) { + text + } + + renv_ansify_enhanced <- function(text) { + + # R help links + pattern <- "`\\?(renv::(?:[^`])+)`" + replacement <- "`\033]8;;ide:help:\\1\a?\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # runnable code + pattern <- "`(renv::(?:[^`])+)`" + replacement <- "`\033]8;;ide:run:\\1\a\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # return ansified text + text + + } + + renv_ansify_init <- function() { + + envir <- renv_envir_self() + if (renv_ansify_enabled()) + assign("ansify", renv_ansify_enhanced, envir = envir) + else + assign("ansify", renv_ansify_default, envir = envir) + + } + `%||%` <- function(x, y) { if (is.null(x)) y else x } @@ -142,7 +202,10 @@ local({ # compute common indent indent <- regexpr("[^[:space:]]", lines) common <- min(setdiff(indent, -1L)) - leave - paste(substring(lines, common), collapse = "\n") + text <- paste(substring(lines, common), collapse = "\n") + + # substitute in ANSI links for executable renv code + ansify(text) } @@ -305,8 +368,11 @@ local({ quiet = TRUE ) - if ("headers" %in% names(formals(utils::download.file))) - args$headers <- renv_bootstrap_download_custom_headers(url) + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(url) + if (length(headers) && is.character(headers)) + args$headers <- headers + } do.call(utils::download.file, args) @@ -385,10 +451,21 @@ local({ for (type in types) { for (repos in renv_bootstrap_repos()) { + # build arguments for utils::available.packages() call + args <- list(type = type, repos = repos) + + # add custom headers if available -- note that + # utils::available.packages() will pass this to download.file() + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(repos) + if (length(headers) && is.character(headers)) + args$headers <- headers + } + # retrieve package database db <- tryCatch( as.data.frame( - utils::available.packages(type = type, repos = repos), + do.call(utils::available.packages, args), stringsAsFactors = FALSE ), error = identity @@ -470,6 +547,14 @@ local({ } + renv_bootstrap_github_token <- function() { + for (envvar in c("GITHUB_TOKEN", "GITHUB_PAT", "GH_TOKEN")) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(envval) + } + } + renv_bootstrap_download_github <- function(version) { enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") @@ -477,16 +562,16 @@ local({ return(FALSE) # prepare download options - pat <- Sys.getenv("GITHUB_PAT") - if (nzchar(Sys.which("curl")) && nzchar(pat)) { + token <- renv_bootstrap_github_token() + if (nzchar(Sys.which("curl")) && nzchar(token)) { fmt <- "--location --fail --header \"Authorization: token %s\"" - extra <- sprintf(fmt, pat) + extra <- sprintf(fmt, token) saved <- options("download.file.method", "download.file.extra") options(download.file.method = "curl", download.file.extra = extra) on.exit(do.call(base::options, saved), add = TRUE) - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { + } else if (nzchar(Sys.which("wget")) && nzchar(token)) { fmt <- "--header=\"Authorization: token %s\"" - extra <- sprintf(fmt, pat) + extra <- sprintf(fmt, token) saved <- options("download.file.method", "download.file.extra") options(download.file.method = "wget", download.file.extra = extra) on.exit(do.call(base::options, saved), add = TRUE) diff --git a/tests/testthat/test-GenGLMdata.R b/tests/testthat/test-GenGLMdata.R index b7f1367..8b1fe53 100644 --- a/tests/testthat/test-GenGLMdata.R +++ b/tests/testthat/test-GenGLMdata.R @@ -71,13 +71,13 @@ test_that("Error on Results output for Family",{ Family<-"linear"; Dist<-"Exp"; Beta<-c(-1,2,1) test_that("Error on Results output for linear Dist",{ expect_error(GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family), - "For linear regression select the distribution 'Normal' \n or 'Uniform' to generate the covarate data") + "For linear regression select the distribution 'Normal', 'MVNormal' \n or 'Uniform' to generate the covarate data") }) Family<-"logistic"; Dist<-"Exp" test_that("Error on Results output for logistic Dist",{ expect_error(GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family), - "For logistic regression select the distribution 'Exponential', \n 'Normal' or 'Uniform' to generate the covarate data") + "For logistic regression select the distribution 'Exponential', \n 'Normal', 'MVNormal' or 'Uniform' to generate the covarate data") }) Family<-"poisson"; Dist<-"Exp" diff --git a/vignettes/Basic_Sampling_Lin_Reg.Rmd b/vignettes/Basic_Sampling_Lin_Reg.Rmd index 0f703fb..7280327 100644 --- a/vignettes/Basic_Sampling_Lin_Reg.Rmd +++ b/vignettes/Basic_Sampling_Lin_Reg.Rmd @@ -45,14 +45,14 @@ Theme_special<-function(){ # Understanding the electric consumption data ``Electric power consumption'' data [@hebrailindividual], which contains $2,049,280$ measurements for a house located at Sceaux, France between December 2006 and November 2010. -The data contains $4$ columns, the first column is the response variable and the rest are covariates, however we only use the first $5\%$ of the data for this demonstration. +The data contains $4$ columns, the first column is the response variable and the rest are covariates, however we only use the first $25\%$ of the data for this demonstration. The response $y$ is the log scaled intensity, while the covariates are active electrical energy in the a) kitchen ($X_1$), b) laundry room ($X_2$) and c) water-heater and air-conditioner ($X_3$). The covariates are scaled to be mean of zero and variance of one. For the given data subsampling methods are implemented assuming the main effects model can describe the data. ```{r Exploring data} -# Selecting 5% of the big data and prepare it -indexes<-1:ceiling(nrow(Electric_consumption)*0.05) +# Selecting 25% of the big data and prepare it +indexes<-1:ceiling(nrow(Electric_consumption)*0.25) Original_Data<-cbind(Electric_consumption[indexes,1],1,Electric_consumption[indexes,-1]) colnames(Original_Data)<-c("Y",paste0("X",0:ncol(Original_Data[,-c(1,2)]))) @@ -65,7 +65,7 @@ head(Original_Data) %>% caption = "First few observations of the electric consumption data.") # Setting the sample sizes -N<-nrow(Original_Data); M<-250; k<-seq(6,18,by=3)*100; rep_k<-rep(k,each=M) +N<-nrow(Original_Data); M<-250; k<-seq(8,20,by=2)*100; rep_k<-rep(k,each=M) ``` Based on this model the methods random sampling, leverage sampling [@ma2014statistical;@ma2015leveraging], $A$-optimality subsampling with Gaussian Linear Model [@lee2022sampling], $A$- and $L$-optimality subsampling [@ai2021optimal;@yao2021review] and $A$-optimality subsampling with response constraint [@zhang2021optimal] are implemented on the big data. @@ -80,8 +80,8 @@ Method_Colour<-c("#BBFFBB","#50FF50","#00BB00","#008600", Method_Shape_Types<-c(rep(17,4),rep(4,3),16) ``` -The obtained samples and their respective model parameter estimates are over $M=100$ simulations across different sample sizes $k=(600,\ldots,1500)$. -We set the initial sample size of $r1=300$ for the methods that requires a random sample. +The obtained samples and their respective model parameter estimates are over $M=250$ simulations across different sample sizes $k=(800,\ldots,2000)$. +We set the initial sample size of $r1=400$ for the methods that requires a random sample. From the final samples, model parameters of the assume model are estimated. These estimated model parameters are compared with the estimated model parameters of the full big data through the mean squared error $MSE(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ}\sum_{i=1}^M \sum_{j=1}^J(\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$. Here, $\tilde{\beta}_k$ is the estimated model parameters from the sample of size $k$ and $\hat{\beta}$ is the estimated model parameters from the full big data, while $j$ is index of the model parameter. @@ -119,7 +119,7 @@ colnames(Final_Beta_LS)<-c("Method","Sample",paste0("Beta",0:3)) ```{r A-optimality subsampling for GauLin Model} # A-optimality subsampling for Gaussian Linear Model -NeEDS4BigData::AoptimalGauLMSub(r1=300,r2=rep_k, +NeEDS4BigData::AoptimalGauLMSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]),N=N)->Results Final_Beta_AoptGauLM<-Results$Beta_Estimates @@ -131,7 +131,7 @@ colnames(Final_Beta_AoptGauLM)<-c("Method","Sample",paste0("Beta",0:3)) ```{r A- and L- optimaliy subsampling} # A- and L-optimality subsampling for GLM -NeEDS4BigData::ALoptimalGLMSub(r1=300,r2=rep_k, +NeEDS4BigData::ALoptimalGLMSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), N=N,family = "linear")->Results @@ -143,7 +143,7 @@ colnames(Final_Beta_ALoptGLM)<-c("Method","Sample",paste0("Beta",0:3)) ```{r A-optimality subsampling with measurement constraints} # A-optimality subsampling for without response -NeEDS4BigData::AoptimalMCGLMSub(r1=300,r2=rep_k, +NeEDS4BigData::AoptimalMCGLMSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), N=N,family="linear")->Results diff --git a/vignettes/Basic_Sampling_Log_Reg.Rmd b/vignettes/Basic_Sampling_Log_Reg.Rmd index 4b89e51..62e5330 100644 --- a/vignettes/Basic_Sampling_Log_Reg.Rmd +++ b/vignettes/Basic_Sampling_Log_Reg.Rmd @@ -66,7 +66,7 @@ head(Original_Data) %>% caption = "First few observations of the skin segmentation data.") # Setting the sample sizes -N<-nrow(Original_Data); M<-300; k<-seq(9,24,by=3)*100; rep_k<-rep(k,each=M) +N<-nrow(Original_Data); M<-250; k<-seq(8,20,by=2)*100; rep_k<-rep(k,each=M) ``` Based on this model the methods random sampling, leverage sampling [@ma2014statistical;@ma2015leveraging], local case control sampling [@fithian2015local], $A$- and $L$-optimality subsampling [@ai2021optimal;@yao2021review] and $A$-optimality subsampling with response constraint [@zhang2021optimal] are implemented on the big data. @@ -81,8 +81,8 @@ Method_Colour<-c("#BBFFBB","#50FF50","#00BB00", Method_Shape_Types<-c(rep(17,3),rep(4,4),16) ``` -The obtained samples and their respective model parameter estimates are over $M=100$ simulations across different sample sizes $k=(600,\ldots,1500)$. -We set the initial sample size of $r1=300$ for the methods that requires a random sample. +The obtained samples and their respective model parameter estimates are over $M=250$ simulations across different sample sizes $k=(800,\ldots,2000)$. +We set the initial sample size of $r1=400$ for the methods that requires a random sample. From the final samples, model parameters of the assume model are estimated. These estimated model parameters are compared with the estimated model parameters of the full big data through the mean squared error $MSE(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ}\sum_{i=1}^M \sum_{j=1}^J(\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$. Here, $\tilde{\beta}_k$ is the estimated model parameters from the sample of size $k$ and $\hat{\beta}$ is the estimated model parameters from the full big data, while $j$ is index of the model parameter. @@ -120,7 +120,7 @@ colnames(Final_Beta_LS)<-c("Method","Sample",paste0("Beta",0:3)) ```{r local case control sampling} # Local case control sampling -NeEDS4BigData::LCCsampling(r1=300,r2=rep_k, +NeEDS4BigData::LCCsampling(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), N=N)->Results @@ -133,7 +133,7 @@ colnames(Final_Beta_LCCS)<-c("Method","Sample",paste0("Beta",0:3)) ```{r A- and L-optimality subsampling} # A- and L-optimality subsampling for GLM -NeEDS4BigData::ALoptimalGLMSub(r1=300,r2=rep_k, +NeEDS4BigData::ALoptimalGLMSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), N=N,family = "logistic")->Results @@ -145,7 +145,7 @@ colnames(Final_Beta_ALoptGLM)<-c("Method","Sample",paste0("Beta",0:3)) ```{r A-optimality subsampling under measurement constraints} # A-optimality subsampling for without response -NeEDS4BigData::AoptimalMCGLMSub(r1=300,r2=rep_k, +NeEDS4BigData::AoptimalMCGLMSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), N=N,family="logistic")->Results @@ -173,7 +173,7 @@ remove(Final_Beta_RS,Final_Beta_LS,Final_Beta_LCCS,Final_Beta_ALoptGLM, The mean squared error is plotted below. -```{r Model parameter estimates,fig.width=7,fig.height=5,fig.align='center',fig.cap="Mean squared error for all the subsampling methods with 5% and 95% percentile intervals."} +```{r Model parameter estimates,fig.width=7,fig.height=10,fig.align='center',fig.cap="Mean squared error for a) all the subsampling methods and b) without leverage and local case control sampling, with 5% and 95% percentile intervals."} # Obtain the mean squared error for the model parameter estimates MSE_Beta<-data.frame("Method"=Final_Beta$Method, "Sample"=Final_Beta$Sample, @@ -198,7 +198,27 @@ ggplot(data=Mean_Data,aes(x=factor(Sample),y=Mean,color=Method,shape=Method))+ scale_color_manual(values = Method_Colour)+ scale_shape_manual(values = Method_Shape_Types)+ theme_bw()+Theme_special()+ - guides(colour = guide_legend(nrow = 3)) + guides(colour = guide_legend(nrow = 3))->p1 + +Left_out<-c(paste0(c("Basic ","Shrinkage ","Unweighted "),"Leverage"), + "Local case control sampling") +# Plot for the mean squared error except leverage and local case control sampling +ggplot(data=Mean_Data[!(Mean_Data$Method %in% Left_out),], + aes(x=factor(Sample),y=Mean,color=Method,shape=Method))+ + xlab("Sample Size")+ylab("Squared Error")+ + geom_point(size=3,position = position_dodge(width = 0.5))+ + geom_line(data=Mean_Data[!(Mean_Data$Method %in% Left_out),], + aes(x=factor(Sample),y=Mean,group=Method,color=Method), + position = position_dodge(width = 0.5))+ + geom_errorbar(data=Mean_Data[!(Mean_Data$Method %in% Left_out),], + aes(ymin=min,ymax=max), + width=0.3,position = position_dodge(width = 0.5))+ + scale_color_manual(values = Method_Colour[-c(4:7)])+ + scale_shape_manual(values = Method_Shape_Types[-c(4:7)])+ + theme_bw()+Theme_special()+ + guides(colour = guide_legend(nrow = 2))->p2 + +ggarrange(p1,p2,nrow = 2,ncol = 1,labels = "auto") ``` ## References diff --git a/vignettes/Basic_Sampling_Poi_Reg.Rmd b/vignettes/Basic_Sampling_Poi_Reg.Rmd index 6d21bf7..1d6dde9 100644 --- a/vignettes/Basic_Sampling_Poi_Reg.Rmd +++ b/vignettes/Basic_Sampling_Poi_Reg.Rmd @@ -64,7 +64,7 @@ head(Original_Data) %>% caption = "First few observations of the bike sharing data.") # Setting the sample sizes -N<-nrow(Original_Data); M<-250; k<-seq(6,18,by=3)*100; rep_k<-rep(k,each=M) +N<-nrow(Original_Data); M<-250; k<-seq(8,20,by=2)*100; rep_k<-rep(k,each=M) ``` Based on this model the methods random sampling, leverage sampling [@ma2014statistical;@ma2015leveraging], $A$- and $L$-optimality subsampling [@ai2021optimal;@yao2021review] and $A$-optimality subsampling with response constraint [@zhang2021optimal] are implemented on the big data. @@ -79,8 +79,8 @@ Method_Colour<-c("#BBFFBB","#50FF50","#00BB00", Method_Shape_Types<-c(rep(17,3),rep(4,3),16) ``` -The obtained samples and their respective model parameter estimates are over $M=100$ simulations across different sample sizes $k=(600,\ldots,1500)$. -We set the initial sample size of $r1=300$ for the methods that requires a random sample. +The obtained samples and their respective model parameter estimates are over $M=250$ simulations across different sample sizes $k=(800,\ldots,2000)$. +We set the initial sample size of $r1=400$ for the methods that requires a random sample. From the final samples, model parameters of the assume model are estimated. These estimated model parameters are compared with the estimated model parameters of the full big data through the mean squared error $MSE(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ}\sum_{i=1}^M \sum_{j=1}^J(\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$. Here, $\tilde{\beta}_k$ is the estimated model parameters from the sample of size $k$ and $\hat{\beta}$ is the estimated model parameters from the full big data, while $j$ is index of the model parameter. @@ -118,7 +118,7 @@ colnames(Final_Beta_LS)<-c("Method","Sample",paste0("Beta",0:3)) ```{r A- and L-optimality subsampling} # A- and L-optimality subsampling for GLM -NeEDS4BigData::ALoptimalGLMSub(r1=300,r2=rep_k, +NeEDS4BigData::ALoptimalGLMSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), N=N,family = "poisson")->Results @@ -130,7 +130,7 @@ colnames(Final_Beta_ALoptGLM)<-c("Method","Sample",paste0("Beta",0:3)) ```{r A-optimality subsampling with measurement constraints} # A-optimality subsampling without response -NeEDS4BigData::AoptimalMCGLMSub(r1=300,r2=rep_k, +NeEDS4BigData::AoptimalMCGLMSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), N=N,family="poisson")->Results @@ -158,7 +158,7 @@ remove(Final_Beta_RS,Final_Beta_LS,Final_Beta_ALoptGLM, The mean squared error is plotted below. -```{r First scenario model parameter estimates,fig.width=7,fig.height=5,fig.align='center',fig.cap="Mean squared error for all the subsampling methods with 5% and 95% percentile intervals."} +```{r First scenario model parameter estimates,fig.width=7,fig.height=10,fig.align='center',fig.cap="Mean squared error for a) all the subsampling methods and b) without unweighted leverage sampling, with 5% and 95% percentile intervals."} # Obtain the mean squared error for the model parameter estimates MSE_Beta<-data.frame("Method"=Final_Beta$Method, "Sample"=Final_Beta$Sample, @@ -183,7 +183,25 @@ ggplot(data=Mean_Data,aes(x=factor(Sample),y=Mean,color=Method,shape=Method))+ scale_color_manual(values = Method_Colour)+ scale_shape_manual(values = Method_Shape_Types)+ theme_bw()+Theme_special()+ - guides(colour = guide_legend(nrow = 3)) + guides(colour = guide_legend(nrow = 3))->p1 + +# Plot for the mean squared error with all methods except unweighted leverage +ggplot(data=Mean_Data[Mean_Data$Method != "Unweighted Leverage",], + aes(x=factor(Sample),y=Mean,color=Method,shape=Method))+ + xlab("Sample Size")+ylab("Squared Error")+ + geom_point(size=3,position = position_dodge(width = 0.5))+ + geom_line(data=Mean_Data[Mean_Data$Method != "Unweighted Leverage",], + aes(x=factor(Sample),y=Mean,group=Method,color=Method), + position = position_dodge(width = 0.5))+ + geom_errorbar(data=Mean_Data[Mean_Data$Method != "Unweighted Leverage",], + aes(ymin=min,ymax=max),width=0.3, + position = position_dodge(width = 0.5))+ + scale_color_manual(values = Method_Colour[-7])+ + scale_shape_manual(values = Method_Shape_Types[-7])+ + theme_bw()+Theme_special()+ + guides(colour = guide_legend(nrow = 3))->p2 + +ggarrange(p1,p2,nrow = 2,ncol = 1,labels = "auto") ``` ## References diff --git a/vignettes/Benchmarking_model_based.Rmd b/vignettes/Benchmarking_model_based.Rmd new file mode 100644 index 0000000..a422fa9 --- /dev/null +++ b/vignettes/Benchmarking_model_based.Rmd @@ -0,0 +1,271 @@ +--- +title: "Benchmarking model-based subsampling functions" +resource_files: + - additionaldata/Results_Model_based.Rdata +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Benchmarking model-based subsampling functions} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + + + +```{r knitr options,include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +``` + +```{r load packages and theme,message=FALSE} +# Load the R packages +library(ggplot2) +library(ggpubr) +library(tidyr) +library(dplyr) + +# Theme for plots +Theme_special<-function(){ + theme(legend.key.width=unit(1,"cm"), + axis.text.x = element_text(color = "black",size=14), + axis.text.y = element_text(color = "black",size=14), + strip.text = element_text(colour = "black",size = 16,face="bold"), + panel.grid.minor.x = element_blank(), + axis.title= element_text(color = "black",face = "bold",size = 14), + legend.text = element_text(color = "black", size=16), + legend.position = "bottom", + legend.margin=margin(0,0,0,0), + legend.box.margin=margin(-1,-2,-1,-2)) +} + +load("additionaldata/Results_Model_based.Rdata") +``` + +## Setup + +The `lm()`, `biglm()`, `glm()` and `bigglm()` functions are benchmarked against the model-based subsampling functions. +Benchmarking is conducted across all three regression problems using a consistent setup throughout. +For the big data sizes $N = \{10^4,5 \times 10^4,10^5,5 \times 10^5,10^6,5 \times 10^6\}$ and for five different Covariates sizes $\{5,10,25,50,100\}$, the functions were replicated $50$ times. +When using the subsampling functions, the initial subsample sizes $\{100,100,250,500,1000\}$ were selected based on the covariate sizes, while the final subsample size was fixed at $2500$ to ensure successful implementation. + +```{r N and Covariate size} +N_size<-c(1,5,10,50,100,500)*10000 +N_size_labels<-c("10^4","5 x 10^4","10^5","5 x 10^5","10^6","5 x 10^6") +CS_size<-c(5,10,25,50,100) +``` + +This implementation was conducted on a high-performance computing system; however, the code for linear regression-related functions is shown below. +Furthermore, it can be extended to logistic and Poisson regression by incorporating the relevant subsampling functions and model configurations. + +```{r Code setup for benchmarking,eval=FALSE} +# load the packages +library(NeEDS4BigData) +library(here) +library(biglm) + +# indexes for N and covariate sizes +indexA <- as.numeric(Sys.getenv("indexA")) +indexB <- as.numeric(Sys.getenv("indexB")) + +# set N and covariate size, and assign replicates +N_size<-c(1,5,10,50,100,500)*10000 +Covariate_size<-c(5,10,25,50,100) +Replicates<-50 + +# set the initial and final subsample sizes, +# with the distribution parameters to generate data +r1<-c(1,1,2.5,5,10)*100; r2<-2500; +Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1,Error_Variance=0.5); +Family<-"linear" + +# assign the indexes +N_idx<-indexA +Covariate_idx<-indexB +No_Of_Var<-Covariate_size[Covariate_idx] +N<-N_size[N_idx] + +# generate the big data based on N and covariate size +Beta<-c(-1,rep(0.5,Covariate_size[Covariate_idx])) +Generated_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) +Full_Data<-Generated_Data$Complete_Data + +cat("N size :",N_size[N_idx]," and Covariate size :",Covariate_size[Covariate_idx],"\n") + +# formula for the linear regression model +lm_formula<-as.formula(paste("Y ~", paste(paste0("X",0:ncol(Full_Data[,-c(1,2)])), + collapse = " + "))) + +# benchmarking the stats::lm() function +lm<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + suppressMessages(lm(Y~.-1,data=data.frame(Full_Data))) + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked lm() function.\n") + +# benchmarking the biglm::biglm() function +biglm<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + suppressMessages(biglm(lm_formula,data=data.frame(Full_Data))) + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked biglm() function.\n") + +# benchmarking the NeEDS4BigData::AoptimalGauLMSub() function +AoptimalGauLMSub<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + suppressMessages(AoptimalGauLMSub(r1[Covariate_idx],r2, + Y=as.matrix(Full_Data[,1]), + X=as.matrix(Full_Data[,-1]), + N=nrow(Full_Data))) + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked AoptimalGauLMSub() function.\n") + +# benchmarking the NeEDS4BigData::LeverageSampling() function +LeverageSampling<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + suppressMessages(LeverageSampling(r2, + Y=as.matrix(Full_Data[,1]), + X=as.matrix(Full_Data[,-1]), + N=nrow(Full_Data), + S_alpha=0.95, + family=Family)) + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked LeverageSampling() function.\n") + +# benchmarking the NeEDS4BigData::ALoptimalGLMSub() function +ALoptimalGLMSub<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + suppressMessages(ALoptimalGLMSub(r1[Covariate_idx],r2, + Y=as.matrix(Full_Data[,1]), + X=as.matrix(Full_Data[,-1]), + N=nrow(Full_Data), + family=Family)) + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked ALoptimalGLMSub() function.\n") + +# benchmarking the NeEDS4BigData::AoptimalMCGLMSub() function +AoptimalMCGLMSub<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + suppressMessages(AoptimalMCGLMSub(r1[Covariate_idx],r2, + Y=as.matrix(Full_Data[,1]), + X=as.matrix(Full_Data[,-1]), + N=nrow(Full_Data), + family=Family)) + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked AoptimalMCGLMSub() function.\n") + +Plot_Data<-cbind.data.frame("N size"=N_size[N_idx], + "Covariate size"=Covariate_size[Covariate_idx],"lm()"=lm, + "biglm()"=biglm,"AoptimalGauLMSub()"=AoptimalGauLMSub, + "LeverageSampling()"=LeverageSampling, + "ALoptimalGLMSub()"=ALoptimalGLMSub, + "AoptimalMCGLMSub()"=AoptimalMCGLMSub) + +save(Plot_Data, + file=here("Results",paste0("Output_NS_",N_idx,"_CS_",Covariate_idx,".RData"))) +``` + +## Linear Regression + +For linear regression, the following functions from the NeEDS4BigData package: (1) `AoptimalGauLMSub()`, (2) `LeverageSampling()`, (3) `ALoptimalGLMSub()`, and (4) `AoptimalMCGLMSub()` are compared against `lm()` and `biglm()`. + +```{r linear regression,fig.width=5*3,fig.height=5*2,fig.align='center',fig.cap="Average time for functions, with 5% and 95% percentile intervals under linear regression."} +Methods_FCT<-c("lm()","biglm()","LeverageSampling()","AoptimalMCGLMSub()", + "AoptimalGauLMSub()","ALoptimalGLMSub()") +Method_Colors<-c("grey","black","#F76D5E","#A50021","#BBFFBB","#50FF50") + +Final_Linear_Regression %>% + pivot_longer(cols = `lm()`:`AoptimalMCGLMSub()`, + names_to = "Methods",values_to = "Time") %>% + group_by(`N size`,`Covariate size`,Methods) %>% + summarise(Mean=mean(Time),min=quantile(Time,0.05),max=quantile(Time,0.95), + .groups = "drop") %>% + mutate(Methods=factor(Methods,levels = Methods_FCT,labels = Methods_FCT), + `N size`=factor(`N size`,levels = N_size, + labels=paste0("N = ",N_size_labels))) %>% +ggplot(.,aes(x=factor(`Covariate size`),y=Mean,color=Methods,group=Methods))+ + geom_point(position = position_dodge(width = 0.5))+ + geom_line(position = position_dodge(width = 0.5))+ + geom_errorbar(aes(ymin=min,ymax=max),position = position_dodge(width = 0.5))+ + facet_wrap(~factor(`N size`),scales = "free",nrow=2)+ + xlab("Number of Covariates")+ylab("Time in Seconds")+ + scale_color_manual(values = Method_Colors)+ + theme_bw()+ggtitle("Linear Regression")+Theme_special() +``` + +In general, our subsampling functions perform faster as the size of the big data and the number of covariates increase, except for `LeverageSampling()`. +Even when a solution for linear regression is available in an analytical form, the subsampling functions perform as well as `biglm()`. + +## Logistic Regression + +For logistic regression, the following functions: (1) `LCCSampling()`, (2) `LeverageSampling()`, (3) `AoptimalMCGLMSub()`, and (4) `ALoptimalGLMSub()` are compared against `glm()` and `bigglm()`. + +```{r logistic regression,fig.width=5*3,fig.height=5*2,fig.align='center',fig.cap="Average time for functions, with 5% and 95% percentile intervals under logistic regression."} +Methods_FCT<-c("glm()","bigglm()","LCCSampling()","LeverageSampling()", + "AoptimalMCGLMSub()","ALoptimalGLMSub()") +Method_Colors<-c("grey","black","#F76D5E","#A50021","#BBFFBB","#50FF50") + +Final_Logistic_Regression %>% + pivot_longer(cols = `glm()`:`AoptimalMCGLMSub()`, + names_to = "Methods",values_to = "Time") %>% + group_by(`N size`,`Covariate size`,Methods) %>% + summarise(Mean=mean(Time),min=quantile(Time,0.05),max=quantile(Time,0.95), + .groups = "drop") %>% + mutate(Methods=factor(Methods,levels = Methods_FCT,labels = Methods_FCT), + `N size`=factor(`N size`,levels = N_size, + labels=paste0("N = ",N_size_labels))) %>% +ggplot(.,aes(x=factor(`Covariate size`),y=Mean,color=Methods,group=Methods))+ + geom_point(position = position_dodge(width = 0.5))+ + geom_line(position = position_dodge(width = 0.5))+ + geom_errorbar(aes(ymin=min,ymax=max),position = position_dodge(width = 0.5))+ + facet_wrap(~factor(`N size`),scales = "free",nrow=2)+ + xlab("Number of Covariates")+ylab("Time in Seconds")+ + scale_color_manual(values = Method_Colors)+ + theme_bw()+Theme_special()+ggtitle("Logistic Regression") +``` + +There seems to be little difference between using `glm()` and `bigglm()`, while the subsampling functions perform faster, with the performance gap increasing as the size of the big data and the number of covariates grow. + +## Poisson Regression + +For Poisson regression, the following functions: (1) `LeverageSampling()`, (2) `AoptimalMCGLMSub()`, and (3) `ALoptimalGLMSub()` are compared against `glm()` and `bigglm()`. + +```{r poisson regression, fig.width=5*3,fig.height=5*2,fig.align='center',fig.cap="Average time for functions, with 5% and 95% percentile intervals under Poisson regression."} +Methods_FCT<-c("glm()","bigglm()","LeverageSampling()", + "AoptimalMCGLMSub()","ALoptimalGLMSub()") +Method_Colors<-c("grey","black","#A50021","#BBFFBB","#50FF50") + +Final_Poisson_Regression %>% + pivot_longer(cols = `glm()`:`AoptimalMCGLMSub()`, + names_to = "Methods",values_to = "Time") %>% + group_by(`N size`,`Covariate size`,Methods) %>% + summarise(Mean=mean(Time),min=quantile(Time,0.05),max=quantile(Time,0.95), + .groups = "drop") %>% + mutate(Methods=factor(Methods,levels = Methods_FCT,labels = Methods_FCT), + `N size`=factor(`N size`,levels = N_size, + labels=paste0("N = ",N_size_labels))) %>% +ggplot(.,aes(x=factor(`Covariate size`),y=Mean,color=Methods,group=Methods))+ + geom_point(position = position_dodge(width = 0.5))+ + geom_line(position = position_dodge(width = 0.5))+ + geom_errorbar(aes(ymin=min,ymax=max),position = position_dodge(width = 0.5))+ + facet_wrap(~factor(`N size`),scales = "free",nrow=2)+ + xlab("Number of Covariates")+ylab("Time in Seconds")+ + scale_color_manual(values = Method_Colors)+ + theme_bw()+Theme_special()+ggtitle("Poisson Regression") +``` + +Similar to logistic regression, the subsampling functions perform faster than the `glm()` and `bigglm()` functions. + +In summary, the subsampling functions available in this R package perform best under high-dimensional data. diff --git a/vignettes/Benchmarking_model_robust.Rmd b/vignettes/Benchmarking_model_robust.Rmd new file mode 100644 index 0000000..225b46d --- /dev/null +++ b/vignettes/Benchmarking_model_robust.Rmd @@ -0,0 +1,284 @@ +--- +title: "Benchmarking model-robust subsampling functions" +resource_files: + - additionaldata/Results_Model_robust.Rdata +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Benchmarking model-robust subsampling functions} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + + + +```{r knitr options,include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +``` + +```{r load packages and theme,message=FALSE} +# Load the R packages +library(ggplot2) +library(ggpubr) +library(tidyr) +library(dplyr) + +# Theme for plots +Theme_special<-function(){ + theme(legend.key.width=unit(1,"cm"), + axis.text.x = element_text(color = "black",size=14), + axis.text.y = element_text(color = "black",size=14), + strip.text = element_text(colour = "black",size = 16,face="bold"), + panel.grid.minor.x = element_blank(), + axis.title= element_text(color = "black",face = "bold",size = 14), + legend.text = element_text(color = "black", size=16), + legend.position = "bottom", + legend.margin=margin(0,0,0,0), + legend.box.margin=margin(-1,-2,-1,-2)) +} + +load("additionaldata/Results_Model_robust.Rdata") +``` + +## Setup + +The `lm()`, `biglm()`, `glm()`, and `bigglm()` functions are benchmarked against the model-robust subsampling functions. +This benchmarking is conducted across all three regression problems using a consistent setup throughout. +For large data sizes $N = \{10^4,5 \times 10^4,10^5,5 \times 10^5,10^6,5 \times 10^6\}$, three different covariate sizes $\{5,10,25,50,100\}$, and three different model sizes $\{3,5,10\}$, the functions were replicated 50 times. +When using the model-robust subsampling functions, the initial subsample sizes $\{100,250,500\}$ were selected based on the covariate sizes, while the final subsample size was fixed at $2500$. +Here, the models included in the model set are selected based on their AIC values, with a squared term derived from the main effects. + +```{r N and Covariate size} +N_size<-c(1,5,10,50,100,500)*10000 +N_size_labels<-c("10^4","5 x 10^4","10^5","5 x 10^5","10^6","5 x 10^6") +CS_size<-c(10,25,50) +NOM_size<-c(3,5,10) +N_and_CS_size <- c(t(outer(CS_size, N_size_labels, + function(cs, n) paste0("N = ",n, + " and \nNumber of Covariates ",cs)))) +``` + +This implementation was conducted on a high-performance computing system; however, the code for linear regression-related functions is shown below. +Furthermore, it can be extended to logistic and Poisson regression using the relevant subsampling functions and model configurations. + +```{r Code setup for benchmarking,eval=FALSE} +# load the packages +library(NeEDS4BigData) +library(here) +library(biglm) + +# indexes for N, covariate sizes and number of models +indexA <- as.numeric(Sys.getenv("indexA")) +indexB <- as.numeric(Sys.getenv("indexB")) +indexC <- as.numeric(Sys.getenv("indexC")) + +# set N, covariate size, number of models and assign replicates +N_size<-c(1,5,10,50,100,500)*10000 +Covariate_size<-c(10,25,50) +No_of_Models<-c(3,5,10) +Replicates<-50 + +# set the initial and final subsample sizes, +# with the distribution parameters to generate data +r1<-c(1,2.5,5)*100; r2<-2500; +Dist<-"Normal"; Dist_Par<-list(Mean=0,Variance=1,Error_Variance=0.5); +Family<-"linear" + +# assign the indexes +N_idx<-indexA; Covariate_idx<-indexB; ModelSet_idx<-indexC +No_Of_Var<-Covariate_size[Covariate_idx] +N<-N_size[N_idx] +Model_Set<-No_of_Models[ModelSet_idx] + +# generate the big data based on N and covariate size +Beta<-c(-1,rep(0.5,Covariate_size[Covariate_idx])) +Generated_Data<-GenGLMdata(Dist,Dist_Par,No_Of_Var,Beta,N,Family) +Full_Data<-Generated_Data$Complete_Data + +# Find the models in the model set for model-robust subsampling +# based on AIC values +Full_Data<-cbind(Full_Data,Full_Data[,-c(1,2)]^2) +colnames(Full_Data)<-c("Y",paste0("X",0:No_Of_Var),paste0("X",1:No_Of_Var,"^2")) +Temp_Data<-Full_Data[sample(1:N,1000),] + +AIC_Values<-NULL +for (i in 1:No_Of_Var) { + temp_data<-as.data.frame(Temp_Data[,c("Y",paste0("X",0:No_Of_Var),paste0("X",i,"^2"))]) + model <- lm(Y~.-1, data = temp_data) + AIC_Values[i]<-AIC(model) +} + +# Covariates in model set +Best_Indices <- order(AIC_Values)[1:Model_Set] +Model_Apriori<-rep(1/Model_Set,Model_Set) +All_Combinations<-lm_formula<-list(); +for (NOM_idx in 1:Model_Set) { + All_Combinations[[NOM_idx]]<-c(paste0("X",0:No_Of_Var), + paste0("X",Best_Indices[NOM_idx],"^2")) + lm_formula[[NOM_idx]]<-as.formula(paste("Y ~", + paste(c(paste0("X",0:No_Of_Var), + paste0("X",Best_Indices[NOM_idx],"^2")), + collapse = " + "))) +} + +cat("N size :",N_size[N_idx]," and Covariate size :",Covariate_size[Covariate_idx], + " with the model set ",No_of_Models[ModelSet_idx],"\n") + +# benchmarking the stats::lm() function +lm<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + for(NOM_idx in 1:length(lm_formula)){ + suppressMessages(lm(lm_formula[[NOM_idx]],data=data.frame(Full_Data))) + } + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked lm() function.\n") + +# benchmarking the biglm::biglm() function +biglm<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + for (NOM_idx in 1:length(lm_formula)) { + suppressMessages(biglm(lm_formula[[NOM_idx]],data=data.frame(Full_Data))) + } + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked biglm() function.\n") + +# benchmarking the NeEDS4BigData::modelRobustLinSub() function +modelRobustLinSub<-sapply(1:Replicates,function(i){ + start_T<-Sys.time() + suppressMessages(modelRobustLinSub(r1[Covariate_idx],r2, + Y=as.matrix(Full_Data[,1]), + X=as.matrix(Full_Data[,-1]), + N=nrow(Full_Data), + Apriori_probs=Model_Apriori, + All_Combinations = All_Combinations, + All_Covariates = colnames(Full_Data[,-1]))) + return(difftime(Sys.time(),start_T,units = "secs")) +}) + +cat("Benchmarked modelRobustLinSub() function.") + +Plot_Data<-cbind.data.frame("N size"=N_size[N_idx], + "Covariate size"=Covariate_size[Covariate_idx], + "No of Models"= No_of_Models[ModelSet_idx], + "lm()"=lm,"biglm()"=biglm, + "modelRobustLinSub()"=modelRobustLinSub) + +save(Plot_Data, + file=here("Results",paste0("Output_NS_",N_idx,"_CS_",Covariate_idx, + "_MS_",ModelSet_idx,".RData"))) +``` + +## Linear regression + +For linear regression, the `modelRobustLinSub()` function from the NeEDS4BigData package was compared against `lm()` and `biglm()`. + +```{r linear regression, fig.height=4*3,fig.width=4*6,fig.align='center',fig.cap="Average time for functions, with 5% and 95% percentile intervals under model robust linear regression."} +Methods_FCT<-c("lm()","biglm()","modelRobustLinSub()") +Method_Colors<-c("grey","black","#50FF50") + +Final_Linear_Regression %>% + pivot_longer(cols = `lm()`:`modelRobustLinSub()`, + names_to = "Methods",values_to = "Time") %>% + mutate(Methods=factor(Methods,levels = Methods_FCT,labels = Methods_FCT), + `N size`=factor(`N size`,levels = N_size,labels = N_size_labels), + `N and Covariate size`=paste0("N = ",`N size`, + " and \nNumber of Covariates ", + `Covariate size`)) %>% + mutate(`N and Covariate size`=factor(`N and Covariate size`, + levels = N_and_CS_size, + labels = N_and_CS_size)) %>% + select(`N and Covariate size`,`No of Models`,Methods,Time) %>% + group_by(`N and Covariate size`,`No of Models`,Methods) %>% + summarise(Mean=mean(Time),min=quantile(Time,0.05),max=quantile(Time,0.95), + .groups = "drop") %>% + ggplot(.,aes(x=factor(`No of Models`),y=Mean,color=Methods,group=Methods))+ + geom_point(position = position_dodge(width = 0.5))+ + geom_line(position = position_dodge(width = 0.5))+ + geom_errorbar(aes(ymin=min,ymax=max),position = position_dodge(width = 0.5))+ + facet_wrap(.~factor(`N and Covariate size`),scales = "free",ncol=length(N_size))+ + xlab("Number of Models")+ylab("Time in Seconds")+ + scale_color_manual(values = Method_Colors)+ + theme_bw()+Theme_special()+ggtitle("Linear Regression") +``` + +In general, our subsampling functions perform faster as the size of the big data, the number of covariates, and the number of models increase. +Even when a solution for linear regression is available in an analytical form, the subsampling functions perform better than or as well as `biglm()`. + +## Logistic regression + +For logistic regression, the `modelRobustLogSub()` function was compared against `glm()` and `bigglm()`. + +```{r logistic regression, fig.height=4*3,fig.width=4*6,fig.align='center',fig.cap="Average time for functions, with 5% and 95% percentile intervals under model robust logistic regression."} +Methods_FCT<-c("glm()","bigglm()","modelRobustLogSub()") +Method_Colors<-c("grey","black","#50FF50") + +Final_Logistic_Regression %>% + pivot_longer(cols = `glm()`:`modelRobustLogSub()`, + names_to = "Methods",values_to = "Time") %>% + mutate(Methods=factor(Methods,levels = Methods_FCT,labels = Methods_FCT), + `N size`=factor(`N size`,levels = N_size,labels = N_size_labels), + `N and Covariate size`=paste0("N = ",`N size`, + " and \nNumber of Covariates ", + `Covariate size`)) %>% + mutate(`N and Covariate size`=factor(`N and Covariate size`, + levels = N_and_CS_size, + labels = N_and_CS_size)) %>% + select(`N and Covariate size`,`No of Models`,Methods,Time) %>% + group_by(`N and Covariate size`,`No of Models`,Methods) %>% + summarise(Mean=mean(Time),min=quantile(Time,0.05),max=quantile(Time,0.95), + .groups = "drop") %>% + ggplot(.,aes(x=factor(`No of Models`),y=Mean,color=Methods,group=Methods))+ + geom_point(position = position_dodge(width = 0.5))+ + geom_line(position = position_dodge(width = 0.5))+ + geom_errorbar(aes(ymin=min,ymax=max),position = position_dodge(width = 0.5))+ + facet_wrap(.~factor(`N and Covariate size`),scales = "free",ncol=length(N_size))+ + xlab("Number of Models")+ylab("Time in Seconds")+ + scale_color_manual(values = Method_Colors)+ + theme_bw()+Theme_special()+ggtitle("Logistic Regression") +``` + +It seems there is a significant difference between using `glm()` and `bigglm()`, with the model-robust subsampling function performing faster. +This performance gap increases as the size of the big data, the number of covariates, and the number of models grow. + +## Poisson Regression + +For Poisson regression, the function `modelRobustPoiSub()` was compared against `glm()` and `bigglm()`. + +```{r poisson regression, fig.height=4*3,fig.width=4*6,fig.align='center',fig.cap="Average time for functions, with 5% and 95% percentile intervals under model robust Poisson regression."} +Methods_FCT<-c("glm()","bigglm()","modelRobustPoiSub()") +Method_Colors<-c("grey","black","#50FF50") + +Final_Poisson_Regression %>% + pivot_longer(cols = `glm()`:`modelRobustPoiSub()`, + names_to = "Methods",values_to = "Time") %>% + mutate(Methods=factor(Methods,levels = Methods_FCT,labels = Methods_FCT), + `N size`=factor(`N size`,levels = N_size,labels = N_size_labels), + `N and Covariate size`=paste0("N = ",`N size`, + " and \nNumber of Covariates ", + `Covariate size`)) %>% + mutate(`N and Covariate size`=factor(`N and Covariate size`, + levels = N_and_CS_size, + labels = N_and_CS_size)) %>% + select(`N and Covariate size`,`No of Models`,Methods,Time) %>% + group_by(`N and Covariate size`,`No of Models`,Methods) %>% + summarise(Mean=mean(Time),min=quantile(Time,0.05),max=quantile(Time,0.95), + .groups = "drop") %>% + ggplot(.,aes(x=factor(`No of Models`),y=Mean,color=Methods,group=Methods))+ + geom_point(position = position_dodge(width = 0.5))+ + geom_line(position = position_dodge(width = 0.5))+ + geom_errorbar(aes(ymin=min,ymax=max),position = position_dodge(width = 0.5))+ + facet_wrap(.~factor(`N and Covariate size`),scales = "free",ncol=length(N_size))+ + xlab("Number of Models")+ylab("Time in Seconds")+ + scale_color_manual(values = Method_Colors)+ + theme_bw()+Theme_special()+ggtitle("Poisson Regression") +``` + +Similar to logistic regression, the model-robust subsampling function performs faster than the `glm()` and `bigglm()` functions. + +In summary, the model-robust subsampling functions available in this R package perform best under high-dimensional data. diff --git a/vignettes/Linear_Regression.Rmd b/vignettes/Linear_Regression.Rmd index bfe25ab..9974603 100644 --- a/vignettes/Linear_Regression.Rmd +++ b/vignettes/Linear_Regression.Rmd @@ -46,7 +46,7 @@ Theme_special<-function(){ # Understanding the electric consumption data ``Electric power consumption'' data [@hebrailindividual], which contains $2,049,280$ measurements for a house located at Sceaux, France between December 2006 and November 2010. -The data contains $4$ columns and has $2,049,280$ observations, first column is the response variable and the rest are covariates, however we only use the first $1\%$ of the data for this explanation. +The data contains $4$ columns and has $2,049,280$ observations, first column is the response variable and the rest are covariates, however we only use the first $10\%$ of the data for this explanation. The response $y$ is the log scaled intensity, while the covariates are active electrical energy in the a) kitchen ($X_1$), b) laundry room ($X_2$) and c) water-heater and air-conditioner ($X_3$). The covariates are scaled to be mean of zero and variance of one. @@ -56,8 +56,8 @@ Given data is analysed under two different scenarios, 2. subsampling method assuming the main effects model is potentially misspecified. ```{r Exploring data} -# Selecting 1% of the big data and prepare it -indexes<-1:ceiling(nrow(Electric_consumption)*0.01) +# Selecting 25% of the big data and prepare it +indexes<-1:ceiling(nrow(Electric_consumption)*0.10) Original_Data<-cbind(Electric_consumption[indexes,1],1, Electric_consumption[indexes,-1]) colnames(Original_Data)<-c("Y",paste0("X",0:ncol(Original_Data[,-c(1,2)]))) @@ -71,14 +71,14 @@ head(Original_Data) %>% caption = "First few observations of the electric consumption data.") # Setting the sample sizes -N<-nrow(Original_Data); M<-250; k<-seq(6,18,by=3)*100; rep_k<-rep(k,each=M) +N<-nrow(Original_Data); M<-250; k<-seq(8,20,by=2)*100; rep_k<-rep(k,each=M) ``` ## Model robust or average subsampling The method $A$- and $L$-optimality of model robust or average subsampling [@mahendran2023model] is compared against the $A$- and $L$-optimality subsampling [@ai2021optimal;@yao2021review] method. Here five different models are considered 1) main effects model ($\beta_0+\beta_1X_1+\beta_2X_2+\beta_3X_3$), 2-4) main effects model with the squared term of each covariate ($X^2_1 / X^2_2 / X^2_3$) and 5) main effects model with all the squared terms ($\beta_0+\beta_1X_1+\beta_2X_2+\beta_3X_3+\beta_4X^2_1+\beta_5X^2_2+\beta_6X^2_3$). -For each model $l$ the mean squared error of the model parameters $MSE_l(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ} \sum_{i=1}^M \sum_{j=1}^J (\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$ are calculated for the $M=100$ simulations across the sample sizes $k=(600,\ldots,1500)$ and the initial sample size is $r1=300$. +For each model $l$ the mean squared error of the model parameters $MSE_l(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ} \sum_{i=1}^M \sum_{j=1}^J (\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$ are calculated for the $M=250$ simulations across the sample sizes $k=(800,\ldots,2000)$ and the initial sample size is $r1=400$. Here, for the $l$-th model $\tilde{\beta}_k$ is the estimated model parameters from the sample of size $k$ and $\hat{\beta}$ is the estimated model parameters from the full big data, while $j$ is index of the model parameter. ```{r Define the methods} @@ -118,7 +118,7 @@ Below is the code of implementation for this scenario. ```{r Equal apriori probabilities, fig.width=12,fig.height=12,fig.align='center',fig.cap="Mean squared error for all the models with equal apriori in the order a to e for Model 1 to 5 across the subsampling methods under comparison."} All_Covariates<-colnames(Original_Data_ModelRobust)[-1] # A- and L-optimality model robust subsampling for linear regression -NeEDS4BigData::modelRobustLinSub(r1=300,r2=rep_k, +NeEDS4BigData::modelRobustLinSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data_ModelRobust[,1]), X=as.matrix(Original_Data_ModelRobust[,-1]),N=N, Apriori_probs=rep(1/length(All_Models),length(All_Models)), @@ -180,10 +180,10 @@ Method_Colour<-c("#D82632","#A50021","#BBFFBB","#50FF50","#00BB00") Method_Shape_Types<-c(rep(8,2),rep(17,3)) # A- and L-optimality and RLmAMSE model misspecified subsampling for linear regression -NeEDS4BigData::modelMissLinSub(r1=300,r2=rep_k, +NeEDS4BigData::modelMissLinSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), - N=N,Alpha=10,proportion=0.8)->Results + N=N,Alpha=10,proportion=0.5)->Results Final_Beta_modelMiss<-Results$Beta_Estimates Final_AMSE_modelMiss<-Results$AMSE_Estimates diff --git a/vignettes/Logistic_Regression.Rmd b/vignettes/Logistic_Regression.Rmd index 8467bbc..bcf072c 100644 --- a/vignettes/Logistic_Regression.Rmd +++ b/vignettes/Logistic_Regression.Rmd @@ -70,14 +70,14 @@ head(Original_Data) %>% caption = "First few observations of the skin segmentation data.") # Setting the sample sizes -N<-nrow(Original_Data); M<-250; k<-seq(6,18,by=3)*100; rep_k<-rep(k,each=M) +N<-nrow(Original_Data); M<-250; k<-seq(8,20,by=2)*100; rep_k<-rep(k,each=M) ``` ## Model robust or average subsampling The method $A$- and $L$-optimality of model robust or average subsampling [@mahendran2023model] is compared against the $A$- and $L$-optimality subsampling [@ai2021optimal;@yao2021review] method. Here five different models are considered 1) main effects model ($\beta_0+\beta_1X_1+\beta_2X_2+\beta_3X_3$), 2-4) main effects model with the squared term of each covariate ($X^2_1 / X^2_2 / X^2_3$) and 5) main effects model with all the squared terms ($\beta_0+\beta_1X_1+\beta_2X_2+\beta_3X_3+\beta_4X^2_1+\beta_5X^2_2+\beta_6X^2_3$). -For each model $j$ the mean squared error of the model parameters $MSE_l(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ} \sum_{i=1}^M \sum_{j=1}^J (\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$ are calculated for the $M=100$ simulations across the sample sizes $k=(600,\ldots,1500)$ and the initial sample size is $r1=300$. +For each model $j$ the mean squared error of the model parameters $MSE_l(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ} \sum_{i=1}^M \sum_{j=1}^J (\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$ are calculated for the $M=250$ simulations across the sample sizes $k=(800,\ldots,2000)$ and the initial sample size is $r1=400$. Here, for the $l$-th model $\tilde{\beta}_k$ is the estimated model parameters from the sample of size $k$ and $\hat{\beta}$ is the estimated model parameters from the full big data, while $j$ is index of the model parameter. ```{r Define the methods} @@ -117,7 +117,7 @@ Below is the code of implementation for this scenario. ```{r Equal apriori,fig.width=12,fig.height=12,fig.align='center', fig.cap="Mean squared error for all the models with equal apriori in the order a to e for Model 1 to 5 across the subsampling methods under comparison."} All_Covariates<-colnames(Original_Data_ModelRobust)[-1] # A- and L-optimality model robust subsampling for logistic regression -NeEDS4BigData::modelRobustLogSub(r1=300,r2=rep_k, +NeEDS4BigData::modelRobustLogSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data_ModelRobust[,1]), X=as.matrix(Original_Data_ModelRobust[,-1]), N=N,Apriori_probs=rep(1/length(All_Models),length(All_Models)), @@ -180,10 +180,10 @@ Method_Colour<-c("#D82632","#A50021","#BBFFBB","#50FF50","#00BB00") Method_Shape_Types<-c(rep(8,2),rep(17,3)) # A- and L-optimality and RLmAMSE model misspecified subsampling for logistic regression -NeEDS4BigData::modelMissLogSub(r1=300,r2=rep_k, +NeEDS4BigData::modelMissLogSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), - N=N,Alpha=10, proportion = 0.8)->Results + N=N,Alpha=10, proportion = 1)->Results Final_Beta_modelMiss<-Results$Beta_Estimates Final_AMSE_modelMiss<-Results$AMSE_Estimates diff --git a/vignettes/Poisson_Regression.Rmd b/vignettes/Poisson_Regression.Rmd index c387d6c..fd8be42 100644 --- a/vignettes/Poisson_Regression.Rmd +++ b/vignettes/Poisson_Regression.Rmd @@ -68,14 +68,14 @@ head(Original_Data) %>% caption = "First few observations of the bike sharing data.") # Setting the sample sizes -N<-nrow(Original_Data); M<-250; k<-seq(6,18,by=3)*100; rep_k<-rep(k,each=M) +N<-nrow(Original_Data); M<-250; k<-seq(8,20,by=2)*100; rep_k<-rep(k,each=M) ``` ## Model robust or average subsampling The method $A$- and $L$-optimality of model robust or average subsampling [@mahendran2023model] is compared against the $A$- and $L$-optimality subsampling [@ai2021optimal;@yao2021review] method. Here five different models are considered 1) main effects model ($\beta_0+\beta_1X_1+\beta_2X_2+\beta_3X_3$), 2-4) main effects model with the squared term of each covariate ($X^2_1 / X^2_2 / X^2_3$) and 5) main effects model with all the squared terms ($\beta_0+\beta_1X_1+\beta_2X_2+\beta_3X_3+\beta_4X^2_1+\beta_5X^2_2+\beta_6X^2_3$). -For each model $j$ the mean squared error of the model parameters $MSE_l(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ} \sum_{i=1}^M \sum_{j=1}^J (\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$ are calculated for the $M=100$ simulations across the sample sizes $k=(600,\ldots,1500)$ and the initial sample size is $r1=300$. +For each model $j$ the mean squared error of the model parameters $MSE_l(\tilde{\beta}_k,\hat{\beta})=\frac{1}{MJ} \sum_{i=1}^M \sum_{j=1}^J (\tilde{\beta}_{k,j} - \hat{\beta}_j)^2$ are calculated for the $M=250$ simulations across the sample sizes $k=(800,\ldots,2000)$ and the initial sample size is $r1=400$. Here, for the $l$-th model $\tilde{\beta}_k$ is the estimated model parameters from the sample of size $k$ and $\hat{\beta}$ is the estimated model parameters from the full big data, while $j$ is index of the model parameter. ```{r define subsampling methods} @@ -115,7 +115,7 @@ Below is the code of implementation for this scenario. ```{r Equal apriori,fig.width=12,fig.height=12,fig.align='center',fig.cap="Mean squared error for all the models with equal apriori in the order a to e for Model 1 to 5 across the subsampling methods under comparison."} All_Covariates<-colnames(Original_Data_ModelRobust)[-1] # A- and L-optimality model robust subsampling for poisson regression -NeEDS4BigData::modelRobustPoiSub(r1=300,r2=rep_k, +NeEDS4BigData::modelRobustPoiSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data_ModelRobust[,1]), X=as.matrix(Original_Data_ModelRobust[,-1]), N=N,Apriori_probs=rep(1/length(All_Models),length(All_Models)), @@ -178,10 +178,10 @@ Method_Colour<-c("#D82632","#A50021","#BBFFBB","#50FF50","#00BB00") Method_Shape_Types<-c(rep(8,2),rep(17,3)) # A- and L-optimality and RLmAMSE model misspecified subsampling for poisson regression -NeEDS4BigData::modelMissPoiSub(r1=300,r2=rep_k, +NeEDS4BigData::modelMissPoiSub(r1=400,r2=rep_k, Y=as.matrix(Original_Data[,1]), X=as.matrix(Original_Data[,-1]), - N=N,Alpha=10, proportion = 0.8)->Results + N=N,Alpha=10, proportion = 1)->Results Final_Beta_modelMiss<-Results$Beta_Estimates Final_AMSE_modelMiss<-Results$AMSE_Estimates diff --git a/vignettes/additionaldata/Results_Model_based.Rdata b/vignettes/additionaldata/Results_Model_based.Rdata new file mode 100644 index 0000000000000000000000000000000000000000..27eb766c142ead75a6e5b9a981ec3583b8ef65d2 GIT binary patch literal 106387 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�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 literal 0 HcmV?d00001 diff --git a/vignettes/additionaldata/Results_Model_robust.Rdata b/vignettes/additionaldata/Results_Model_robust.Rdata new file mode 100644 index 0000000000000000000000000000000000000000..b4f2f51cc16f43f25477c8d651f626a31125cd54 GIT binary patch literal 109087 zcmeFYc{mi_`#&6tcS({Y*+TZ6WS^-JB0@seNKztX8Ouyk+4r?#Mktj%vSb;RrEFv0 z&0x%oZ49#*v;W?o&-eLV&-dTw|L6R1U)On^`+A-Gocli4b?G4B+qc4P%3-zzXZEzwdnZ&s{gl{t?!%hzm@(2axykPb(!3|%607Q?f+NwaIQC> z{$KU~wCusp#5+43{oiW;!c4+%PF}#&>HJs!VP4^oHZK0hkVEO0tpBQV%o^GeQUA4s zp z4N4s`1s?nV<^P8nc=;cfQ@;KEa$|x*bQ+eJon&#p5Z!Tn5wOsA1RpsA#XOxP}+nc;U<7(75C;eo_io|?l4dXYx zAuZb;=U9fgYFksg_R5Y)_Pk6GpbA-%z7~4;qv0CWJp_QC($)M;93VGk;f^B?lWOEHHQXGli z@Rkyc+mz_Gb^Bt%PQ81862vdqa%;N<8fQpWj8sNL(5kfH9}S-RELTXl06P4M@?whM@?@N*~UOh?Q`Cnu?erhmTC?>bv z^c6xEK6+~Q+XS`2dm3p-Pko6`H;tZ3F#q!ZvHetb27QsY>6V+ff*;)SATxPWwYX{?+la4+!(L zA}v}QrG-Xc=#2zURzbex$o(n0k{>DBC=F#>Jp`3&vgUed)MjHe^m5_$opJ=vpn9eZ z{0D%RIhnN{>ldh)cQB#a`VE}X26PfbRVkiFG~X}D`r<9xwB%ww>^VfQfmcQ~EEAgM z?dO38A>q8*r{-Cw zV4qCFb`FGk#nKT20SG0aOzK?XcEEw>K?pL-X-XJa#B^~=(KOKbMlq}hJWRt&2VaZz zT2u~TCpNpQZF-eH3V5eF{$l&qf$V{O=H=P#k`eKgL9;%#js^|8Y_%vH4vrlIZ=G3L z3~M2v5h}zH59{_-72kH#{3qe>SS_jBzZa(mdx`?n13nS>%Gd0D`V~ge>A=xmy(N@x z?3?U!h$`DI8S^iZJuWtL_HXZ&=!d|cDysivX*Y572MLGf3|gA&?%z;YBU2_+e83Dl zcBRt$K=D&3(!WHM@dT7Z9#);AKD@Mv4~n``a7nB0&HkU_N{h}x(EI%ZZY>tWe8M^; zMQF44`>AI12>Wkazd@B!7;r@Ejv{i>2c)_+(%k)**lF7cPjcJ+ppd!ki!NLFhnl#Q78JtXv#$Zx*|4vftn=lW z4GH;O`(yWjN}?mQ-0gnKMPP_1#S47By`i;+y2kvA>H`&sms@tL)wQ;xRX@+dSbLHC zS`*>taZ9x&I9gTw#(+(~I%HITLHR%thQ8=STjO?+yKCY6p<5QLGN|gMZvUwFX4>n| z^{)GQhruF))x!gc@VNE7qq69`+QCOK7Zh%D&VUA=-n0Z+_&_E)#FA29m$*2qOsje4 z-s*nR-8;L^VVB}wrY>8$0^V-l{hT)e2NFYq(2C9-y%w{< zqZkx?q^eV3_9szT@h=rCOL@M1!}vfue><|2BCMatVer=t6?7OtRa$DxJaUY+1;vw| z&<=6UPG4=|mxQmmM67`>vlOV9sE_ajLhG}xXjU{}eEL+e+fUNn1*83LnnFhNcM)2P z4*Sb8EiTtHXf%wvyzaD4Q^XHm_3b}C1DWLgl)tx>&Dt`?cVXIY>aG}-5Yx6j-f<(| z*Q>TeD=U+!t<@&_T~dRjh_APz)?6%!pm2$RQOObFc|g(wD$a;_FLyiOu>v(MKg6TT zaj4C%GxMYL7nLO-sum5%17(F;<9j1iYa_%ke4>qPJ%)aS`FTubd-p?yaL7&5{?G!W z!J{*)F}dMU7g$r$J&^~eVZg$DLm8J= zdCGuJw{)w7fBXsR-z@#C+Z;3h39lMRz{tV61kj4S0@AB55+ytD<{mACph4BP?{M#l z+R7^7);qa+sqVEmm{TYX)L^uEw!B4Oax7YuO*-sLU``hK#m)G zx2iO;%N6jRE8x3ca|v{a$0vy8oIUFMCXOl@SEp*D^J&Q|wk1k_Hpwy1Z)#FC2mF4o zif8d7);F>7AO z4=d6yV>`{r5!*=;Y`0%8o0DwunC{y7Wj%X1wjxgsS$@xP@9*fWPDAy^zxwtojG3icB@>Jj-_PciB%2M_!XJ z4twWRuKEw&;;-x)mYXtuDBk!`jixAB9yj7f%ozT(WLr}qYn=jAqn^Bk+SYyKV$%d7 zqiOD*Wi+)J#d}R&8t*WXtdye695_07D{ET*>6UF=zO^y0+@{N*9ew^jS0IT}DI8?o zO0%KgIE#-2SQx){{|qO98lhpKC9xl1;GjqgpmWqZ`?mT(e8s}`G#1tJ4dvUAn+E7Y znDca0GEhNCdiPqqbHNox$Kes0UYnFlHSpYQIPl9?w;L>rCI@e4S@B!oUE%5FsBBF< zH*K)J?vCfWsiU(7Ot;#<>$B)8EvbnwyDs+90k9z2xiESnH)b@G%hT|0A@hldD6^Ii#gc1IBL>FLR+S-gHQvo&)@qPXXPN^*J#U>yV~AU=7rj zjgP)SYcZ9p!?Zoh(Mpa%bGert zjb7rnzP+P3`?&^dLFsFE9S}-p6URQ~qsB81{S+znhURf<*Gw1BZs72@$haInO3iaQ z@2juo5EWCpMm&@=_3fF>R)=Z_a)n`{sD{n}u|VBAr>|^RJ`0t;3WxeLS!tm;gJYd% zS6red(5=5R2SaxdvIU}|LkYP36=lcJQvP@qzJUHCQIQW=JRT?0?krZ0+l?p=!k#y9 zdu{$DO4eJ$9^05U#!Ly1upQ@HQx6nJ@AB?mxY^P4Qo~{NeazZ3E;UEmTn0t^a}8UCabWpdv6JM*@90M3r_SGtu6; zu{g3$!cRisMs7%f;--wu2C!ffOP1SpllxIvxEm5w|D@5F%J9`i8jE!7(Q4D?n6L)i0s&D=qrj!?mzs|t6-MiB3 z;T{pK6;rbZ+@XaUG%(%K{#7yt58C~DSHheY8F%VyWE&z(9O>lT@%&-ebpw21eO25Z zXl<#nhVTow_jtOy(k#slRf^c3Hl;CLCDmv2e`r#+_mPeFGN|Ux^^cVT{=}lUtdR9C zg7XNXmH3*DQ@H}-)-?a2iF;QPZtSrQlEbr8p1UMEJMKiAps@Ab zXMmf4$$%;vKFzfL(_We#l+ISW&SNiv1C#ND_b3!sY#F6zL z&d-YW{~6{C9RNQsc!k{hAt+m3?>d@AZtcj2SawYhpzl zV%~-h8Y*T=6L`K(M#J{}$VV31 z4d6QUWc5u z>o{&&*4p>?pqX*Q+*U=gJGFwTpf{#o`b`GqD3eG>IFBJin5!>7`$w4)QH~!<2cD*= zItCJ63T)dyc7Uu2Zy65Zvd(D=I-n+mYc!>;X~&Z`aGPhg3`^`xg(Z@UsAmw;RZ9h^ zsi@D27^g&Q!BtQzz9l0$X)8`&btTY5GxbhLlr!&caQJZpw9?L3J4|@-)?j(q3Z+jC zu9rjp0&A#_A)eY_c(B#+_ExtI-=9_iDxd81E^f7GtIVsC@8kGxkp7@WS6NA{$H_5W ztDU0DtatUdj2&QenN7S?trWS%rd_KO&!o{GFYIR+jHVMiq8w0eV!n?;3i)~+P%osW z&`~L2-II?rnJ?zN1lMxGK`tReG{wFN)babiv68NU+Uq+AgRSFitM))qS#gKp5*}s| zV3=|%=9)3NDt*{&Z>YJSm1_0LPxjGfN>15F{wNu{3E1zHc6~S0suZR4of)&z%5<8i z%!Pj7yf4!9h5Xu7|UfY}^4VO|T2RH1Qk>sqM1-&W7juN^reS(l^*DMN8 zCQ`37ER`Ve6Uu3iTrzO+n@5?aG;{Sj&5dy9Xu{BO=&H34h4LVN`tn+y_|#+($>JeH zoL<@!-fkQ6q#Um~Bc6E?VhJ7ax4nG6{*oL0tvlkNSu_i^yj1VZ)Gq@%KeT(}S&$H# z?PB=3hq!9A;ez>EY*Ut$X$h(B+`K_E&*UjsOX|I7>Ax|%Zd7Tce1WL)`(^S#YKoJl zllKZ}p=;qq^yfiMzxedC_#n+HN&P^2M6Jl}?-lw(T_P!yj7c^xWJ1?H2O5!341h-7 z=)CT6C+4UHcerR%_dv`-Jm@UD+CyJ%D;)eK`h5e^S`6>#mPo3$a{iQn8KRlg>O8r$ zIg)7Anx@3}=1XJemRjg_wZ++BW4ak+hHGw;F^u!-qNc6iM&3t09(!$HX6emx5F`Sx zOOP{0R+GHS<>)pLpI^#8LyxzH#x5VjGG7AeM(-KitwxHs!8#O(*WZ}-jU!_a=bu$n z<^zL4Sda}j__+L!*bf}CrN+{+ZWo@ES$LD_s4^L03M>Q%Od@Ki*^`VbgM86TT_Ah)cD`s<%Uyv(Hk<0&P-D$zP*MKjQCYpn7 z@iH(Ks`T3rIgjeo?@4W=?tJrb>I^nHf9xK;Pi0Hj+d9^wyOQtZMQ>zCS-Q(9vXy9- zxkn{G!U3{pxbXdnHLKeDT2{>iEy{9z8I-)d9);`HDAh27KlrA^2>=X9*H(CYlamMD zOa>o>68+=LN<2iE*`e*P3~aoW%01mY8)2l406nz)6aSkWI^ZMpgmp_e;ryS!=Fg;T zioWJ~hiH%o)v)0SVY?5T&Gwya@>Q*akHXd@cI8sx(U6bPv1&Uil&^A}CeLh_CDzfn zn`W}tRK@5$brZ5sctJV#Ho`%A3+83neu24MVx_J3j$R$@{qgVx$^DBl!hY~fm)tdD zBKS_Dj|vUe;b?yWj1p14b@(dgqjHu*eI+G^fY8#{0|fn+}}gxgK<=8DtOnr-(j4Yi`bmEJS%8@R?6^3a+rh3=f! z;_Ta*Yx{yOXj^;1fslA?hObK=Xuv^OTs#$%R-jFw>{^+@kzYGX2E-S$Iq9mQW`ch< zqnKKJWXLbJ>yh}!7Qeg!zr7vY{xzDF`Y_h}jw9lu zau7;3yapYUR5uQHCb`1bG|`u%oKNokS(2L4PX)71ly{9&8>BXq?8}!w2YS@!DU@?4 zYx_~=bfm!jhQ(b~aMjsBqkZOQLpeck zv-qq)rI-UeMOxxBbF26_8M4dpG&P5*sjqOT|r z@>j6G;^x}}k%Nm~Z%FE6Qi*R}dO~~>Q2XY*GEuifPM7^N74qz*X=2i~V!k){=uG{w zQaf;g$DH0=acby;)3sa>0Xn|FO>3{%+?XHQ$m|a-|D}>{naK5RNjeE5YscF)AHsV| z=X?O~ZiP1Rr0vchpnDSW>DFmW9$L$KREP~w`t0cac2g=P6?ndtH@sF$LqKHDLvuoN zgENo3Skkw(fWt<;>fB84PBO^`zB*(1=a=0bDbwT#I>0oC#4 zN#PNfmH-c||7m>5M#!FZOBLzpUerA9A699p$BT#dr}|$6FADE#bwJKG&mUwSudL4t z$uitBUR;B^JZMRWW@tDbdTA2r^_`Z@{FS%8pkN} zxbT+8KeX=4e}YL1odem(V<3;p;lnL^)Gwp<(U1wZLh8GRf&Eh*or?W_IKYi;ePggn zAwGKK;L@YpoM=EmvFB=6`FtuMo4{l%(%|UVXLHKKOzxfr+J%wO~uzwfbVIO1*J?zk1YoJf1rYM4uIj%x3@Z|Tmnh$d8W z_Lo6Nm+t$m?29Qjtu*TNn*V#@!fRcg+MFPphz5a`>_$&Wh$hx-6oa^X|XMo>;XLyJ#X7HJ&Ibh+lS+_ex? z0X?g{QYZ5y!6gcLtj-;0*;S#`T3c~})vlXDuJ`IOEy5?vZu>r}H!~Qbq$k)IKRr4+ zPs^breN8$Bx@aeskiw+dc&uFSbUZ;lU687Zl<5&xRA?}*+8Dqa*Vs#kai8BdJsKTO zzPhqhK@QlT)NQ8np_k$ViWT>u6OR{Qsk99#WZJ%K(=iqru!fcPskB9>36!^N9-3NK zKBkL(CN7Jk?@X6K_&zv_B}P{7thJkCexLE55|lc2$FSub=Btjh8yxtWD0OIjEN5%t z@rJ`R+NjFND-H7=knf~Pcjt^gVRj!6 zS+^^nF8)37eB;F2>`V|(d?_*HLwspnBe1zhp$Yu`IObPYS*H``+~KrxtMD31S??`H zJZ#*)6iNcPF5)!Ek5%F3CC#%&*SxC&J4LthC$5@m+BYtxQ|~W0POG5?&$ z5Ko%?2?%79RQ8V&{D-qFufb^60AMkWZ2>IyW?2~li$bGK{=qjsa-Jv(?aDB4KYWyo zUdbfAp*aaoz0YdB#wjj|dl@kjoqTrfDVct0&7W*8h`ABEIBr)#C=t9-TH+cUEs6tH zc$t-<8V;HjhJa^q%D9l%gw4-}vi9XKH_oy0(pYY__2zifeZ=0#X>!_q0ghC!(j(J_z{_Hg5H%gOjVw~?YRB<) z&Y>_~Z@B9g@Zl<<+2Y2HLzcsXDJ<`%P}HL+(76NUitwED$(r+r_b;bxr`*40bp#Wg zsawOcWw{SF2#SN*@yX!2k1+T-tzcC5_-OX+{3zX~qp({Y^9C??`0ZEV?M3xQGAGl`mOOTMPzayzb?VG{fjU;kmu7{`ioCj!=(!ID7(bTseWK+RLHMsUN? z{*ROtIfDUL*mp%v!_y7TCs_g;_S?ox#>MS|uIn!vm$gT0rSFshYY-?odW1RLZ85~G zv)0pn0+!=97QC%aas&V3!-;PnQ!%J=vlI~u_^eh{s@4Kox!b!K(|Hn~v~o;5hw|KI z%e^3--6&O^5uOwAh!?6`Gb`^^-esrey^{!fg#Vlz8uWB8XAYH4tZ*1b)jf+Pem`mO{Yk(|hE%bB zFoAk-RLbg?;o#GL0mw?D5;)ty6@#tS9y=Om> zp*`am(u*duRrsPTQne$46?fD?^9^y)BQ!XC@v_xX6Ij~*YD>7`+E$ApFHWP?EaG3j zTB%@L+A`h^K2eGfc^!(53{b**dS``~FUH7~{9ZaYv&O_1UXf<4U4iiQXDl|~eM8n4 z!6~<{a4}ptCvico5iRMAodE+lr7iRXYvT8gSOa6q-k>N_ItxBw^T0LfM@U;@WTZ6iW$0{t%s*I2l(**LtZDySa@+4{=q8|?r{9cPP@#P)c7tUO zc@EPTrt&NYK(0d~rF(ESy8)UPrIwQ_>lJ4TZ^Kn7nTN@t%kg#q=9bhH57Ttrm{R7| zsU^3y+akppTVBl++#@RwlXeqJHjAh`HbGI_9xGoY&+9KU?%dX>JR2F)?EWTnA^z6D z*_AEle8Jr;#>?H%CBBZVDHXodRBihod@ zmA=9yAQQfN^~eut5n^FtHl_lsM-Z6u+LSR3FR&t{Y*J4_mcH0uV607U_E>!Qm-gMs z;SS{FwDF|iF^iRdVof;Y%!V7WvGq;AjOG~aIxIKG#7GJ<%lsmT{N4$y0TYiIFkR+Z znkxu{*z7M&#y(NqGF^{&!-R}`cMbf2+>gDLY*Q*Ui=4f8-;`h)KEu;L8}pZk`7Xvn=crl@M*?2$>SOg?r_0Tih#!}ts?ZuIqSx@;qq%DDh_BtPspI_IY+Ea*fqGOr?HGOv>cKseBJls4&Sslb4y8N7%)cT7G6h#)rR)Vi~dAKTn||} zJ?Y%z=d?kX;-w2aWQ10>3D>XD0g7g&Oh9_i#T6gBGeHE9y-DTlByC zT!O^xQ6Dd(W3|6xHlvZEY@-|BD@vXl(s0PW7@R?6tH?9vm2`Vc#B_7)Vp=N-W9M<1svtppTOqbr~MEyW^CHV z>t&15&o+u$X9nXaqTM1n2^S4BUwIfYY=h`kNq>Uy=dI1wyQv5uLDAPL<{#=IDo$yLf7SR{2X}b>E`zEmeMtE`jR48Q$>?GzI z^pcd0QxHuzL%b($cq5*I+4Lizh)94!#} zJ?9Fgy=PCi46f&?eK)sew*`kyU+k|sjfpa9 z5PANSFVgs*X`HV~d?g|a6U163hze?4Ld^*Dpo~KSBv46ud=GAKOKfVEmyv*&&7!`* z(V|oV1Gnbw0@a_4eI$(&0AK39O;JU+q4rPVX+5+2Q0~^)%iV42Cr-Jh9q@V2C4vQ@ zZPoj~?9Y<11`8sWTh4)x(iVNZ1-qB{aQKyrB4n36ia*+V_I?Q;?AcEcAi7a+O~NEb zcBWwEOO9dBq~_S}iu^ZM%fzQ^p~w@+D^mNXBJF?02%D%1haOk)OvS-g*gVwSyFE0m zIsDmC&7VArUwI_CwSb9P_HR%>%kguHiGp4~*<$3X;FBB9jL=j6>|WmGV%_{jKfA*$ zE2iI57KWisB-9vZ8J5p%+;=pu4FP>6Pe8S}!Mq|vD{(?Wt1nra8%@U8`+MD&BNkZ4 z;E55uI^B{Qs}iTln_!hke(X}$v4Z*ycrs6{mY3Y+0GZuYZ3hFY`A&D_Th}Y9KZK++ zDcl-auVF&k*DS9R0u4@;n4Ur_ul*7Y7_&ho9l_zga92oFIzY^ilhoGc66Jd)t&3h5 ze=6n?^z8p399j#}Tc44%ah3~4 z2(zGd-6Pxd4&R58Ev2@v^_GOV&dO;#WxggJ*17epT0VW@B;eryX*NE1pPcv6WxmdG zqbk`l<>@s`WRd?B@Rz8R^ran z<;|p@FK>wSFvX+0PsKYhB#DEuw{Anpd&YZ-scL)UQR&-b^--6uiHL)H)E;ZZ>j=MzvV*CB{LlJ%p0^sEw4dXn#XiQr7% z*kxh*`%*`4kVBPAnJT?d-*;WMs$VqABBwM!pMC9{(uCJIy^r9LIczDZX5ns!(UijHI)LGv6BQu(#Ypi@7 z;cHey$PrJ~M#$l8+_**Uh_9EHa`jf;lcNOJvGWx`*@{BoRoX&JUr+ldmmc8uq}rIO z=JXiybV-q%oTPm@c%Q8_1zSj@=!eDei;kgD-?>Z;^-{=12~$xMCk(8m7-s9YKQ{H~ zol{YQ6~AVumXK_u!gR5o+>+=c!^4D(Qq#oW#KbY!*E+(6q zmR!J;BT$5+CimAW7L)l)$2sHt(rB=vQRi=wd}?j*aaviD=WY1sYPCT{*71byy)~*# zM%z^!;1C;8682fB>hN({+;t0=d`(Z#@vv1n>d)PE>W~BQtKB&Yf9^vw&Xl}@5{#)Q z%oK(#9eG3U1!*lX$71H3^`8hDqJR6Z=*K3;Yy6n~YP2!?M}YT2x&sf4UBtCAX>H2S zG0NCV2pgfwB{+Va|LpShm(lrJvG@EP3YIQh0uTWn*zz0I?AdT}UKVzGuC;>a&G0eU z?D+99G=Y9L?swR88Bv`x@ah|Uf7b++*@}pb*F_nN)vvYy4h$N49HVNV)Me^+YOT=u8AY{8p-)Hd$}YT)K<(wQKt zMIap_lZrP+T`9uw=EEN;w=f=vHp=G4bd@BxVQGq0)*YhYG|WQNGS2Y}b*;>-lJuDn zszmxX`(+bveQZ5T7&p=>Z`1AmDTq)T6yl>MT>S%i&)4c+Nx**LC04Tfdo!andOw%4IQmZ5at#4m)Ib6eIYu!rsK zZ^5We^_B|tgYbO-(M^kkG*w@S*U4a`mNqTp7YwA^`*B*`jjs_Y)qQyHM>gHUz8wqc zh+CC5Pllat8XZJ_CQO=1sxQ48|p;91QE`8oZ#LfKD+^JH4fB^gD7U==WM*XooHg+&Az{N}&YVf3UpPmVxStUTzmPE4j)+JI#CV zzyGWlD2+!No;hh7?uX1&xh1s9$ z2K~ykHAn4{(7cvZ0*@lf57M>wfYlTk6tZx?yR|ef3B&{Y?q+Z7ZUC6ThIcD)R=V>$ zOYopCzvI3m?uB-K%2@BTx>Dg0c8)|;aM2q55|Qp5)_SuM+)rs2nyn?DBP)V{s3g07 zgcyfRK*tossoV|XBe?wlWcYi1T8~P1AVM;97>JaV_^k?Ur0 zz$;a$+c)YIaF7GrgMhkl^gdQPzJwO?jquC_V?c_Zjrv*wHew0nE>={JO}QKh!fp>Dhry#6ep0PFm$06(t*>eSgzbiT z#wq^pbTZ6L-|kSZRSKvxYnR2Y4j1?WzU^!eFBYgGOuozqruzjyfXu+xVraqtpiA>c zsYy-fIcY=e@Zw=zn#krotmY8dieczBoRl4($;u&>(Da)K;Y{qou9@*#=w9#<5(c}o zVnqB=)za2A?3X=}OH@`Kb}HH&h*12PynVOdY4D@Dh_I@8?>|_xKWhGf#Ir)PDf#A& z-9uze-M1tqe;=;UHdBU{D6j8tNRSes`KF7OF~S zF_n-my$ly@baxbNB9V5}X;jPG{pN*P%J6*;MMwYhoU?*h{LQC-S$deGq?U*I&tNw} zL-c$b%ib8PfI19gO8LHwdE)EdO$q9kK@S(55FLW^O-Lx(YHG#IFcbMP2-<- z+s4&-?*}mfLIlnBZr1Pt*7_SDR+J>vWwX*b?Di83j(UYY=+d5@ zURoR$q}!F~Ya?O}nKAX61H@y)71{11ajyt1x`NvseoK7e6*s;~x&?*ohV8-$djVdY zJpf4;7nn*)lR}68WLz7rD4GpXz~5T$j0R@Xj7c7rIna@P*mi+M{Oe(TH&8mRlxW+H z^DgWqxur;vRthlM_Ez(D*a${<%J!&!D7fic(i+j;17&krT`8&r43X|*vx9p>Z=cZ; zdcIl7Sa-kPffCdOF15ayT@U#kSKvP$hw8Sap4fAzpPdjIhB@B*MRJ&z!3r>D(!fPt z4*+dC1gpXjY#d!R1i<=JM7Vm{7nm>L3*87I)%4+40G!n(L9HhuXogV+TDi-V zg)ovEr3UuK>AEQo>(f2~XK^);uwA1U2EjuMKS9}7-Y}3IDCKpR`(A&WOC?}#pg6$L zg`PNVw{3&&Z(fbwNY~G4_)zu(0j#0+h-Xj~kXovLe@W3B@=&T*&2ZuGy5F%`)8Q@h&H503^QN{E+4G+E5%iRvWcM`_;%`V*2 z?tQ$MM3R5+NSxH)cO{k#$+lqsu2V7)@dNLLf3PEJ#r+h$C}Yy>+2XY>!0Zy6SQGM> z8QHGdM@xsm1LBVicqh~XHd}{bd2m!xb9<*N?5Gyv-&Z|?1D3GvEkBM5dS(sbT;Qo1{vYpn=?F_SADC4AWCXis#hmfV&8;yuLmU0I!R`dmINr~ zE>Ivc>2E`Kwb)QnGO1u86i#o5;KSD=lj%{`CIelB-x0b|!Y~qYc?H1ePDRVN7O1l( zR-zFiI0gvy4iQT@({6|DeBd>c`X%kQw}zzZUuQ}g^% zq=u>n@M8%SL3-90o7FwQM&p+P=NX3$+|f@7=B!pzh}$|656! zNBHX-NW%rA%?-usR8g(_oh~g&Y|;3UV_2Y%*H>;!Xi+$9&*R?NzZ6-{agu`QbIcED zM-s#9=ez5J5o=#n^C64B7BD3DN+f(!l#pgiWsu70WP zU&Hwo@wE&{IyeVd0k~n(O!(_iMcRTvGy%E;QkXE?Q3%O?NXr*LzTqNpU^5?rMW{a= z2%n=Cv{$-+>+*+zI8M34r0Z@p?!s*%(;@8NuOikUd5Uq>Z6tJiH_BVzC-B=z7XS3a zczFc%qvwWY;1S#`RUK3V8;QH~F`x}qcu>(DMtOAT4R}GbwV8~DYD}*f?sh~2>ENGN zcN7`*cQQdDHklJh>ZHijBKR~5-V@QjBgfKw+Z%c>SL_-i#7Tts z{n(GP?TK?Q>lh>94?UM}ZPc><#81oCb;?tGLDkV42({T}Zg04> z4mEcqBdC;tHa4rc=*W*>Ss)8lXeirR%|~iD)xp{AfqVvkOC_ zd&rLy%nO66lYU=tc{Wo^8#rXH4_brHlZ*_5c`>&8Jmu>!Gg18$VF zOy_dO(iQHBNMG+VLQ(V1|7BL5S%VMdB>PB7rhrj@TGK({mlTY@f!lNf$G@GP3IHfR zMRZD>F{NVJ-W1uClu1|3KBmr@_v>dK+2?=(Z%2u>V)^e!s129A_DmnAH2BVN-uBT; z=F^=bE>kK?AA)A_&8-bQLvnUb;G61r4;96(Z~EJ_CFM&Uz7w#J-}VJU;Tn47#E2!` zl>DRv3KtYrdotZIDPAOzE8At%m8)y8;O$sN97&(XVy$KopRpxNh>yEl%a>eqcsDMN zCWhY2YyNkkD%E#6Ba?6P6~k>oa3R)l(_5zdvJ3pNf&dI(VE+3vwjG|aIrh&lMMowM}v{&0sJ;4D>> zw=-)HQl7!cu+GHoy!Zf$tfF^Bpi)q4c#bWSWv;T}@q zI@8$DNJsAFs zwlh!}&YMlhkirn(N_WVPWPvO3NA3=Wn1g5}L$xeFHaWG{B&jeU4OW!7*XfpH`pUJZ zEuZk#zI~RE+)C?o0hgfbd|S`rpW{f^EkKg26m;9yHvJTE3SoRucpy6xXa}a;_k~Bp zT%~?f8p|`OQX=~z=GIv2TB~2-wN?|ldX+-%cGm%S9MUG&;t)EnRP!@KG{C1`gZ&>W z#!_)-qzi=^`^e5!Pca&f2>5otLUreIC(G)`sKYCICP^IMJ_D?im;6x_b7wmIr+zNz z*LIQhH;)B*QKg8z(_2s8lrK{fmh8oEtWaM-;^N?Ue^ra(@hmIaaSzlb$GeVTJrrMl zv_T2Ry%=`Ow>n>A%hSst1gW&9;ojmmc5|Z^-i!P7hSuc9>4O;*Qza;;U}9P4Bwzxk zn5@t2m7{|oY#u6s$|vBW*=Xtl;@r&uiU$wFL1|<;B+ng=$*FFYjKn>hAh-g08xZ0`S8(KH#`$W&gomoOCPyQ&@fzN}v3W${HIkd; zY$7qq1YV?gPD|q}GtjQu8pzB_EQq*Z|aI!ac+!1vp0km=M56d`X1uhS*nQ<=I$e4dU|mU<8~-X)Aic`dBa87$vsy$Pt({_ zo$g4z5G+g1fBIJc&irR*!!ese@)hAh8z0tLWkFl{_{Ximaw<|5$VCV)C1Q;T80=AZ zEPA0Bn_zDUdVJ#cw#jC$bxqV^KT%!v3(f#BKWKNe2Jz%pSI!nWp!Y5v$Igh9&2RiIojQ`<@6Kd zeK6_&hoW{pAa*H_Zf5>@iRU`H@!*0{~Vk(bw zaA~L+yuavY)jaB3(r40FFsFN7Kkhgw31tHIP zr~%G@Sf;$Hooj7Vo9%gjGKFZq3U^dy0wWjzk3ry%Q#w0x-hVlRL$981#iNVk3muJ% zxoARFD>E!r5=a~L^WhOR>AZKJ@#v6u zCwwxFWSiKHG)#eCa&m>a%)2;WfNG}E6tZ#Ge=5+y7SEs9wur#hPu|{mc%$Biae4=J z^@arPj+#B#G_Lrc+S2tybG8#mpF>XlOwETiv}XVG2X_DPL?zZWU;^#|HZ^L_7Td=C zX;Gi2z`nQoNMPZ=s$lWeUP=$@zhm4xjaexBRf5G@@S6e?aK7Hd4Ef{+iy~{hWOpQ; zWv!WoH^2Y7=*E`*e&EIWeN}dYu}qn`{)i6c%vdjT1+_Q@@L+j`_Ea ziax&;tJ~)|)?kZ^7aCrwGm7(qnVqB(+Zq@W!Ck9rQtEDsh)MWS8fsgCu~tG#rh?Mp*lndrv^z70bNL2{!Pzi z;q-~FCW6+?jJ<4qd|f);JO%pg0LY^{|06$4fD4^UCjX1a2bd0JbCTY^5ggZ^=pXu? z>9TN$`#Y#lOl>L?O7vjk3J?-UC;F#$!p#fUxd*vLr!ZkDcLooAw>$D2c;jNCUWdc7 z+v8A%1YEf`(_A_&3i2gil;8?xr3$U3m#dxUiwHe^rZl3mq`|MVnYgxgR{Wvp$lR{R z9Tn*(AaA|NqEjj^=65=vCcT+oTqbDeSk@Z&q~9HR7Or-PP302mtl3M_Irg(>Q9+k6 zrw5Q%ATKduXuFuSbk@w7BF&F<* zVX_%4AkY1HDBx|c-cue47GS&zz)+y_+)=uwH6u^_xCA${XVVt{tz3Oz`@6EQ53Cf% zHW_a(hp$|wS?1L~Wht@su4XKScS5rze2UQlr^DZ#lNog3Y6NzG`CacuTjfHlg6~H$ z&IvtHe<=_iTD!w5X}Ln#&+z~09uaJ3i<-Du)BgGh`P?y&#`nN$D3`zYOD#hqCto0E zJq@}^q-0l)4XT2}wCTeA`M`*BmP|hT^R*{cf;}|}ppIpw$AvOfmz8ZG1&6|4ne{1s z+g8;)xg-Z00IWep7k9B7yEQSdLEKs`RP;Xh&0+GO*}9ctiOf%VLALhJIeji#omfaJKy?z~ELh zLf?8cnfufzQ>_3{wC>3eFd4L7GwOQ+REVrHKqLMGekOfuAUzmE@%nRVE_e7ff>Ie2ma`IL5W8v4*Cj@{%!elh|HZHCkp;Jl zFQe^>>{x=KTf0tAo7o2I!R(WLp9)bs8HDZx((jf|rKIy_!UYhvvbd3kP1!|Q0dal7!pVyb`vp&*9;-HF-sfU^?q_*{%)MPYk#42J8-9#zPy zvUm^wkrM!{p1H=`2b-k2<=^7QIKM!-oZbj9V_!jj1HbM%{nbPln+HhAe_JTw;Y>zq#(VRR4b1W_{Ox zDs+jdmAqWxhtyVBvu-)^xKNI6pPoCRgURuB$Tcu(2TRM)2^Lyc*v0)10qBVTnB|XbrHt~iOci|V5Ud;r&aTCgu zGa%uok>9Xysq1T><8$LL&s1M7V>DfW!i3(AT-J2LOpu%LS+Uvc(*4GauA2(q%_W#V z@&wrsw_6@f8*;1`Z8VDd=Fph>;%-1!d%ep!>-8wcNZ}*%f0_pFiQ8FKrPpBz6ko8W z?9T*!N#>hBb($Mtku-LJy^p2@q4QtE!M#~P^zJ9>Mo~--)dG>hbbe3udTpP;(+<)% z=bO}_q)6a4pxZPq*N^53wiKYcATrrkoGKTtmMy%bk(itHfv+3Ln6|8DR6190)o&S zkh9ts;1zHqFVu?a(*9h4CwtvPJ3wcB@}T!JM`|aF;30?BerAi0CqSrYo77(oSDx{! zKI;!YAX)K&&SAhAipr!pvo;$=+ps+;L;hpqYym%BFm8ih!* zgr}1pDdhW<5Va{|;&8wK`5$yq$~Qi-2uwJ7BqDyhpxNi>-CF{|w{TzaWvloSWFMs3 zPL!oQ?bB>>K)NJ?={8f7*BRpHX!HHZ^vOtO(oFxudG51X2L5Ao8=0e=fT*n!U(C7C z&t%9Sf|^c0{!b3_&T;nOGItX2-dND5BuPQ+ha;*!1UE|ld~zz2bZ6IY($%RUZ!Ol? z!Y8(jDqH@OXq~{XIT9jgR`|I+;O&|!(C!Bi`OdE}^rh-T`MK8J!=v*8;cxSxN%!;K zNm!Zwbm24}O}CZ?|Mc0AMEoouE9?D<4kcO_aNbqKG_Fa*J+F<5AyAiW@~-A^8UXf? z>Ik?!=H#Ot8I?yR@{^PfeCH!s-aa%|=t_nP<=25E>AP>1DJ?&_ZL8xCc~)iq@O=wk zQd@F)fJc$Y%lIQJnJ_ihE72QPOJs0b3CAh|c{%#ZOO)9qE}%P%d6^Zwg4RQO{hXw! zt=^u9sl_q^Mk;>^GA7Yu*Ujx?DM1ILcznrF{nxwe7~^ikBTdPJ z+wFL>xT;$1hI&T+6Neh0_N>t8J2UJHe3XlSE=G=j(L%-wS)NArk?jweJ;7b zx@XHg6+b*sZg*??&Gu&F@rIK-d1i%`R6*96%~^ZT!1IiyBzGgif#X6lWxZSOe?2Fu z^Yj`kS4%eapEx^^f!TyFO^L0EBP4DRlccB6Jl&4WB!8#W*>NgFP9{D~>2E$k{jOJvs>C3E0&^z@%FE&MMT(xY+XS@U4- zXOa5yiK7*wLH8EfFUtd@;Ge}Xcu0JokdPaKGWjvGE{ln>_#!K_UCA;L+QB%UUIJCe6WY|;a3 zNON6*WTU13NZ&wx1W zNrQKJbXbDMqi_nS)R5WPQ2==WIewNpisT%IuNA`=4G>C1ByYIqMKL@OoS{x^DFzv5 zu%9kh!ovj^ecc!E73EdvphIk1K1#bQ5e|Y=9`i>$*Rqu&x7VgfG^kk=Q#e%Y-aoZ* zr@e}l*=rn;H&s0n@6kqQR_%b_@@0BoGW$Y1%=tGiE&Sl$SBRqiib4uj7Jr-m@>hU{ z&w0N?Lcnh|YuB}`qF`pt!W<*X_qwAoIT3MsQ!~F3aN2uG@~bbk`?;^On@+M-DXfC# z$1*a0@QT-7`*t%-?taA#E%_U;PMwE5D@`z#&G;eu%M03=6jqt%-lO+niOSAW$`G#q z1%W!tQY)JJn)EXy8Vj5=CLk*qg=bacL%R}_o~!jT+@}}k6S;VK(5dY!Wy34@r?UV@ zkC@|#-h22zkkx*Qu!B`2Cg`$rkrQ8ez)NT1EKyd4E3@UL%xhUfHmNQ*FKy>-sqY$1 zx)%kWqPJ^74lQ`pbBxJ(BoXdoT7YkV<+^bSc>^1WqnYat%BB8$b)IYgCT^=&Vg=Fr z#r%u2rz62>g$+Nu)fm;_X50`(Z4@cDvcW|FKW`4}a1Ja-k`%$Y5NC;~AlN+o?74fvLHz)WSug>J-oP=V0 z;epPTk408G{U|hh0i0v`^_za8fz>&p&1#7Jxuz8x#j%1R(NL$^nMimhn|6Gz@_ufx zlaBuhKqkTLMYJW^cdN43lQVB z>@%yuQzwW%skraVaWxCi`9OMryU{_CZ9OsVd%d|5nJn3{#41WTfKj>fNHmFQeL0Mnop(N~LwTkYZFfv$B% z3&yRX()qSc^qpXb+Ew8Zx5n4RYeT%q? z9@c4H(5I20NMI7NB;s@J$7HWL)@ZlF)$?+KT;20GMEthOg>OnXD^Qse@|63|Y;p1T z`XNG)TP`4qx8)p?=?E_#*|im>NkhS)2YV{oZwI~fY)~>|0E(W`N6#Ku*~u|a$}V^X*F%lTVP>2S;n7=| zf_U5}FW@BI=WQa0yT<_>^d(wsp@Jurx-2;+srz%<=f?N-UVnjdpURiyo1~*onh@Qm zw~Qag^2ifZwK1{i()vw|+pu?nZFEsz``WLHlgu-spLE??^j~A*-^)kGB7cGPw~Sh8 z(X0@k;7x1h8Tp8K${>6s2%GG$KyDWB^V-%$0E$L{#K;3BZ2Bw#A`pSjFrmfNg;)iU11NY(I?88@?ALia3} zJitFPb)xbNJS3_gv$M6ukA!c%(YgkLVqtMHq-;F>v)ZD`%wu`$k3?ya#c^85&N)J> zdz;kG{2*OwL&dmBogn*1LH`i+s)-X;!^LD0Z`Ne23P_dx5(_&erVO{<0}Kvs*cu>o{i`D^sper#~&@2@Sa5eO=ZN}6vC z!)}b$YKj@ZR=iv60xLzy3Qm2r8*N_)GD^-zBz6~&kys?U_*n85f0MBNb>`;1;S|acs_Nn* zCk_q}%wJ1{(=ELp9J*U>I(rX2S<$_#TSbO`0lOSrSj`;UzM!Ek%ZlLoi$)#5OUeTl z2gU@kQ%wC!`gGJpLE8xP>llTLQ&d6K4-YK<%sJ8ute#+Lv zX=@faGu+yUnI*&?@1Ct1J`1(r#(Aei524&F4sWiWUpI#{DnBvL5>vrBql!dr!OPZh?0W(zt|M?j{@Rk!T?a=tYaUS)A95^d|IP zxVMhd!f7USww>n7UpD#Xcnqt4L1|y!PF@7hCSDWXL@O_t zaZwjsFeU}A33L^WvtIX!q1*%O?6w@zBN**o*5)*&(@$qZ9(g_4j}kGe;iY7)3pk58Kw1qkqm|hoF|JIbk!-I{Yy@W!UF-^a07bEkKcsr8Z2-y~ znicJmvTXDnlff%;Y7754?x~a@hC1+UJ<|n$PgAT3ds(Bu`L~rTh)ntRep_TWP?9i# zfbZM(J9**fNtShGXWbSk6mh`!;he9lt0L_+JKDZk$z=Vw z?;puNcSJ3`s@7bHWyq~1YCtGO^NH&F;@V0b+^3Vv*aJK7%3iEnI&WeAi5IcIB%|6x zWMCH?B;PQkJKWZ}r|rQQ+3fdqN#P3~v1}Ds`2iA7ai4gGJostWVz*3T^~dOd^{&Z` zFZ9#_F?aQ_R=9DE1ymPHka!}1oHcKm&}f%jG?3l3-A@MW!qq4Bwg>$Zm=zM1VXo%S zZ$P?DdJATyKDoSw^Sq5Te720|egsXnR;q+Y7zvpODIR)V44B;`QCeiilD4n7yj80( zgU?k=cn_+(4f%IBN-EM1LO)~9I3nHx6dKN>w*Hj>j`J&^5-vCRwchps%&d2~%+|aL zDk734Af>s|4_p)x`3ZX)5PY9>)}HxpMrj@hT5-BSOBU?OaODfHHN86M%hW7|MFe11D0zQGc@kbC0LD~{xWt2k5mOshymccqN}PXXFdp`e|}K>wY;9&5oW z9igZ6pWeRUd*7%O6X7i3W-PcpeV5yLlJb_3ng2Ts&;@h-D7XS*K=09}(ht->5xyf&xgpt%Lt9z0!U9 zVX*wrfcCEOPMePG)Hhz&u-4oagu%s0+cfxFY^b~3YQv~JWkMYGLnG$ zV#a|nr%9`Ew3`L8fAU{n$&YT&B;VpqZ^qkwEPlhu+y4*LReZOTa}E()CAb(6oGDLr>|l53D>I_Vp32ecWjXnEfp@d19kk06K)RBe#c1;=fGpXKeRB zZcTmBSG?K8{Vs<3HF`aF33DZ~X=CERmwx}nGEuvhM8+lKnNuX3)71Ggguu?rdcNWgjKj)HNR}toRWmywDn0#{yCL#3>aCTD6#YHJEcp1{8o5? z@jy3#@lAGjLOOj&`3s)Wcj&p&tN_1VN$3k@>E>D2p~JAb#6QY&jsJ}ZOHS>Hf)D*Q z^3@AYl0>iZI%#He=oVMW9oZG~KCZj~Iq~w@~b!>BkV4p^8>f%W=#*X8zJfP_Q_y&CW%6z2Q z`37(PyWV)-T3B1cx zwR5qSev`y-T)vNXyU?rtL0rY%p4S@p2FRG+>1Y3=rlBWjl2iq5!;_xvnW|(#MJtV> z+>r|z1l$MyVA;);@nG7__v5>s{dFCaTZg)ODeh3u;HPC-;M{1<8U=!{yXX|cHZ@F- z|Fgm=w|4o@fo0)(Jd$O9(n>3N`n|*QXdN1qd8sq(m2d#_W0Kl_V6ba`@$Sroy6_X{ z+kl1LKxSFC-U{5S1qTIvgvM{6pXFy}-kgkQXeHlmyK7bfZ&ByJ{wUXr(coWi6Rl{$ z*O>YNM|Lfr#x8_?!p&;62upRsl{Uk%LaYQjm%NVmyy<0+{=m9*@|yur_Qh}fNzq5C zc>8s}TNjz9>9uhr7YywfmYx&b1P$yFn8T|JP=UNLs z13n(Nv^SEL{mV2*<}}I87SF!9w=4h)N+-i6K6A6-RT)cO6SE0wklUG>aP{15yNg%6 zw0cPfR^Us%VZ}H_?z%A{U$*AM8z5$ouH7e)zMaCV%)e(Vs2J+k1a!brIWNS|HT{pDJkxln{2V+0|@yx4`<@m4*3t^$0BsxDuV!R!*P3|P$+Yfv_ryu$Z z!{9!!YhkkWqq!f)qDYGcJ{=fYlh{OX{EPM4&C%CL?I~91J|c-^8HO@u?5D36{tN(z z%zR>1*yw739G4whaM{1pd4)B_XjG$W5jSt0xTRGdoxPh)Q7#g|jCxu26VqZ=J4{U&9IDMSR}6HLeUL;4(PatQznwEA;klgt zzLKnSU4EbI)$aBw)kw85wY1~2#V&MeMy%j=o=s>X9G0I~z&R`)=H=w-z>>m0G!PfIUCHSeni-1pS7r^CfCfd zGrxYl_U3thWUWu1b-GKL+BQUyl&9LEpC4wPP1J4Ag<@t$w81w*Md?D%W3r0p$)U?i zeUjbbTOz!K{~myt)MFA0Q?l#h37W7@zXg_@`#B;wN*8Ai8SP{{`scPZHK@%+leiN zD&eDD7x%nUcj6ZB?wC;kd{Koe&8O-xxzkame#ZZ$A~fkE&4?>5=KcQQojDBS>o?ff z?J9V4^L+EuJp#}w z20elFoQYEvvdcos6M()@zUtb`lIvHOV2ee+`;6?zVu?||VV?^Lv3Qv*V##{jLt3W4 zjA~;mlh7L^^$Dd%e3Tsnebu|HiMaLTDzi-M;_{iSFr4SCkQs|i3|J16+dM< zEhEo;_U#a=PvA+Yk@f4^+<$pNcL1^U%F|j%w^e8MqtFk8J=l{D@(i^SXh}bVBb7*_ zA(sU#l6|hfA;1}rHB*8D(3NHVdfHY!(r;)t=tvk;n7+F&Zw zR@-Wmv;8RG zQ|W*f4Y8X^280Y!?sXF}_l~7LP|8$3x!a_hnyH;caxPbzN@)x_&qz8fJ|(_8s*=bl zfdae97~`-#MMEXc{iad9kMV?WonNP^3(~GHdtcD-p1kJN*X2qVky#RTRng~qAzI0|ZjWgWp;DDm zIMx$aY`_EF^`^{Khc9s)*K#wLK1dcKm1LT7mf}bg-#gAh+1y8qZ5$g`^nc>Gd#=z6 z^goN%p1=}L8U1af$o?wrd}2B0Kt6^wxffW0J+?hDta-(IqImo0AF(%kBe<)(q4S2uGO z_HPgGUzXw+Chmsxe4-ZG5%=}V`f}jSUBrx3p{8+G=qHkYkHxZ{nhciMiSnC9--)6& z@fjN9m{g@{CG>0|;-WRQg&%rV+Wsdl;N@*KCK2V==l;Yng1$fs?`rlqLV0pWB?N3A zdf#F1%brc^s8Mw8fYQTN_O9cQfc!M4QAOv=K=gm_ zI>!H@(j2k7*(ghB{uNe_vHL}|BoQLNtgUj}6HY`q)|Vq@lxifpxL-YzCDy!rHd#$w zd90VOwgb?p+wS>Xuz0ooZ1%22;+~W;vh|dgi?6H)jaEHxDf|rY(*rB~C2pJ}+{YRb zf6uM}R}FH5b{m03Gq?$mFA9o{*~6ZGw0)3AN3Z6)UZ0@*^u3; z^e@l_jFU;0dh2=K7=|#QSNm^;&F6Y9SI_+#+NQdDy&ihj+E>t5yO_LrY@@UCmm13EX^ct@OdrA0mOSJ7R*`boZ z)CNDlnNS%ECN|hO$_T@%)w7CgYdlR@!$bF7kp0j{jvc!=!)m8Ay{ftTqOU}sA)B4> zv1;J!3s{mh)#)LG75yDUtO@tFLfpQN1p2DmoN!lUcu{8>&@P0F43~}5i=9z znaL}7h~=a+!Mr8C52gYtmttJF^uVWBoncP84HLXxM)&!1I;@ z-UIF>#53&*Umyc*e+wE|PBPmsHek&%-;uWcmB2i1Hlq)r>BZASFUR8K7Mi|9GV14W zh`*HTQ#~}`Pm2_$537gWL3gT+>%bfIA~3{yPP{bJY%NT!pMM#MYg!2KNYSORXq9E% zdXc#F$kDwA0BnHSyg8Ni41ilTvuWDXjHcg*HuwTmk0U@ut|z#cLjS-%a<)i&QW6*S zqHJgP73YsS`GRx)BDkXcjGzsUDN<$O8k*37R;0< zGmALgLS(0+-?M1w%pqi|VEI&0V~F}=|M$c%LvMvUHWtE`9kb0Vw@wjk9sZ@#a-aZ* zI85iQ@FvQYnNH%!kdB;bvb8FplbAAeyU*6y!SVL7(|F7}k=3wuVf^nloYbS>EL6pBy5O4KeMSCG zjp{h~2JeGQ$F*{?(>N&L;pp)m+Uc;3ALpuK-^h?umX5C4InKsEzCti)SP(}5e#l+~ zO4QFaJB+Wz=EW*OMZbTyE|~QZT7?8BVeW|B9Ku{Y52k8I@<4|RTN1r4f!p9E4Fz}V z$EB4TD1OR9q&kb+Wffoh{W*teBKapW_F_ z5mV76nCp1_kX$P$)YzOm(`Nh&aR<7m6Ls#EfHHTQ--1|SK>nwG>XzNl{q{zB@$5>) zlQ`sm00q&(erI6un4oWX38_1<%;&Sf4k-y6pTbND9N!5($B2?9GQ5AG8plis!A@(z zBQ^+Wy4U#Sq9FkD9J@Z6^?+aV$phN&I5eyhGwX!mrBUGoilHz~IcCb_EwKu{CvWjT zYvA6L2@&t**&x83REY_yr%IK^o|$LL8v=ZE|ulRoj3cMj3V z)0lI+1~eNf65sv-ffQOS%R&(lah)T6)Z0U}g6i$)m%JsMkSX zrpL#kzd(qGRx%r>t~K~5PHDblaZk4#94sI4{P$qfZT7_>BhR6nEc9(2YujzfeKvj3@>g=q1$s8*`YUC8eA+9SW8pTI zx}Q)yh1Dg$MO-KA_JyMGEdP``%O+ZOn<`otyj-IeB@|0ET{vvwoveC{(ozBzj zLPymL_>Y5W!y^hZPb0T)D{qFWF?RNo9cbKuA8E$lc3-d2;}j81N~~yYNX|(5SYaa_ zCTrt3nF9GH_tLt>Ts{4<#W6TeKSUdn{_u&;Qgdo78kGXEIZ29kF5wW(bC# z=WE0DZd~RlEScK&AYfVxa(XhPMvD!he6Z<}v)FZ}7Z(FjW6i6R zH8JEqpq9u{e%$&q^IF-&(63_Xf9g9^Ov(XZneNWbt0~LpOZ?|r@1=Yx<0)coW*2waj*?X<;B;eEo%*<$1)o>sk&Xmpz765tz|AAygLKS33>>6&e z7Z3d-O7B#&Wz51G*+;jm<0zi51ed=$X}caIEZSLvPQecty+&K})#hBT7cNO0=6;sQ zW6KQo5i7xX1^hIRz3C4WWL&?HlhMtWZIt+sZwTM$kvZzfzp@5Bb$c6%L)(IsKSgp z`8H`&ISHYiD#fdqJ7)hLNDn1%8xrcT7p`=0tt%`gx~qS*QsCco0~A}4x;<9c%uIA9 z8^52sfo2xI_4(8E{Ek|mUFmd^KX#_R|1!7d8#jy-{=s5Zj&7?``@Iq90P3it5-Gn19_0vvzFp4LM1d zH~+)J5hFx1jOddn^tKmqFgl2kygW1;Me&cRvYT%)EA$>r4C_q(0&YBt*BcshgTHkC z^yycz!rw5Y;Y^n;&sPasLj80R5-bnAB~+G|5=##fORd8 zwJ{PruSI_B&mU-+Imc-jOAoO&+cl&IzEtqWfz~~bHc#Fvo6Fot$ls!~6;}qS0TKMk zMudXZq@v6UqDr1D;@%QUP83?nltuf(v-MqYM<`kRMdtQr*@)-k8zT7Kj9!pXu5G?OPj*~x+-r=VoJT z(sT71TU(YY2V&R5l+~ecIv+||4&}&2TWH@9AdeZ-KP`cux!GABMPyza8p=8r?hto- zun_Yl+~K)+_xMv~&Zt)YL9PRMb2rMO#O4sy2meiEs}^D)&hwfv5P6OIc$-@!{uSNq zqesjBYi3*>M43It56fih zmRzFPL^1)4zgc28(3A?NwLg?ad2ZyVP6l<;8o|(Ntt1<*2j$|$c&)4$c z1|3iM+fr-IGbeeZPBnS_B;nGy3g;Mq3wUXsdp5j?ltl~;CY`Y3S^*xEGap5hvyElp zE6$%3`T4yu(Y%-wug5!|6pDbgMf;hn=3DLOTwfg~`1#0k20?$JUqIhc(u9y)vX|ax znxIuxiT3*-e60lG)`ISG=YUa_EVcR^mZD?-QopTyDeA(`%T>*Cs#uiS89a2OX60gLN!H6?2{sJ$Di-J2sy13@XcT zIP=pl(-!eez zfG71w{z{oZ^BKr?1TGA~b20U(_m(AS3`CQk;066^rkx_;zo+?!xZVc5(_0SxGIu~8 z|0!%_RNk}NA1-zSwWPc}QEB{c*DYn~)9tjW@EG#wkDPY>*FMu(rd|6TaHwk#tirzbvaMcdCY*8kHra22ku#$?j{n|#4B z>B4vZpXR~e^|p*TIuEp5!)p&z4OfL9=9aZ_qq;}ZSW|aJ0PeY;O{agm(I;GS{V zk*&{IF*DHTngx3L5BCe?J(uK)ysZ%+;pnhW-7oR%?IT6NC(k;@t3bHq|E%KV((pb0 znd-kFXR!<{_B7zbnJ16%#)6!k{S`ESGMb6>01mEpch?=WtETp688iMcW>R((z_o|#_ePf?hC+=wQan0rltyWL%@&BRHm zqr2jZpo!1)=UAC0q)*`3Ve;<=$H*Xilk97JE2_ctE0#f%kk{#n({P7-hh4c7dXi#e zQJI54FK=j{K*>l*$MEGRvV@V#h$}l~LZu%7W8Tl_Ok7KHud;2=-wW44T(ZlEW8%ty z^rjb#vKvWM;m+OPk441mML8xo{XzyYlv=Say_6>}HMpup?=v)6;t{iaCH>ww47_Dd z$bhx1%iRs>5e8~!-vt?Ng#TrmRH()UKcj1Ou{lOhN=n?5S|AA1;y zPm1MUH!AbkTfBO-@`va3-~>G-#Mvsma+Nyavku#UOYYf*Kg~DAC=F}m%iv4RVbXRk zMR^5%?WNnBN^CptaKKi{WVB9)Hi!3Na_h`5R8Z+L-p@!x_o0nBsPzom=IoZ|v~Bzd z24dhdR&5pl`-qHEg<${sFpF;1quf+oJ($VLwscLA69Ov(|p* z*}OeD^}`wBuOqIskgmzM70l`fmCw(3lPXHpe;B!sHXQ z>}nO`Nq%dX+nV-_vR(}9@Tld~z$|{g6tZK%S?UhjBABE(=+Jjcke>O68DIRaRm%Z4 zt;wtRwvdxLVaaz#Ub?GyRJse&uLl_h$&kq&zmIY9#xSXrK=4k%49k$SaW$O@%iGpQ z!-}uMg{o{rr6-499!CR)U-A!+cp1?evnC&4=1|+sj=zd$CQY6CVIXgiV}|vEi})}T zc8YNhdrRkNxV^&KLQI-;RDL=O=N}JrYK3K5QELa)^9&b)HB+|# zOWxYOEy`G&j{UEt|JN|pUzRL&Dup6WaW)*?Yh{1dGf-R>1FAc{s`@V(KDhneT)N5* zt>|!BBdHdp-7l~?n{Ux*ZMb7JBQ3E0dLx=qO_$q_o)F{Aqu^|6`!A8wIA|J2%dbfXCF#K^8%R7i_vI^$*fQVXS zz5Qi1sUWDySWbVl!+G9wxpkq+@b>x4?4!KM|WfKEW5+_pQCsP*-q*-_wVejaRW*m_sY-t#Ye_BqE0{1x4s&FsJQU47xzReRZ` zTQxF+q6*dK|1b%TEw^9^KbybBM%ptILT4jEx4_ikyYd7b`TSndBr~H#m+@3+kMUDMAiLIhkNz%%R+ zWiaM0$ML*c7qzeV<-HHA>3NgjL1z_LffHW<4WfSIrOLH2uPV z;T*|?;P}!p{ndcR@#OjNWYp;l;t@rZ=0hXu2d}=V4)yf_~jGE z$c$%$V)28olO1FUr8^&SfIQjrY9`3n^9G(a%Zu#6x$H=V7OU!M0BlS( z67Ct_yV=|GT!B4PAOA*eQGD%$9_G@;m4I{I0pD!HFRbJzFU$8QO(nH~Fyfs4ich@j zRZ~>IA-RE>9T`zf6fh?K6H0!PTo-zJVd<)cEb(G7P)<_G${a>(%6xT@FB7~zZ=eCw zGN{53s8v{3M0|ma=krw<=%2m4?y&al@?sbf4HbZV)Z8ieaztC6P%iy zMk#Vt{O4rq3t~lD)#@SI-%)qi0n9f(`M<8?A{+V@d83liLGkz@yupJlFV3F0ls71o zpkfp)wgPHA%h_u|o6-DYYiZVjfqpQWB%V4Op>Ke>w3&;Pj}F8@m#!vgdn&+*SmlS} zTvC{dC}B#Oe3_-^@HMZ0O!P%^rHA5}Q0B$HoHZxIqhx=et_;rzFozd!IJj-@l;_Se zDu@T+R{MQ2kBeo>KH0=WEeyKydOvF0tLI4+`vVazrtqUuZ2IK`467fXdL*Wf5-?ES z;SnQ9(;t?}S#{%Br~fj>29o!px4`Vcv-G~Du+w9YGSBY+7;ttcmLtAnay+w$XCLjP z1t&mp7k8zXKlKuB{0po%7A3Skt5KQq;~ifh{0`mURndF*=oSQDz+NeCY2IxA_#MpB z>1d=(kh+t{a4!^T5Qbyu2gV=FN9!M`9-XQZN?h%);o9Nzi;kpV@)24MgCrSmtPxIc zPC*ZldY}mss5?emUZCQqTkpp^j2B^4Eax33iYw@laL}Y*n#I`r{X_2CF8R;`_hP}y zGO?#R{&@8O)`aJn{HD@zg=AOs6iMxE3r(21s{V3+1L6bz;@r+yH*EQt_FEQJbWUv3 zl#5gTHmhQPbk~NTxL*?K;-_n3uO8dv#XZSBk9f*Y5zWGJ*UG=mdRfePr-6yhH~Hd@ z8mL|LR@lC#DF91qH(4gm*p%zpchiZ@oITpyZ)p@TJ!SmfnHcz6Qmp?$^dP#QzB6Nx zsm6`T$(Wa(Klu{J3(hbD8R(rKjO>0CEZFtFB<0)!!7vK%9FWM3^CKEMjph+71nAi6 zrT?+_p3!hc@87o)L`09?f@nbykAh7g_6qBDAD z2r}9jrZ6+6JpRAmv)27Q>wa~=zu)Y2&UNECCts}GKMs0>b%$2)RIEn02=Cy`9ZBl z7Fji|m~WV&2g8pwKgG3#es5BJpcTydi#j7R%`X5@ zS`#Kk4cJLw5r5t`tn!1;hTFUV0%Kdp9a5@^KxQ@Vkg5&!fS3lumw;3gD2oW2l{rbK zYS>{kFu3JrotB{+piB#u5<(7pOt&omHq8I^$Al?MGp4Nt=Xx6A>0)Ur86E7;7J|_1 zo8|RN5l(e*l);=AEhlTnby>y=C=}@H6`k?XwV7X#wII?G+i=u)a8$@Y!1i^NJ>h%f zgDwE1C!gIMh713Py>=4j8Y!Or(QpdtA&JiUDtwEco~++>OUIaJTMAQy2(zIl+a>u1D+-wSVQ5o0Zc zA|Q#y&{%5MW+?V`s!g$J$dC)1Qyvf#dgfGovb35On$gj%y`j9*^L7K*I;&9%Ks_P6 zR}}Lk70?uD(IL+AenWX$S--reCiI z-~irHq7yen3s(loqb?DuiD~5HB#*T4kJ@uWN=FfaLQS;m(vn4KqDT1N7Q5!&$ipl} z(IlVGE*(cgCT}8a78w`+gv~^`ozc^_&xwPb?}=z^&oS{9CljNorzDPb94V69;#YZz z{3ndLPea&L9hDCf44p(Sdn2RqoQfnSR3qKhAG+r>1Gf4Ux=Z1`k$j4W3iIbt-3mZy zz<2?{#!7PSvJ&fF5& z$g?|$&Jz-#Ja)L#X7@kPXpl)JOc9edrZ}mP;nWe|^=^)3=SOTkERMTNU*rCaeRdfU z?@*9(A7+GS6Z)Yr9C2&EIIf09^4551kp*kipXlOf{q!La4*~6SefuVGm6jyMdUCl& zpXQ3i?%HyLG-Q?L;PI}Fae=!*b8!3#-*O%H^770t^sB$r)$ZSH(z=O)@_v``W`-td zyfp9a{Ad>E;52}3M!HEd{C^l!PKOvw?4fQa(8Hy*I(=^{6k6H z_n|Xh|7B{#Rbm*`L8x~k;54H|RAf2!NQr^>X#)f4+MOnyd31@}prTF;w}dm1zIkj= zlX1DTOZfn_ffrMa5Ss7YxNV6+CVt6RVu@uksf)bCI(LCYfB!Qc&w&|AAlk)m5d}N$ z)5ELTxu55PdH@n^pbbL$?!tx&&^wZ^zMt=)J8={Ek#Yy;$BSB{hw!JN&AbCm4$(dB zP2#N1-s2XBv^}6z1}flz7-cI_iKjjzZ8xdksEpknwIQH%o%&$*GR$kS*sw*gztz+B z05iZ7^I)r--iRsUdwIs~jft1_0>xgEgZ9dP<&gSe9jYx(of zx5NseP`=Loqy%)(z_xa8@T7KKBNV96kz~g-c zz{@fAQgL|oBi9L~$&|mlXGAqET?L;~*sJf^Hs!g|s5iRc=#&&8i!L(_{+6d4Ap?Uo zjRuf(jRj}konJm?ya4mJeA~~-{L}?X%0Jmbpg{#=*M7iKNE#+J_rj&{A?dB04acQN ziSMF)59$VZBJ`DC=6lf!-8~QfwwmgwC7|Ok=NfexVmgVw6c5IKx$dKA5q%+va3bNLlPWBUfh&*_9L?J(4*s zQrGYgeXu)LM`>@wcK>Lz9Nc5cRloaw`l?UfZ22%{UXkn&=--c{q`cQ?&GZ?XooaYH zhDp!;tKsgy^=_e`3%_UiO^!TRIIv11FED7Q*O!q;0TvHFx>9(eqfId{?OmMAE9Kt$ zPRXJe&QT~28a2hge=y_U(FzFfPt9X@HehBH(9wE7kec|z^2UuDD`k6siB)9@X`n*j z3CH7m)O6SWS8)tsf;?jTU+4chI)<>jU;6)4`kx@t>jA(c{EONDzxm^C%H78Qy*Woj z<`$f_PKW`suJL8*k|-LoP6i9jm5U>a=%V@mR6W+Ylz$#Bb#dtm4x-QSKcnoX zupRz4AQCek(Z%_nalp!AFRDmy056~ZH^AESPaDSgpFX{&bpPM3&i@-oaP%ui{^wRG z&AZqC)3-AwNJx>jh=e}`b>|DSsxvi3y&H^7GjqEbhaM(Kz^+POqkM|6BeaJON4E#VfZ{28*F94-ULkx>J3&5});t>CbmJ!_Y6t#A_$JK7Uu=IsH_} z|K^HbdI_|)?@E*=W#vZ1g@b90L{{`tZ1AZd`r8*(h&#D#P>9+<7 zinIn8R2RQ8(1DIVnaDYr@WX!7d9hc1rX~7yp2MSBI%u284IMmkh7nutpIrZrtwv5~ z?n;?HT73jbt{8%?Cld=-*Z~=04lbvbMXz1Hn0M(fOXvBntvA@p#t=OHI^f0>rwE+^ zNUyFuH7|u{XJ@d(!u|(4lN{{bIN?IupB!eTn*(0b??O$K|2`0PkXbUmbf-=nQq8cp zZS`PDVz%Ap6P9bGQYu^wJ2vZt$7J<;6^dGIRx^^gs=!mlR%=7RQs$jE7*|+L>P~E+ zrRN|0zpQT@@k0*VUcXtwKY#rqr=#;V9AZ@$-ebGp+Drb4V>2WPnOY046cQ7<*e%B@ z;VfG=YCT_gAzyaPv3o&x&MSH`S9g(ovPLF#c69l?#R^)&_qwFNpsR=6nfH2vbb;zN zy31qPSQlqq;K_l(OVi}aG3>VGUyJ>@Z{)JqoFfdkBlSC{%Z8=q&m?mQk!=m(v~Yyf zT2r=$VqD|i^$qxztwPF;Wb3Y2^uefPt(X4#j4SLzWcYeH6jj5Jq`R;S`XewB6iOpU ze0Z+E)ndjKabOs_A~D@y4CMcni%E@s;6ONeL(rd$Q_=c?yg=)k0|fU5D+gzrQ8d^~ zxxchvGFBlW+PnJ~x)Zox@-FD7jNrmElu)?S zdo^;;v|Zk&uA^3d+orK@o^H*YVex*g?5M}xX-|8BWj;2&E+k}V;UD$hS;i*hgPYA4 zcLVm%W|I!T#rA!!IrlJ)a4ATV{I2im`eGm#ppA$FbDcYlyIvWkbz6! zJxlT434NjV_%q3-{Ib?(E6-2%;}LcHtWd3Ie1=0nuc$-<_!A58QRtcE@iQ|nC^SMj zNn$lYR?4sQr@E;9pvS&7P$e!>-o{ibCxaH)f-EDuDZ5d|^hSW{23@f~mhwkWcno4|)muXzMPZ2)3fa z0!kbg!!SX?Vo9Ix_D@0%A$W^jFUCHf2bLfMe~-G{bON`~h_A(wx(UyYPrf6l2TX@~ zDEH{w>H&E6z`cTLwGXY=2S>=k+GKbzHP0FajJLqVCA$hI151t)xQbaFWwy|NQtvjyL9Ml3ebBvlRkO9 zhg7NTdB`UH$Vk!%6QZHW$?gl4K~E#xj61&+xNwxx?&T!#)hjPcJn7>3N`tY9!QITT zVW(ZS`gyf+L?RG*NUK>eNC@*ewpv=~EZDJ4$d>1?M822ZA2o|99*JmwK$GL_d`-sT zjwI}7z_I0$MpBDJ%4r+(4bs?hG9krn!Bq`W*(?Q1fzAqaSXCP)2c|Sz06(bg_^xLn zr)a+%ST%%CYwx!&XZY5;Ti1TMM;Ln4v_cm10RsL;o6dsj6E2La{65dMxkpdC+>JY_ z-!z`#uB;&NA0r`a=31<)yFpfkmoO_DdX8(GY5hmy-=e2@S!;oyjBKi+cP5$xcn848 z^J7@+&3={PY}U$4^W1*qc{g;(x7wK-jy2WXcm)=o=-S{%o$%mDT)SNcE*riJ$q%HV z_-mTn*~V`n1&=@h?=%-?)zBT*QVsdOpx`c|oq`Fe>jF7Ba3W~A(3>21%cqkp(4K2e zN+6^bSwN@xr_-U`4h!;0h;vEZh$Of#*027v0RhC zay)cLe{*Hp-{Ec?bF#FXjC&!rzoJW6R$cs@=bsihmr-gv;ZKhZlKIvNu#thsp!1DR z*EmqW(;svmUVI%gNpFnX*LSLQ&c2fA`0FDlt~Y%f=Of4flChGil%&_Aa?&npyyT&u z6VA3Vv)1dM4?b3J(TzwPJeg34AtE(q(vj+47T_Ffp1(SQUQ=Cb0{d=oBdv6ed+zlnPwH>GR%K;&uN{;auHi(t=d_I; zlV>IRjqSj)xVhWGo|fl|H|TIC)PZxpf4f1aH$@1u(`Hj<%h&d0K9v{MM!Pn@bW~Vg zYT^x@wK3IgpS6$dd_ZYAszi*X>vsN=YC>;njr=LnYhB*IyA25yMD2T2$N(akMzi*l zGUBI@i>lMb?$uGl8B6IW`Fq90&}pm4NhpB5-^gy+T+m#5=T>%c#ARu(6YA4955-wS5vS1x?IQ1;4Ik z=0d|~pqv7(l)eY^#RvMt-^qkph3lkn^_|*AQA%HZwu5IcL0rTQw0~_>xdk}1`cM0Y zWdYsG=gC_}k^wp^K2^!qKTN{%TFcRLQSV}HN*$KlJ{!_Jd)a4iLrSUia<9Km?@C5+ z)MYT@nYsHsZH!lg5|@A48&Nm84x`eyUaUWl_I=5d_>Qw5d-gfHW?I^%dOWmsr+nNe zlIu4@-Po2~QQ$93n*J#60pLY=uE<11?#=(Q{|wdgcxKfHoKp{&CP3K}n$$-@j z=U}!jEBo7z!H97v6*?64??Uj&^S%1 z3Eo;+7|>z)87uKSmVDKA1_RPg?sclP|pJPxeo?~obctAyR3aD z-(3?niScUPCY=zf&ifCtx7r+A?kD+fY6ViCT@WsdX3K;V@^*Fl>~%3=$IqI~_qa&w zg?e~CeT>aYS3IKQ{yACZeL~;!X)pfWvvQ`?{1c7owUp7M^hPhuG{nQzdq4&OMzX$p9N` zqosI1$ClnVlS|9sA_+#wtYw-^&@>0)anOraapBCKx30s0I6jvSBk#o?*&5uSd^ecV5n0{!DI;b1Wy4Wv|IOd zoI_bRJg{BePI-WCmw>t|5eRo6Hp{EWfzd{}xRo-Aa{rGcc#BL++?*-on8m@*>U zM2XT_X$>otMBwY~tQh*dNc-2vG)Rw#RASQ^rY`t2MFK?jGPPYGU3U0vs2j6MLFE-WZVPi1X@$2SC4`db8fZ6C7;zG|W3<*=vm z&mBT_tqcKn4{mHUvM1(`Ki1}1dGJ)!^KRdbDdGG`52olg&Y~;_7^~_J41XQ;$(T$2 ziDuB^BfrvO;XlsNWVJ@fL_Esb`GvMWHv$T&p)c6%4@|piUIz5K8jV(kyzf2wD6GXn z@@P={$G*~>e992?Dx#UWse6X=&JTrevUNb3y&=ZU{*zga{du0IGai!lW~z^qvi{eT zUEn%n%QH?=SvCHej~m*RYkBEkGXrk<#tFXUwJQ_UAJP5l8nN+1=*n zXxgYNF!+U{H^(g-jWBB6wJfpWGVHNG&^1hA3406+U8de&QRhCj(I30lN__EbNalgJ z<_PegUlj4E(zZHCB@<(>J!cHdh?g1E@8mW~-~mU@X`xt0hX_lrA-Ag=e$}CCmL&tVMRhY1PHcyb=UN$v z=ehJcDh6ZUDSckkkOwwRGiIM!PL)nb9A$6`6i+VAN?i7Z2ynhAE;4Pn!)oeruASMr z*Csf0)3C{J!e_t+#@%=V^*e^{V)d&13>pOLSorOFNtHv=zu3@F=|Co;a$6(=;_fmw zJA9?O9>y#Gu!rE14P$VXtG{#*Get&bLjse1ZBD}4hFqbJ1%|0M&wGI19#~a78?fR# zT>MY3?*uXHg{5|#gg|%S0;^#L#?R$+M$ze031m!A#Z8j5^?eO++x|3J10}y3oD_Mr zl!(x41iqFb^j%~z!QLRgKEL^X*W8nisN^{q_T*a--TRglAA1w0XDzN2r1JU!-^eE=~ zIQyFCt&^b74VlC|&yjm)jw3aTbUKanpR>Rh1hJP{SFG31l$I-0z8)ma|CDajJBYBF zho6w29L&Go7s#Uv8E1f0x=`#f;O8H7_KxTiT+c4l%LgZC{55MV)qrNuy6nk)a>xCCB)#X@dxO51g@o0*oZt4kZyxk*;Uvu!D1Ygs34*3ZG(ps_!I{p-t=L7* z&*WF5{Q`T_N%&`zUXYfXytrRd#Ac|%;pNpiCOG?fdk0TFM8HK~E?VR?A+*fyG{?@T z>z4yquig0HU=$|_N^KeFSg?AulkrIOn?u8xr$ied5>`q=8N@-S6+KM_q{tOH;mMvJJ;mnQ}U2YIA+FXE%y{ zK?7M}r1UbnD~7D3VP_h~_k4B*D~?UwM1tQ+sXN=|722jm0>YGq(X)qtL3Jf+Qm$C~6~35FWNOPYe3#T(Bg+O#*eILetMH z%mfEt9ZcDuSJPq^wq9Mq9;=PnOQxfn&*=AUR_%FqH8Z#D($2d&DW;3fRh!7z!20IB z;@NP5OXetkUA73pJ1v5qKT2o(>uL4Eh=j6R`(a48HDdn*u%ZwoMqTMzG?iGCz??`( zPXk6tqi{YxclRbX&M+&NNkv(nBx>#4(#uz`R#t?YqwMZFE){ zdWkJ`hXE~SduG=QdRNmcSa1hj0h)E)J*ljEKnZ(Y`!&Irt~Fh*`9sHGfi0l{>3wVe zbEnnavYlFqoix{1t*l!E9q)t*P$!@v2CRQyq;XK}F&}zRtes`6f0_jdyYUOxkIvH{ zES~h*EKl%pQZthS7zk_)6X9I4lP~R$XZ~(q-c@G3b4=aoCipK8e-3E`VuEhet$7m` zp3othcy*Ejq5dBVLI`{~XZCd-^dJ#Kret(BU#&tht;gxox#`}&$5#H}@e{fmr`(VC zo-!IsT>JcsjkEnvH_O$-qa(9xHZQN~>p!fIT8MxZ_;o_O;Q4T1Au0Oc?fh32XiOb%ZQ0#;= zD338P?LB@o$r=n>X&6b`i-kI`Tc^Ivz}CVCcV=BsS%^Cw7zQ7KWe^-HQjVq91;U!< zc!OA29$IGz7IAOb_q;0PKRnbB6$w-e#w$hGvY)<4z>Y7n3jLZ5(- zRf1!W3>Nnkwb>4e^gw{h96eyb;^sz20x_20w5su;_`6V{iiJZ$N{}0DFv!|a@C*3D z8W4;QQc0+2FhYJ!Bzu3%A3|jSA43b;b73sKZmw1g2gpSiq4Lm7uSTYU!oGD*UPBiA z=VMyJS2UhFVJB;?9gH0V5k%9F5pBuHWSPUJUvCk z1PrYB6P|5ck(K@KphVqNcu7Ok9a<8(j#^o{x6at(x3Mf>5)G1ajzB%MNe@A&h%y~C zSf$@W?4Io0_I{AZ=3144M@XE%ynqY+TchK?_AA`Hh^M1^#9q$}YRsEsZ!+rUkiovF z(@{h&C5xDE3P}1sB6q|)KZAgWa^}BTD;!$Cj|pT4qf1A6msUFeur_ zt$mt|jPZFp>+D`;+IjA+&6cf7DJgtrAcu^;Saz2K4srw<^|VRwmKaCS1L`xbIMveC zY5lCXzx>22^N1L~W$UvNGLiALF+T^*oz4U}%jZo1pD|O_+@U%RjU>fH%#3Qpku*NT zX~D@Zf`c|Id{jY)pw+oGE83tUX?o%L7Nbyl_%On+ZsB0@gi8?AX~7Ck3NM5XKgLCXIa=knn?7)o7_ja7UJQL#!p1*RQu~5W0QwjNWiV%p#9|d@@AzBo9NZTq1 zrBiuu>pxc>@XkbmP8hIWXrg-Bg)CPMuxEHQrDLDZ?MrmQY-!rLheG z;lX}(A2iYRInb=_Or`{UtfUw+W#ib(klHX*y-?Kc2F=qse52`&dk@?w*+fS57)*-r zHJWkp9y1|0m%OO{>AlW9kt>0vUE5bKv4;pLN82yVLS%T$QH-4dHZQLSH(m1*JD{xnCK1L2ofUwt4jc=9%I1$QXy z3j~M#d$8}*PY`T@@|>G(tWV5$kMlQFn!EGPAnMI7O(cVeYG16uw4j|n3Uh(RPyrD& z)opBkmkMfcpmV8qRMwfmlA7QBW1%jCVZuf~Y#`K@dg5^$g{|e}%xAxq ztiyr(PD^Y&p5CnV3dXO9cSALU;&UQiQni;~dwFl+jdLge&pLi`|D+FuGrCV*h?eCE z-$Zx^5Mvc7(CCiSLfmtl(rUEA$!khWUxiTkP`wUn7-tQYvf^HmaiP)BY$xFl4p~(U zU5H*{?_jQuaeI2QJ%&wE%SfBK<1iNg#ow2ESz_-`jpjylaaa_7RB`>&-5bpGo&nwu zTAhANPKI~^X^I14AbE}C@;lzxVa^R3b~P@{l&O8Uc_-6@y>A5!rZoGt*)*{92}o4V z-L3Fqe`K!k?%`-|f-!pGjJ{JB#N&-Ip`JEmy~7{`jKK;J8k7~c8@Z;}G$mDmA zoNd^CEx(m?k~MqugnPQ;f#<%%;YkPUNzdEzcK9eQT{}Q@&6e-{&6Dp}4pg8=G~Vep zw{Zq@$`OA{IVLSS6JSZ6!R6mVaCa*N+TW&w1K?XL8vqU9 z#Xn>OA0#phZT)&CeapmSQ$Yi=&fw3d&OnayV=g`q;!|J@xfQc@>~1UfrD@tkG1Bhm zKPQnuxBNtO^ytSQ*5-ve^iDbfNw+F&3tbiyY_-k%aNc{n$)t-cgskY9Ki@gvEIGPr zjg*YL^ISQq3-2d&mP>?h0dTezqfXfH4FdF-)mF2%pDOmruE;yQrRTO?Ds9fapnY=! zJ!QQ0mhgFk3B^X0p(S@sx6`g{b}5}cX|_2~8vDq#8$bF7t39v7GmPK1iC{<1wFbVC z?dm1``%yp@nX!{+eWuBh9xbxr^ICDff>8Zv7*6_>GM5Ox_@2lUuz=%%Wp_z??HC5O*$YVt5qBv4YuiV-xULK8J&^G+fx5mvDgcQI{D13tTAaD{H%nKkgfUrG)YYbcUt zT^MdkHmc4q4JwkOIf|sFNMJtfJ>EEdxP0*3m!_x;Gs+j(zLEK~xPXX&u=nudJhhsmY#I|B2@!7To5aJLH>~Ww>drZgH z+_Pcs(>$(f7BE!fS2e^5ymVg2SFOcU5DT9&NNX2hME4Q9>9}yIS2+%wx5msVfq2R7 z{11K!lx~9&i{Q3w{Euowa9C~*dAeOY3(9v;4*9tvf>NuCG+3E3Cx?o^(BX;rcMur` z*@F!uZzHzR#bi6PeM_^IoNZVl0UuU@c%!9!9G2{Wx2pz_-x`Q7vaBsmJc*2~whD1S z_vmev3HPEu?KwWGvS))&0Z)qKeS|$D84vC)E*!KtTo!4jigXIb8RJAZhtGBaEib1W z_M5rRO@q627kQ2rH8OT?xo194alwnihX=!=k1KhOnfjQaF0?Ca-Kwl-q{u>i`_$1U zZSO8D?<}f!G&_CattxG*(AuzdMspY*r|ov9W+_zj#|B37_}c0~sIQ>1hql zsuu2XFnQv`Lvz0GsP*tuU=Pt~Kb>cYf>Oiis^y&@3w&zCMLK>OeJx&Y^RsTX+n~|; z(@Y`R$ZFi5?qTY8Sb6wgu^ojEB8tC6aV63b+fsR>LpgT`!bR{ZvF{0>v{4dDdi+apXOe zdB=?@+vaNMYc#>48yRO!$!f$48a~Nq8O$X6H7V68;iN`>=SQJOheWbG#Ym$PI9a8O zeM-(LCFM8m)F5a$?U-2rL%dErgtMXBhi-S)eK#Z5E&pJMB6MytwpyQa&peDtN9Aqq zg3MpZSslqez^Li+6^gRto7<<5+-B981HN2$|@1N7ixu;x z?`qwYB*qaPhE#78y|xAQ{gjt&44C5x<)~K?g;DECyyi+r2lcG|H{LpF{<+G3lR^Dx z`t34$gVXyFK&J`G?!0`?5!qWQlwVhr!9OJ(YGI^0(vy$gn0sI5-w42v|rUWtiTcwGlcdm>{-XNPuTajp4Q>GA}jx~TN<{*l;>@;Vjs*(;%kKVjo& zgB{^iP`T;wu|U>@d4Gh_w1*as)!2$O1vO599f$j)#i7(107oICwsvn86qGy=a(53m za@5W9`aIn|Gw9W4`JeujPs)*$01>Xqi#Pt-6IiquQfVfWv;HN3!<)luV88z7+ zz=Yi!fv*|t&Aq0UkFbb*3gd%Ezj~`-O>Vlgt1YSOkg<;okZ?u5E^3$Cs?T`Tmme(bGd6o;yll@f>dn26Za|NFVQJ~t2v1iiX zT?27?ANv&ODcdb{LncyRhA{cw7gO|9PIyxyqHH)T@QwIOnSaQkgEcbZ-)2GFM|3rg z?l`9B>Bf@iL3A@bgZ4;Zk#8qRc0)6_HEbiI+$&`u;?ciarPzC34|AEi$2CPCaHK^fI;W&VoI}d3GC-zTg}56 zmeu^L?Pw-=^(!RHs95JBnQM1>N3A5~)@FfH^}h<%9b!K|bn)y{bcq9fH<17NVKDt3 z;NL5f$aB?Nd4vij4P!T`n2~^hq~Mj_Q#f!AeP(F|!Onn>C48jW=ueXQg&dHF>g;<-y#pzv#Eb z^v|$djv4N%2_RRER}RJ&Spyx$7AxGBv!5JXo=q9(%68g`iV&^P`v{okVhVT+E(X<` zmsdWzQ0{R2f@t6!rq{bTHx|mRE1g9iWeP^24U=P*uVjOluN$jn`9zwN3zEaiw$(Mv zhum#AyNQWj-Kv;n@|~6996I)?UaV_RhHvzq z`D&_eUTBmQtQ~uoue2ZCZ_ARMuh?soeH(SeS9djhZQfDad;#Adx(^%( zacZ-WIC=vT5H?Q`{KjzB;}yaNQGSFZuYV4g{rRzWjfXt#-zh0FguI!R;Y-jJ`RMg2 z9qZd>Y=3RX;|0U4J8!iAmfyP)(?bA_1^`O`bec#Zbi9OUTMRIuYjGh(GVVsv?EM^3AVo^(?5c zKy+TKUTpglYlZ5I-&T5r#fQt<_?3Kj6(FRjdu_r^HT`(ezJIa78q@gP1IS&j%Y}ejYbh7Pvxh-xzROD=0)fk$hN;@V{w(=YnGIN@kX`kB$fqygy;g zPI*5AaNEctwcfvD{`M@Fh7#CB^s3=y4{TJWC7Y#uNkX|qq!C2_76*XCE^n`iND)e{ zRjc0Tb|eDlQ!-W_1dbC{H-$#3>n@aQ{1~^Add~;?E?nfQPYn{d+?1xf{+DG8 z$8n=Judih5`=5(uVKePRp4|wFbBo`N7Trv~wZ@@O95w%J##W)QfWz(7UG6(7zBcS2 zY=^cf4+@zCSd{Q?`U+{S(#iwcZ{I8TYCWmXEW;fB<>ov-(ELT^kl|r?eegGtZTqZg z(v<6!KnVUlJFxHp$Mokuq3C_D*-|Mt!i#LQ&h2ZJ?beu>M8$JEf*yMzX&6a^nTxze zSIhR+s`6U$ex@Doit%gnQwC;M3$0%YItm7@2Uw{d;3$S~+NASs3PvGk+Ee^p^Uk|D zi6Jj-FFRU|?^^mAmBJd-AwYlDo^@Z)2=A^Nh_N-t;~H8Yhq3uSlpZ3iQr4~A8xkL; zk%If@cEi!`tBp=={$;o^xJ_=P_}qa0d|~w+^Hi*HZ)?Du=!UzXZ0L!VYV#}7;|=I7 z>TXzCz9^(GmQ-?JHEw|al6gD`|83ldMEWT-JBs95E}kbE9Tj*z`(740hM2Qp4XuV; z(glJFSu@uGn@N}9+5P3T8IZ3u;hl)AL@%>HA6ZLAV}fGrGr`oMn_Jo+Dc&-~1T`zY z)a&N^0`n)WKbuT?f*}8{;j~9g_3)i=sg!*+c-;fQqMBbwVx_j9S;7Jp(h6bF`VIbC z7a$3awcRmxw;;oBP>*!Bipx-wPR{RveG_yvTnHDdPALHq`k~K9ZL!xrk1pM2hPc2} zKXG(U%8j+|3d!*ss)c#}6OR~RvdZi#DAaqP(8%P6V%^ZpRG#X-{~9>a5>&?17^h|; zI0>nGus7SM`y!xug9_EB@+AfgQ?+6DL|;8) z`;ER!N})Ryn~jh-d-7obyrJ-3`H^iL(f-yuv51v6b#q?P`-LH-JNk=zQM-R6Hs^nu zmGQ{O**M@ts3KL;@)dfU`#ho*G~Ns);wrBFy{|8Q_>-npFQ@8=dy@^e^ikm3$D8{( z9^bUOk`7_q5M%q<$d&ueI}=e6H@6-j+D%W$H7jD-vR&do7w&@eK1&0(TY};*_YrEM zJ3g8?yb9U?TUA0IGoJna2-yBqxz@zooJ)h(%|VuEo5@Z>R^-n3qQE96%9*5<_nfAg zFw>no`=t;@jf6;Tjl`ut2}K{% z`_G$Wc(5)-UEg!@PmQ`aPuaihY9Sb)q_w~bI^R2Y9db~(1DKVm3L8$1XNJcTqV{kI7M0ViK zCs=JV{)fYhqi6glXAl3z(r;Tm4EtE5bq#kSe2(=f<(z5evz!>7Z~1VPn1KZV@64RF zJx(v@8J&ZPJ7|0d+Kv#O^>j5cQVpKk}-^sVc>zKxd%U>Z|jH|ELg2&cx}n zpm1v##HHm>eD3?VkLuyXY5zAuw<${BT z+Y=g`18qld19HkW0Rsy)6CUHhtRy1zq#V+;ASDm=A@6a+&3~I|?<(j#r`1^*QUt1O zSw{SPON6}h8)znOPXz2V0Jc&iLzVJ_(@AH;JM!2&*3sn30i503UhGg%;#TdzHZ!8@ zcP2_x&@~~{3I%iyUxRk#M~PIZ!G5xvy}W-6*BmsQksOdBbFxJdbz;EXFmE8m38K>N zFmljy*1pD^eg14H_$#DlMVtcn=`feU)r_|!>BOey)&7dv`!nv+Kj-qv|2Ma}(C> zux3;Qp4@QQe6hw5z+uNk`lARaSxpRhR6J{Y^L`#jmxE}QXSDBa&SY#RkSL4>ov5Xp zE@)bNvTwx=&l(R>!EPUwjos^7kmOX4CqBys^`0`tzL;p0Ld-$*@X+Pb4ooxsh(=qi z@00P8=1wf#v=uMKa^OfAZ~N)7IbW7nwbc){#_DtW<(V8G>em=PaCL;ODjE$b={O8$ zJpK*gAII=544)PFh_9UISRySk?R62`?2{L3Tp9NBKDYO5IxULtE-8zG#&^lmFiBs) z;|oy4ed8lkbiv(T+Krs|-!f32)^PTX+iwS4vR5To&u=IMh$0e$)9()#@P9$3kse4- zwJ@HV5Rb)3aLsMw8@DbzsDnle_$L$h0jR=}Xf2MMdM`!^`yq~RHe2S}g2r7|seWQ7 z9-0`F@XGHU;;GFNt<|jfK&*4CK+Z)@J|Kt~29>euiSj*~kOH1Q`70H$C}9zGBH`*5 z_F-=w{-P^O0lQ}ODlAxuCB6UDmi@}t6h45(UyR1zXPFvgD>Fmfi~BpC_hs2{{`+KJ z59ZqrRBgB#`nhRY$qp&DebbZiURN(|7o?;P!?R!UIG?J0yHHZxflPC*C;aLe`HM#V z#~qDksvY5O82bq8(5u!m){QJ6K6>Yuy%G$NjENkGwm7z9&9?E64%J?N-O7~FEftjL zqqyA#u!MTz!1r6B47v82(Wq4XdfTe@z`@5VzDps#E33H*-fude%j;`MkFA=Vryb^b z4V}H<;^1S|TTeNOy!I(F$~eI)-1*Hi0%LkhnhCRFVW<#~L zgqQexv5`g#Yqy2=)HUj1i~$C|cKe#{nz+V6d|DcL-*xC=ZR;>L;65J3n~h5v{l z&yVw8=`0NLS=;N7yc({q3!1bqJg3BWP3(W`21USCXFz!tkhxd8GkZXUA`0}@g?6r4 zuj~0<*fMm7Qzh}N`qfks;INlxK6!S2x{pSu8~;; ze|QY1_pw7(-sJ z96msZy0*#^`0z;0PZg9Cc*5$Na`S&`C3`brljHGcQKnqhz)PlfY~W{;91nGVwF+$| z0WSD>oDZ*FWZZ!%3}kqD>glxoIF{Y9@dOpn`euJyi4V7PHp)MfBGrrF$hKEvh~KN! zX041nO`9vvpz#s24gIzg#$5!FghI<7x}N)gsTzsb#ZkJ$HI{ea64Pd+}0r^ zqrUQHH2&D&^MO15U69K80i-$LYDx>7E&o-pZT)=(TG7>B^#h^>Ege^3Z1e*QV@8)A zrBFvs-{|_K4;is{O>2I^M6r~1@kk2%5;A(m_u4Eea)Oj!8;kz@_%59N{{e?Uc)#)M zVw96j{#1(mY%TE1N-|EUToL0;$k{O7j$G+A$d&cbqP%vqfHI#L_fu|52k4i*(z*^* z_a%RdDe1v+l#~4v`eYw>p#6Cotk3S&xTaU+$UkTS>#;&tfoX7T0 zL)24a@z5F(sxR$CT4A#lXb;4n7pm_aLX2upJjnPvYG?Vpp88t8x2pcKeJaq5?~AHW z`N(v``h3VuJ&O9NZ)Dsa_2~A{tG1kejCvgRFSSg@TU5WhOd06UI8JK&tZ1i1CG{U? z+)TAA=`8m!A^^BYf#rOE!CsAtKhTaEq3vKtC;9Q9H6OTvzf({zw2S%`_OHfn?*E+* zPDXt?9Wp_CsaG%_pnAU$$WiY!mv(nuhw^Ic8AnF_%_!=3FJk@dwg}0;7y8tPx`R*c zo<8ON$^l=eJ6Jb_O7YxR6sP07AXM_ey^~PMALkFDLJ7y0!lfh7ulRE@$|>%C0aR|s zeMPB1idyymO(F(H7KGaX=>X zk2veoUJc5NRG^(*Mk8IJbsQ?xavxFpDgY`>raz##NQrih-%Gx6X_Wt4zmL0@p}bYI7-veeVjGxk}lJUMf zH7oB?y2cUs1{;##`HP)_SY8_?Pv8&L1gJECd-$+yh^ z&2gb!H4f?8W6x0E9{O>eR%oDJoh~yDYp3pK&~BZ!ATGYJQ$PAAon)(MUvv)Z>zoJd zchA zb0^qimiz$iV77yCugx6k@0yi%XZg)h7&oBhbB) zadNtE8w)+%duXEl%%kadnS1{RZCam>{xLn2i08UZ4|Ybq&5x#lHg{vZ-|o^EP_OP! z{lIVNJ^=a+XY!nGsL%IQ48AYNcrYmS#`C6z*1}ZKO~K@oGJ?H^y6Z7c3|^<>xfp}H z6VNUO$G1{$?+EBMG-14b!^B~xH0;E@39d<^~4~$#-S$TGlrh?QPgT6a8c869ayO!mAj^hW+c%KL%y4Y#-Zj@=c|G zU^rft?I6i`Mh1^U(QgKM*|5uS06wfHw0d5n44mE(daZUu;CUOXDR1yxsa4(yw5!#e zbNId0YG^X*Zxy{1&vjZ&t;PF8R#|88+_Tjr#^taI3xhtZiA(Svl+^-N>KTa-a|o@L zj)47E{T`g0c$%SItj74@y(TMb3%qA(<-xeXR$eA}AK5BY3H7q- z`3cXTTR9GGpdI>n{?5vo@oud8G47I8a92FHW!0PKMk}*-cy7un?j@d^vI_XddM9*X z{SxlIWIdg7S)ci=pEKjATCLW=@1|Cxw_LlHVh<2?tV z&jCF5CG2&D`CV_>6WJ7mAl0x?u)I(^pj`>>WF`tE+ z!|>jXQ1=+#XApL`qFkpbw~5ltw0kc4T{tk5`3iejKQk?i6QNEYJohSe2*rCzLK|(` zYdV{HbaOQ*kMUrI9$lW3KM2o}3O#3ITne=}xl-=0*R22hz0Bvl7n)?_Jq=;+o){Ox z2m{Iq9E0Zqg+US-@~e@qc!le!(pb^s^M7#+--qlVXM=P_4aR>~7>#>fp@Q%z z(ds$)4n{yp(xD9S1JX8d}^b37+0t{Vxv6fZ}zKC}6K0=e`2UV^+O{b~j6blRitL3xGV z)VKOH?Z3b{uJSJQmlWEy-upB&uAlr`{H`L@F6Q?mw9k40bzj}ZxX_u;_nSI*=KWb` zN!uEr=b&uh18d09PO)M7!*Z6Bnh3eN1)V^5-o&_$+6Nw^oYtXC*rm1Gn&o6QnJ*`a z`e+SsNBugNyP*EM^Y}d~?fJY{(o)-z3UuPSprtbfc599JMf%BM%6X381%;g_^E(f^ zk&IK?S?dnuYO69XxK^VQXw3_ZBdGc38tl16Y6}7op{&#E3`!|y`f5hAajGiX$9U;0@?V)ky_20_ zpXq2t$m=%#cq;W*(2lM=hnY;Y#`<8onsLCp#n#Y%C4PUz`21SPGcH~O`Q5s{q})>u zXn&JM#*{1ff%e~=fOVqh$r7-C;Cp2u@Zm)Da~-!7A*V5eR$`b%BDZiAjK)&9)C%I6^UBqd;%o{|sRORqcc zcl8G0JAOjFk&@(_%lmS@X?svVy?z?7x62=2pJIX0& z5Bs_-^kqHfZ>4>U@SK9M%d2rLmp2}AyY!ww{+nEvy5xkjy*4Dm&MrzHsMo9y>GoV# zx(r>+`UejIty^Qu_Rm?x@-2+F)x(tWKzsNvr{DgA>%RG5#&7T8!T4L|^=Ig3muHc# zVw~z8I*cc2USR`$<|jKszWF-FpEkd~h5VaMvG4YX9fWykez_a!)uTV|ErsUKPP6<^ zS(NW#oR0Bqeq|%ZmwCVq<`>?gUavByUsR=B>m#UV55*^Fryj%Z@w`-T)OxPjqz^n| z47+;xtfgHI^TBVP@gC*P53FN5T#Kf>MOA25^G(|D^UP_6#=vdBpw2q&2@!poB$p*BG zQ@b;0KgSdO;14?1@w*$2XE&OXZ**(=IOuom!1?9)xG&n<@yHr zmie!Cp#N>OW})A$3kIUT){mNhFrE9a^-somw9em4zT@4Y*E;DO`qkQJ9o9kX)qOEO zY$r^^IJDkciFUAFb|39+Ys2-#M&TR!-+Iz;_|?{1j>2x+2p^n3tbO<6ykNaA0PSTv z))DqtzxKqr#X5H&?VcfzbArvj_83Rj$qm$dir-nV9rKFvBN$)Ry7y1WwfS_L@)|d? zKEY|k@d%Gh$^V52SE5?`2Gv5E%Ea*r(6lbFyY!r_|zU{awj4$iHLq0IS z;t%EZgFV)tx=D>YK%Psj3(C7J;Jtw$aS-EV#Ggn12tpfh z-f{^sLtG1i#{{&ibMbV@7g$yy-T9SW1@(@^IB{OU_qGJi8aV&C%zKJ<5+97M?d0p+(}QwT(C)t0;xkG9=;KWDS~3C4%5o)OC1x*p;@w9CUdu$4KCcC-zK=ENH(MvQ8KB3;LXOSK8Lao+;aJygcDiu= z>yplVlOtT;CTL*X+YH!*^~h$a4&>P!%w>DI>7u=CdV6AC+E_khdn69TysDM{FmDC>^TGf3Aj5ne^Va*9?|4sN7~UV_QLrkU_dNXi)CNln+)pDIF6&@(aypnd$5iRTzOs=Zi&JBu`c&stRihcg6+clSz*k6u8$vv zqy2>;EtqeDC*!e>2sYT!o@#Zb&$-R}lwQVM{}L@Q-i1Q$`+@SS@LpFy`wy|6(!Qz!Iipe5r+2e#{obulnS3U&m#-OICwpwI^I;|A;tM*sNFNX2^-{yNQQ4}XVs zu-jkm1m>IHs}Sh*JB8<`g?>Yy;{A5NZ;P;Q`n|n?di(tjLHql6Vf=r;$8qRyfBAHb zLw|)$7{`9k<1o(s{*1%;_bW}o`-pz6e!YL&I;`h@w>o3|`D?CbTo%dwjKdseF89dMKOz_@YU$a@+$#k=Sy*Y|ip{crhBDDV1lC)&w%yD`=Q z*UvW)*Tb#jJ>1*5X0O1!bu&=J`tIs>eh2e4(LZh~xtIs8aaOeJYa-rbbA2@s@fchW z4s#-ZGuB7f)5EbJxt1(Ld%Lxth4Jp%?-T9)H7^?&qk}jyu4k06?z*+viT-enmmy!x z6s()BEA^Sa+KuvGmask<^HPC@m568LTJZ(%0lFsZAdZ0R_dn=A*MU|n_qYJ{bZrjD zJaL`X5q7(lMGPVexL+^mw2|XQ1LNF3WG&*z_>WSA9{=#yjHBcI9(MWuARK;|k z+wfQYJM$jYf6;vf=5Is2{ge4!0{_gh=zsri{m{Sup%1AqYZS(hze;!bXZ{vRSdaW| zW+7gLzn>!I<}O4(`zg6&eegB8j{fnrIt@R;S1Ahfz~^NH=7-N|8SE=QM?Rpu&%+7m zf1h1T5huy#ip^f472criBfR0Nlfc70`0*5vw z0=>84y{6bWf65zWi8x5HzEKB254he4I^Zkq^nJ05cIILKi|yvacIh_a9rfKq9D~>% zC$9q4Eh>R(n?)CT!cZZf>j)kA5bIy4sWslC4|TbMxI>}cg^crM`4({$LY2+2FNA9K z=n3rj8u3U%<+8C3hDz+iI1g11A)ibU#$~9~BfLKx()1MX$Az|EcY)~}PLck@IA}6Q zF#bc^1u!0%)I-XZd{xDCOZ4yGZ4>Pr+U6wopHTUJc;7x$`jHLM1@j=}TQlQ+sdr7G zoEeBC8uEK#tG*({oeGt`gmw-2DZqLc(){&4>z8fBa{i2$CiSE{_2)DGTDy+$%R?IW zu^l9yy=S=+#6<};*@*cU+CdV2erUG{?2DlWs)O0CQ*d4j)u107d+aFeiCuma?`_7e zh~_xkRg5^4vB`OegAqIY<`Cu^BmPco{9MG%joqAwxHqv${Se10=Id0nf6SUDv|CK% zt#zXO==-l=M~sy2ZP1?@@m_w+a_+}5MGGmftqtaLtWt(D=cl(eaHIp)qnIDp8HecR ze#G&Kt)GDR|6=d7Ag;_XiFQ3f-+kCagu~=lAg)yG#zAP`*sb%i4#wuYjX?TzbyL>k zC-#NdrYig{7Wt z9B4fW{EiiKn)_+Y6g_3&s2ccJF{1~=Pl_4-0`U~m3KFrdrEM6G_p{UHhQe=2eUl@4 zuuqseWD?>Lr1~uC33{*`{F~H}JjCryz4XNt`BzRhiSpB2_26Hpp0a|SsXxu|9%)+t zzKE-p)@2pmM^BTq%Z9wh(>R}{wUI=;tu(odh$E8LKJqT)$(dqZPm_DK7qrC7U(An2 zT(8uYX^5|q+Ta`qc|YwChbOIVA1|cW-LHmyO6TkzpVXw0)ZXSGxi5&s_}| zAIQ}xfw))!>%6N;C!C92WA@V@y4^^B>DVFq6^AC!&-pVO z#>z?bR_1NcJKb%24EZ3)wSXW&aeWzd8{D%I_+)BuI)7px-d#-i2N`bMC z^vC2Fx4z$>)B2#-EXTNUZP*CE!gUqnE4$_=qTO9rKgRm+I?I^y&(FlU-8Ceaa*GxV zfx92#TNyzaRkgUVX~z>qNelezfyIq8#f{g8KSKJJ4Tobw?aY zzo8Xa7kn#~Q9s{a6X1vV+6_W``%WJWzr#1PZ7ML~7yM*j|9IXzWT?O|^HrTjJ~JQa z^L77?`uq00fpeJ8JF^JpcS9T_Um0EWk8kHiygx9QPrJqmc&{<;4evXaYNEe=XFPmP z{TB4E4!U5S^bP0(Khx)$Kl;t5WC_~Gr;yJf_&hJby5)1T0OQN&*Lds?K93AAu6zo% z!Y}uEUj#qV=k$~=l=ln%wa*z-FVa!HSZ+N0Ri77!>4z;`jpqS;GQ;6_`m8IVzcsZC z?d7vrErEP$l#{v;ez{MS7S_p#+4VS=M9eylb6do&h1jPermn@h5OE?G_C#E$#r_b{ zHW2+5A)$|bf9U7ySeGIsr=dS0Tr`PV*AN#XqVr+Wjtc0H2-~Ufiy{UpBJOlV+;#ZP zk$!yNJyLce_RUD`KWLvw_a=8_wRZ`2_D z6z7Y`5qsbtMvn7AoW#iQSFs;QO&X2W6rY z5g)!HzEH#;ADmMH|Jt#f*b)z1Wp zd@vqu#Pr$dmnh*ftcy|RdGHsboXar|qB<=`KSqAIiTJls4zh?}7ByUz_J=JvLHg`v z@~?v593|I)^G@U|_4Cx5fOBAE&0x&;D7V+}qa%xA5FaSYDhT&EQIeO@j*-tbDNp~_ zdfN33>rv$IpIAR5uk6J-7iH?q_BL6C{Uljg0r%U^tbm1LEqtdee`2Zd(gA;;jfN9`W@%N z(W^gTpBcSR3HMr~^9LiY-{_0mwg4YJ!+qN5Q@=4zM^|nQgFR-Eh@(G7W6eX*2GWRo zImXBsar?$}8HIKlW2S_2<`~Vsh`TgK=Lr1CG1li1S9wg&kJFLfOY$brzY)K2O!ptkEcY0G=@|Q%r@-D1da`_WCgn}UI2hC0ViM5uJobq(Jv=eb#|-F% zxTIrj{mue=nm#1IG0uzeg0rF*cZKntMnGSDOgH$W@sS#Z#OaV1zeox3%;Fc@V?B>w zqm1~P@rk#hfNR=g{f*C_=ns0zJj{c54Q2Sz@ne6$e~Hieg}9yZ+g0#{v;U^EjweK46`ef`oaVFidUd1VHLHxAgcley{@O8JY ziumHX+(o>z;mwUWw-5jR8t1;a4&Qep{f@B=aGw$4f(@^Dg7ew%cvu_#m}aP?Ar#@!Bd>rF&%cMom#XL>E1m? z0~fgCUMVfINec9XWSlF~q#tjl94GAKX*V;|kbW}o1#tTWjGwgWu^m8Px;O;-UzTCL zNUQ6ExNqqlwqg9I9SB1Eq&a=J2mjImv%tSebtLHA*Ep}HtxVqqdS&lhz%90{&*t5j z4{4hcG5*swn($ncv-C6QO-CXiZ-wrnghLu-+E`>ON z33=1AK`%Uq_>u|3j_(C#t6^PAIN;B9_SZM;cL^Ud;cq7dYE*+xS%&zZ36nbX1)eb6 z0Zea)`=0m@qj5iyu*=a5xXGLPpPV}edgmbQ(+NBH9fO1&Iru#@VZmIip9yJQaBrD# z{>mrXABA&m!Zj24TM5@gaX*)E{~_Z4rOR!$67^HMa3Rjk>0Qr)KiydOE%P0uME#l` z_YLR%w4dFNVxBeop9B5t!F|lXmV9@}QJ;!#2@$mR3_gnC&o>>vr`RjO+9^+ZUmHX)XMmv_?S??Qgz| z`SZ1;NneB&O_wnr%Ph8ot{x9RBTXuW+FIm&-9x~q& zaqzM>)C5A#=E=vww_y_Yy{v_yh_{)wyd&Z~X3c#7eCa67@uv;r=-*HhFul2uHr?iuB>iPhfBCEyS72idL$iy!QH_!-pdda@Gh> z>>F9bqPebxU0s9pn8X;M@7w^&(dz^|LOoW29;Sl$#aUa%%>f;-UmAKtBznLOf78L> zk1Sq`^zil@K!=5>LEq$tPbjylH{vj6CB+Uw{*2`|qWsKVN1;D+f|TgRD`940Lo?Ec zY)0JI%nTFqE!Eo&de~~5dorg7;r=jlx#@W1FPeb(nVIq0k-&u12;jIe7&nHO zaM^uF;P_csmok&4!B5G|RO*WKtYK{-XTgMZD8FX23Fw^tUT#ItV6P&B)zZLRyig4batJ8A;XoX9KBK>o|9m2iEoNL9R4_rOl z?jNWatM1^Tq}W7zTGL>%z&0>t5*vm#mvxTa)LzfyL?oNN&a2EyN3>3e54=m3-N zHGgrH@=Ekqj^uH~2VGS%Z3ggr+5r*Ys<(F$UvpKVU>Eo+mEx2|SeGRVO!!x>qT^wa zzJtv#fO)s!r>!U)_9Q@r-|8zwNbZVoHH`Na?fE^5<jdb&jm7;RX&Gzae-^K&$(sG+_#>lstyA}CX!>vVjEVoQv ziG1s|FRVluy1NtVeYfru>e0SOvZ&rGf6wm&%s+lRRfJbZ?H1uGMTsq-&u_+k#>)J* zSm##mdmkv0zw*#f(F?4?l_h5pmwe^q0G;22xa138ZZ{C&qHZmtP;R60TT#6h3GRsk ze+U?By$Ao(4x$5X#Yiq*|^tRG&2qU)S{&6 zZD8lxi!(*^66IHoBK=G1!p%f-mbP`lykByEBKCzP-#X#kv!u2dam$yKH6BL(KN3+AO82c^N;U~`hDGn z0bNDoXWi)wq6>TBy0hcD&j7u(0DKp>i2@)9*Bva$k3o9+MDU#&-395FQf)=!Xx&La z6=kH4gTKG-OxR=5xLBv|{!BD(R)1fmAu6}VVV))A7`OEn*|*Lxx2q_BoqjChxUMrj zh4x<8{n!i0Q!bbaJ3H)MB&y#!O{Hzf@8q@#v_@JlplSz6l-Ilw0DDxwBEIW7)w}Ul zuww_#N$XU*T!Vd@*R_~Fx*hZzoxBe@x_YUoU%QBlNSC>TbMZQvUg^k}Gmn5>vWwvF zt&>bcJo$Cf>Z(YW8nO=MnX+VXyvJ9q2WCo&vt^TaKXJdrZy~@$YT5;VFH{u3K)B0hQOySt z+HGwsYPVgzt_(-MzB0C@dJSvj2b9*<@3nIc@qnFJPDuMp8YLgw`mwcC!cRRyAY?Ko|VagaAdx|1k9FV63t zsC-_$w&($NVP1@F2J&OxtK=fxP83N}n77RQmgr*kf5jQSS0lR4l@Q#H>kEA3{~ma4 zMMq*|F7WylQ(_m!!MnaqpZH=v5#bpB;^PY7jh@#@hiVWbdlBtEGrz}i(vPZ04;nyJ zO{U&53+AtQNfdcyBK)?P_>pnf9yNR?ZPRL}6yttg-@KXfx+Rb{ODFcLBc5#K-^qI2 zNMzib>$6+y7kZxE$={*_O3lV-Xs7D71LKwq1~0N z_jL)SR=bpePx?__erFw`cOkKj9x*M4xQ6|eKRgKdtnLf&;Rot{*!YL}?!$==On>Ce z_IWg%aqb>__Gp#Us;8|Q@cF`P7xOini1v(MnE#CJ z{Y=4-?h*$j1q#PXN`|T zA$YTF9Mk);zlwZVz9@@&OTP^OU*ViM(1jIvj!016j^n%N&}?AwxFbZpiIjgU1m%i_ z)L&}51X!|&^(y^Dy4auNvgm_8X*0%;EM3XCs)ajMm>$WvyQS-fGCle*?MY?a)*|mY zL<7#ZQvW#CFOl&n3;WnG9bpIlreAE0AH0g=s_;DLcS*e$^JN&<_H`5E3YW>9q`b47 zf5m~jSZ?3;R=YSJ-pGC;TC!fHQx#C|^^Yj_pZjfK!8eY_f~*U~i-?yfc>2C|{Dd;z z@w3zGm|x(*{A-f5y9fK{*;=l5&%Q8zZoxA*^5rlNZ^4FOVvj9M@56q4mdJJLl_JOO z(*aC>D#`f8Pye*q7rvBO#<-wQM{!+xI)-t%o^^T6c4&=*{B)%v@fOFyvqiM`nE~hh zGj+E2vyF^r{4{G8(SY;y8Nx6Br9X2Weq+b@n@>k@+!Z{0OgNC9wRgJp1wgF_h8)CvMc9-<r@1ba%Ts^3IoI{l=ZG^RczZ+$EIEFPa>`@L_hS^x--)EWzA?nfhnXM3 zaaF#D>(N^+b>PSH0hhpJ%xac{3<4o_gBQzS?31%6Za}a-xhuS7){*-=9+~m(F##=Fv9h zTUC-j^*Hr*=eVtLq5ZWsjH_DXrrRoKC(~=yS-)5HC|76Bab3GS6X{>|@MIp1r_s;N)!6zvE*L43=8 zue@^{_%4j?TbYaafP#wi9MA90Q(nb)uD9=fC5Vav%vWLD?|0YEkj~(`@m@Iw_~GdS zmM`FZtlTz)`Pz#qXF13ByF)8U_wu7WFZyL4MsZz#pTY6?ZXetI-3jhnm5E%}KTLbh z^pGD!ch0lQ@$@_1O<_FvcYEnSyvyP`|E~RZ@O@C|MLX|uU3k~K8&Q{W`rg}QfWN9U z{n3g`TxZ_hp1}Mjck-{&VtV5qrcdCy@y>S#@gUdvca@XLA5%d)>$qRnE^Qs(X5-k; z{id>CFEHLBwrHksSE1Q{@qm#tj(Cn{1wVfKR1!-E>oB;%lP4S z3%SnMydhm{YDK=_UMz>75k&Lx8SQC}J72q;`(d5$TBa}MJgC)q!17TeS^m`q+Wjn^ z>C=0Y-guJv8M~S8b%m(Pc-Xba$J5Sf^z-Uv{75S;1J)<1!rq#q&Xjk8>s0M3Bhs(B z(XQEztfzi9?cFXUA3hT!S{LF;+cU0son8kK3MCTJu0jb_&c~J}Khg(8KimAp_+P{e z9b$mlfh;#|pFZ$7<4s5oInMOF;l#*ymx1{uET>#gxl0~Hp5(U%@>z9f{{B7FDbKI9emh(JA#eI?1*`epih>0CwFS57 z*B6|Tp?#iQ*Iv%2Us6!GoA~N?Ydf|2k1s-7?dG~vkk)F?bH+I@D59TN&>GjYKoCHD zxtw}Bvfi(TP6d{_(BCLpa~5<_X?I}Z1jel|@@2itl-OT|4P4)gr0H)IW%B%0_?CP{ zed*tq-J)My_-hn#GSBNp=h!Y~OXzPGB24bz^q%z73ybl7zo6Kh>uga3_uI0B%doTX zSxi62^Yptl z{9Z-n4YpHd4dP7*-W&2fQ<=_j_^$dO`C8f#AG7`6OJvgCxqVr#J^4O#?MlAP*6)BQ zy&+xD5%_LZKIIo#lYcb*=Xdw{J%`Gx9PjVv^W60D6!pG48NmAV;df5ny>THP*&%)(q^ySDn<+bbjM!L0Ii4p-yU7CIwiJ=Sp8I^+5w0`k z61;~i`_q+lN^5>2&sk+SZvIX0%kK}BjdP})qa&H#mgl63wY)$2)IAOO`61#K2|haU zKH%fiNuaBG>?Pk1j;D`V^bbEGJkQ^9GCoXq|_UkGHtae?CD!`qL%u zLm!uXARZ`btrz#1PuF=){Ji8Y(^F{2M`f-jA6BwIKW4~MUi>en+i?7U?9K0peD2CP z-ycJkFg=Xtt&gP_si%t_`JVE;@bT+gV6`gG)1RKa2Y%^<_*;S>#kH43*!Yg;#l}pb z5b5VRZhj=RL;kP+8etQ`Yb2SbPUS@H>H(%0@^kcujfxjpCIfVOdp6kbTp4Wcvp2_+@puh2FFyeL!8ZIn?-iGP)cN=th zpIG1HF7m%kI*9bTXnmwNT;lyw!wgg8*Vpjg=UaQ8pTFt#p`1xeiFUjvYS`dId8Zar zubLwA>)&ucY>4E3Q?FJ-xtp6>v5|6&r;r}WeZD^KI_V*j#KH7;zG<|j{7)84H~3Du zR@}Gh%Pm;n8aL*LT_OrNo*SO<{-S=nF4LuLNw3zR{oVG^9>wQumlyg>zcP*K1Fy0i z!ms_sZJ(+Cek18q{2ti1w&%!q<{kB(6Fv6u*Y90kE^26@#L;V|zmj$v z;41lKIR08n%9yX~NqJfH7n^OfklvKUdDJ3kwa4ly?HLh9wDo5G>;lS7vLIgu_`kdxpzS_Q|TkL3$Npddg|={3J6O>!DC~8v8-k)q;HKi~}kA^Cj9zZf0lZCk zWw*J2mg!zey(8e~2xTraE~1<}3-iDJI;JnFsQ4dvvz{i2+h-n4TQ<0r}vAK6+@ zDaes^R44!JGnAV+jroo6Uxo7JEGO6N2jvV}NIB()Skg1_}KC12k{mRsS^ z_Hu5GuOH7i{4%$XkY8>l?Rd0}<#ODpf6^ooEht?@|D*UG@7GH@@ZP9gk^WP06aCw= zGVV7eM!erH?ZDq3N`ewu{x$vn@-+HUrH)a|59aR@C9}EDm21=QDD6&vsKkfg2`mZZ zI#lj=nECs7-&OLOzay0VraxR#&2#Eo5BmS5V|ZUxs#ga3ZPs+^m83sV5`3CCi1$h* z>0EEiE$C;JeBpVmgZ|u>t@FCA9-(H8%q6kyIb$~p10nUp9qA!dY3IoufI=! zsqPo$*Kgx}d&Bpm%zw;r-_W0aZ-ae0uzm&GzyA9o@HIH9l3!~s>GTHbsp0viUWfjB z{b%}1bxxdz4R*Z0sXczCwOt0W{sZ=q?;g*UwJWER_M+cXbD!tQTDASGw|=Ytlg|6` z+K^{VHD9k@4y-vg2X=iu!t+n{E&k5>wFk%9 z*HF&iT3gDBLepHe++9rM?mCJx(6T*mwGT3f^$6;wau@2X#x zjAy<+e+RF5$NGIq<-Ke50{X+%X99_bY*-I9p69AdJ`itmoveAu-?P4U=}kG0c#f(m z=68a=9^iWYHIH(?_Tc&AD?SVHSI!6e1wYi6pxvo7=ee}enEvYz zEf4U2Prd>CF@S#K_c6ao%ky0Ez1{@nzMp@=a=*BaHyZN({QGF$uQzU?f7@t8f2eU{ z9rLA6vz)2}%6*p~K{}ZBep|`=l<(6Y($4I+)O(Zd{6jyHas|U_e@FJm_f0&fH{R#( z$lo1#Zuzl^=gdY&UE0w*hj{5R%e73VymX!yesqeZJ*jt@|BmCK@f_E=AEW7~e!tk2 zd=ohyzklKHpg(1}o;Dujy8PoA+C|u|w;{0YhPS06Y*Q_IJozu(#P0;PUCj9BZNDF3 zy4Oz7?a~ZExASgf{x8PeZhMRIRof|yqFf#9d&0Jn*e`|c+*XtSWov#$B=oeapug4j zNh$SQxCoR=2|>D4M|1Kwo`8HQ9~H`}n?!tckM)_A#`5!1X8^P4x3>M*8Rgo}ETrwj>{&0{*Ksmu?XqStFRvk zB{CvFw>;$U6cT=2V28xUo5a`ZuwODX5h$_t0ql}&&+jQo%svEKBJ3yA^;KD}8}GZD zYiClA8-I6fs_#gATunQU4=4WQ?`%z3JYO}P>caG~JDI-Nk@cEzp7q*QMm#c~{LNgC znrbMo>DNc5-$1_#n%CE$-6gC>vK|)EY_~#p+Bf?%^OrLIx}>Qa>#@n6=_gE>?y#Ty zc3!Oaz^ml*OJ_S4!p{}T{KP$}P}<@g%C$Gf`YM!O$Z;#(5$8&w)DGOE2&E00m>!1T zt%XvT82?!MOd#x)S`a}z&fi_6E*5}aYR?|XY1d#ud1eQwXJjr=D#{viq)xq|p5S1} zmri87e(9$wkS9HS4CJ?Ow}Qe{J1VgS!gDgliFBJ5~7`!MLTC(QrAc*rUz4 zgNeT!AXg}?+Z~H(#J^qf^a*XG~W`k#>!}xnq(>MA{E$jJw zPqRON?{0a?^J;Uap_DUw4cbkjGuP3UPV~cCqUrB9_oM&X5`7r$Dbcf>_UN?g%cXzc z)W~y5^Np7*uYQ>IF6DiD^Y%wf$7iYj(or{ApOri>wm8nEzAYxL_1{YSMn|^lA3%QZ za;BfpBcJ5OXE^I|(~t7i z_&r)FU7WLp?W)$3R@=>bBxMmjUCDp=2;@j7R(NC!w?^?k$BKdwGEF=%S?z463pM=E&6m`#;PE8n>=%C3UHw2b^YljzR#? z^DFb$^7|bsHIn&A_ZWeG?Woq9@^9Zqen$iR4lPtU{T=x#YYL%P<$fpf*>k;DxgJgX z1UOd-I}W`<`6u}tgi0vr9 zXsyfo?1-VAbGyJEm7gZaS6RK5diL|Xavde7&|clAEbP5!P*YJGt}R`<6sbZ)RHTC_ z2mwM-uuui16A*PhwQto_{g1=_l`VYr~Dk@{{zUMi!>ZTwlOR|V%iw$2)+JvZ^ULC;QC zH447W+$oc;-M}#dYXWqDx4Ncc)XSM<-Bik%&oK{)uD7ZBf`=01PaIacNS*Rzk1~l> zQTzFlG~{LTqHUIrEG0f2xW6ldL!8%=D|43pL6Ma^^CDPsPX zT*fWT)EJ(kj2+_84UOX}U=q3HLao<~AazTcb9kl(Sp;q3*fX;ombs;}kBEYgQGvI{ z3z5>#35r+9r2!ufM}eP?I?^6b-^m3GVFIL*_xnQ`VWmae7v@X6Jo)-VG36qC7fzg* zgsn1Bt0y9O4__I_)CGIvOf#ZaD#c7X_igB>E(Uc0*;`vb+y$4GEDK)H4+ylG+UCsL&awItuw|x=6FB`ke zsLyz*gR_t`p!NQ_w~=ToMPkKR<>D6Z4|~#_B5a7IIWel~8RPU~5#z#hvz6R7P~=Dm z!qAZA(vB!yT#C=Q*`N^QURGS+Cbaue)DZhGg5mmXINP?O+BNY+}Q+P5j9kFWL zH|A}7js70vFj`cr&4p~`6HRii;M4&LCHc%**MBYB(kv}-)Dr+OJ}I9xW-RJ%(4{_= zo5D(8H;6*zKrf7i#vGPlDwBeyaXHyEW4ZT3d#*IcP@LTlAc1@R;mFBPIZ!HO+nBsD z*F?D1xku5{Zsg9u7?0fFHmr7|4Zcd~)z-IgLbR)6>mEAut ze4EpkUa*SUy7`6>Gvhm5NBG+Fpc6cS0jco{Tzb?MSK&~wt)g~mOQW}S77!7+5tseZ zj_sL}*x>3T*}C-5J;*R~ty9a0IWq_;@nH+(Fq4*@XN?jq-^ zhPi(i5ipNNi2OqDi^o^@(D;Egd?4$DJ>T5Hi>Qf@wH#Rf6|q8FdT3&GjDzvGopQ6Z zlftf};`vNF_e(VSM9lN*P4p<$@)PxZ7Z-0zRcaB$VJ%GpA=yE}M3)S(@Y=vfPX$zy zDHqwdaWL&@Q2&c42T{={6uPfV#2ps(zj$Ji#FRKM?}jVV=d_B_{-_*s!WT4kJW8?;ODlO8&~HB|o11;fCRe;h8iN(K`UviHsdVA6JD79%cC- z*ruBt?f|km|F)Oi3B7#AE6kzY{eD4aSOb31JbZ&bps53SMkL7?UnMVPJl`K$YI?bGCTUtCPX|ly@}_2ZI*fimIF!t`2~XS^A}w3Em$5E7 zZ-yO}9}y=W_jbCPJPu`Q`-}pW*baindn-dju1|yF0E~RUs%bX)D`??IAuhl5^>e9h zqIi!lhGpQqwECd3+atu=tHZVNSE;7X3x|#II}j=B zjl4_ee4%Gu6%V>?NOd1}YhMnB6}&h6fQ$V6nkFbe0QU z66zZvP1TvD4h3gR7ie{Dh{-_Gi3J|2i27>6&%99MW1z+7EVLWuT)Of}b6umzBaas? zh0#-$e`PE+0|AUgJXWJQ2G@u49%1bnOFFxs-PYZ~evwzHUoZd+P@paLv0<6vgD9MAWn) z_0}gu`<*f+{{HljlHZYM`?3L5U3qhQkLmqsN+p1MHknut^WDXiKOu_OGhQ$|ATA@x zg&3M`8;*)4jvY5h#5klG`I>t}YP@3Ur`S5+r9oKNWA{qfC35BkD8Lv|&$sb4!MQD$ zt^tt<9M^5%YK86AOzOb4gM_q08OMLA4Z4&f1D_ud7u4oj5vV(c7it%)0r;Rb{PmKt zrC$PIHT~3&_G$?!22?0KT=vGyqCMSC`?0(UG6IS-m`g{3r`#XLklQ_MnF7PIOjbNK zvf({Mp~BX?GdNex<3YVIqyWx?9kw8e?#-?mqkiR|zw-=XU<;!nto852<`J*v%CU2d zQdqhlC{P!4zJX1C8pTXoVUy!vyDfAgrcr>T`~CaXOX5LWU`d@E;z{XZM>c5ylIJ_Y zu%maFAOMI(RycGD1b&F}b3aQ#{!sLQaj#AOoZu(BzH9o3y&ppAu5&a~+|2r` zVe?awq=Q)aw5&1;EVb{%s0g(sQT{DLR#k2zk_ZBn&tA2hhwzpf;Oc+YIm zF8pp7jtWI_zR(o>I{715`NP<8w5jd&&6r6OjpoF^sYMgMmLF)k^ccxjW9p39JCFb3 zOp-IhOpS3|UX^ftOXCoU1)S664I6bGkoAWHAd-)rRMb_TM6)pcFZ?z+7bqqm!8d0g zgZ%hXdfmD}aOC8pu7G@YI|39+EoY z3;g}&C_9M65%)tDH194sgn4OYyOTm`47MBahxkk(@U2Wc*(?bS$bSSwf}JmT3en+Y zK)8bw8)*P)B~C?s=e%-WhW4ulEC?HK2=2^1{WLJiSzYj$BERK6xO4NQwEX1px4CJV z1FLpwG2k?Q{JcmccZ&`l5{3Lnc|D9b{}luai-#@)2-TaF9p|1ki7vfz$HK~Ko<){P zelID1rH1od%?B^-_~!erL0U!!A(5iTn8|I4<7Wf`i_QAOkEs*kXHS~*@xqz!#D z;+xlf!Lv~l{wkMn-*Jxe&t4raa|d=(gk@fNOTkRKJiK+j*$)MtzZML@v%c8d!@#OH zl-o#+baZyw6V*o;N$LUmoK$h`Bre1+Uc>#yzl+fEmGCfTlv3}NwZTosB5AG#8T7&h z+nLC-Ps(9ZxkXCs8(z;_;zX23mbiRpHnrAYtbXto;8czqYtMkG?>aUGDgE*_WLX!uxK|4HYSKv9FpAJRKM2qvdwpxCTtyq=JqM<`z15i(MsahF?d`Oa zMMpWKNp$&%YEmzS^zG3u;}$0+z8o$cTjv$t|qX_uG(4KCzQ7YOID z#v~8g>-A(@&>mnYXknReZNepseW20sRCVF&duZmbT{8i=GV5FM^CHb>VDUZw(84&V z--m0=9fdmiMYN?EmkvS~8dnb?EU=(yuHT*3$xN zET{zF0*kl4vrX;0oeRjSh21QcycYg0rv#1PfOn`4#F)+dB?(uS9nBKhDwg+IjI>}t zhS`qHdv1~oNJ)5)+zn`yZN}6!GdZ)>voWZ?iB(ESjuKxi%}ldY$N*$h$Cp zGn8v9aXM;J3voLoEJ5;0{kIkcUvC{I|0UM3;t20+*{R|%R7}MiJ^}KkLP^$)wi2?Qf{D|IMKc;FU2?C+C>TtG!?F0jL2TYm7~WB z^&|GiDlT=H;5*v#<>2jW@bO8d{M-w zq)USHHu6t4`k#04?67_paVtGY!(lu?ol~-z)yt(D9OpL*HtdR)*p}$vX>9pp)bXjF zlgtW)MI5wAdM3yjy{!X;eblf8)Zd471TLn8wyx}a;0SlGWb6Eax!S?^^+Bh~oIYN; zCyZ{guFf~bo<$+jq|wITgP|Qx1~{1VBE(iKL2V!{<iSI!7nzGn2pQEsj3+TB%pOzxeKbp^t9aB*)pc)7{-KC64(y^dD#Gusfrk;0X z1kAChb*MlmtOGmoAlypD*ZU-9vACsXE_hAyySAmu(ih&V;}ObaKAf9;k}#xJOLY}h zwGF^Ewl(xGpQ#Xjp_>>NmNmwB)}}NfWd6msW9~(V{6QW~J)OV}J{`l>HuOiJ-e7x} zwl0k$BN)gA5FD3FkBQYuP8bWKei6(;gs&WEy=nqs*N;?_BqrUY~s+O2e^Lr^8 zPKfheYg=VHG)mQdNq6<1&`kd^p7tbv?mESO-T7|LX`ONct>(O9KKeUGA&d%>|FM8x(z=bglXbIctn>Rd#9o6vub8YX60*fJ#n>wkBqvT?xT4*3dhv-qK6 zJmjlrODl?zF{yY*1Zz=#0>+KL%XILJvnWIWsmuIX3eI947K;`Cl#BFcHNw0*o78Rg zzC=}?N1s`)Y7B^9^y#2O=}a7gXCU3|-Q(Py!Rp?Wt03eApu7&k``>J_Ed`RY<5){@cN>4F)=P(yNAE^#M0<%;l_72I66&&0rq1 z&WIP=x5ab z1^TyuTeAyKqX1K%-D<%3uBN^reA6e9OQc5|C~x4B+6aC6bq4@D0)J^uleF-G=%3p)5XUxg(U=qw2AI3d)20F9kJ zE2ipzrT}axt9U=b)4N|muP|0gbGiIHTsg{{IPUK`$yHD7=uZy5ho=NS+Liw3#2{Po zP#*Ci$zQG(`F3yT?V%8`;idFc;$|`(_^hnFM~OH=RZKTK5UI{xOKcb)xG$I*wWKV` zr}Z~as(6q$Jnm-20b6%H7tf17TxTyW&IRAt%nRM~ab%gz0MXfc%LLJQn8-1j5SpEM zCtAI!e7Bi;2wiBQC12**tYcMm9e)8G7(NZ4v1=5DJ~G($el`IyZ0sIn8?K{?sFm&( z<~5`4(XIMbfcBil_vEEHkCU<}*)IePZ|@sO;uju+wQyx$>}YR-V*C1=t{ATwLf zCY@}i%eeJZ711k?f3gYZolz^F4aQr>JdI5T0LLV5CFd_k z-N{a&9aQI>m(>^BTIc;5`IvVao$mYox|4x|ZFz7A zOfkR%BNsk@45~GK_I7TwbpHi!slbn0dW!E%ll~hHPzMim-~Zp|&YKUZ4@hGFN4Nim zBp4Sluy?TJ`~Nw@f10TEC2#*9gFIr}&z1jw48uu<6qtq!Tj=QgCk<-7KGT0vA_1a{ z{*%`kh@SctCh^~~E4Q!yH_)9h`)~iaRm3UgKUo}7c}4ykz%GXV=dRYMmq>Gz!vADL zfq#toZ@{T-{J&?QE+BaR=PC?P%>pj{HxS#F{9iL1fQgX*W&nG~@xN2i_|K9Z!Wb!- zd!@H)cV3VXbico!!7fu!uhRsmiPTW&yF_k+Ov2B~F#PFbw}> z7N2)DH<_UM54?Q{Y^&?!9vs9w3S)m+0c2h{50!1`oJ|hE`IaG6=#cU!rB_-&qp8l+ z&WLA*ok61btbv%H7Sq{o-I@5x=se%AiOo}V|Dq0S@n%ERGj^;UV(6qT#Q-Oy-@bl% z`&~TCk;ZLT%IV`x9N>Z4v($S!?{^r^nTEUJ4tR093VGGX-HNnRYxl;aI`7#_%jcWG z*CjXO$X9PRE+dWHe<;iKK*Tz3$*)O`NKQ~#%AI=Juk#%IR;Z0oWl2AQnv_)OtmY5el-ED>}^IT`m{Z4|MS8p7?FMCaP-_kNW z66|tl8{u)=nt3sm!IKLQe|OSNpKbi4Y+1zT_Hu|c-esk7sWoG!g~WNhfoodoH2iK~ z0Qx$2ITv%BMphnhN#h zVt^yC+@X_Sx0_M<*yP42+ z9YsvtY9g*Dp1O~Cr##Q=&^5%~k)G-g!Qo6b$ZCVV`r#wQ^K`0@ghOo{W5d3U>#*?8 zkUt9RS9g30nAj_tOuEH-=|XpfhI0{RTqLaj_@}KH`W?XnFxI6+29%Am>yp70h9+0f zP&;$+p74fn98;!ndBV|G*EY-@FWdWFNLAxqsW!PgNfVA;&nJrr7hS(?9q~=+Razoi z?8}aye3IW{!U{+zb;)koESD&7$!1~O5@J&mMCeqYVuFz3@ zcXcKNwFx~U{+UX2s7R9+C&9x2P#N!zr+KbsGynQSx$q}=Z@M8IFY1%YkqaAE03^ep z?8Ed}sPh`^NOB5(PD;-Y(T^YBOPBxi8q|<%52~n^y$VBYeE+1rtGYc-a!*Z&_-N&m zd)@DZu|j?&k@G5EOLW}Ab;wEQEbWdBFaGi(60-<6uv+5GyGvi zr*XL^&;kSL0ka|p+Tlm@=B6u~y=D6JjnH?YnXYCAl&!}zTdz}3!`N=X4t_l?*1q7k zVw)|T)$hNuQj0}DB-cGK06gsrn0~lz5t{t^jfv^0nu$Bt9Nmu}T_qMJn_|O~E9eA* ze5{@c%T12e+=b;OJxMTi{B|88D@@ig~kwUlM3Qg}!7Gn6%- zkk@Wb6%8RJF?lQ-LswjgC#|&R!MKFeDvyluOssjl^#g0q8#|ryGFx@uPbZC>LNnM$ zKshCpLy^3dvp0nP@kaPp1q3B!@M>|Hm6Iglcfr<2K3PK4uj*`Cn>&n+psml!{L?%@?_21Ef>dBPv9rx>v(dQ!PJeYH5c`!2z%j;cN3KiCQwQcit| zPYfA_t6aF%kxPUxX*K7VD2GYn2L?=`xL=CJkid@x?-?hKX0;8#x*#2j>Gh3*e`oJ) z+y_ti#~+UWJIi1-6IVO`em?BG7Al1c5#JH7{z*+bw$Mx`ep!kgG01V#Ra+HWAF-xf zFT80Sh6soY$M3j%<>afTNw***_A-{+atM5UUo;WVn>vk{(eS&88)KcxqhjzJ2o9gG#^$BswgP7z~90- z=HEWZ_~E$9!arZ)h}XQleUFb+_*pNyetK4XqV(Jo=m?kxi`2v#id&9_NvwMWIK!%7 z-`+$Bv24&3qZk!n(}u&fg$bcSYSu;UZQgv1_P%};UXPz2p6(xXJ+y%5{31oUTGe+? zJGR7Th-_SW978f1EO5wiS@iKrjsB4-?x&HDCG-;>o#?7!kt&~jU-RzGm{1+zrSXAK)@`5bZ?cthxX_|Ffl*6UU zvVEI=qbj7$kV*jig0WN-vE4kD75~jAPTf5(thl_;;>%Kv=K5k=YVebvM~lzi+z0$~ zNztz&GdB0XRKwy=Kay0xW!C$poVYKD6ej zxtvgRUTLx=JN+wLJJlL=TKQqzDdI@pfpVhqr$=Gm!b7RlQu7J$LN1gw^!Lr{UkY3q zj){YPK6jrya4t@aJUaJ&u>1U0!o>dTW{BpLQk#6$jkq)_UUnEM^+0vaW}`Oj&5?&u z>|L#L$@@9l&1O2&Ec360Hp)_s8OGpGLd5IReDiK#$G$m)x?JAS54@SO({prak&8T5 z!ZTIeUVb6HW6QoE5?FY0n$awe;YX`o=?kyy&*Ztyi1rc)At{@aD{kub;S&4||trH7&}(Hc~YXB9}O`0fr%MG~f5W$w%3QnNs^8HG`p`P4N5jPF1s8 zTW+C}_^!$B*lMQR5l&%-tNq>0YxlRUS5J>e5wAvhTlsOXb^6IUk`VF-+g+|ND|0N8 zkRp!7jeUk}Am9O!HP#gREk6xAdmkpaU&KiS+9m1%JwJJTzu^2=h4uH%tVTqow+^vt zvA_YAz10N6N%eAkMLo&Ygm4ayThuA-k{7h=W1V<+>;Ll7MC{TbGkk+lq<{)=v5P}u z_*WB^6p4J+Q9x@EAqk*_7%@AjhJS>zv)9=OjcjjK|JHktDbCSUfYEH6`vHG~oa?ne z{jz!hAvPMG82Wnd~8XL^<>g(82NT4XG|D{}W`xB@?5j6(4jr?Vk1$|L93rh9u-zZFH@Us5=R@D;?*mx9wF| zcr{kqo#{3l(UF6-fn{$fi|T>`3S07bGGdDn>@tImcGvVBuUPuB-|zmNdPMHgGoD#o zz<=OufDCv!#En+|q-M_2o#Z+NyO6_WAvE~=DrAj(~MPjNy=`#meqC4LbEJcjeQc3P-U3zZM z_TT!sWT{+0eZZC;4)^H(<$4GbpzEkD$3=d7B*NZNlZ`z0<_>=gZPWyrGM%B1-OA*H z2F|`Lkm-(qHB%2j(#bs-W}O>w2?6k91f)NOBd==RCYosA$W&^5{*R!u1(jw)(`%-03zT0)EN<5}h>gDf-J3?{eP%#F=Lhemd-{=oQKxjL#3|4SF^-D{#``Rsag9$BKk|xmT0*kQmnqe z*0j0Qfo=NmIQxwWkQbrCa@Q3tamu2>W`24tbdm9bQd_FK4@QsRO+$Frq^Ej0S0ibs zKDBAdDNEp^+-`YW3aWW?bkvK>!`&hcqzgco3HH4%aOqNAcW1z8g~-|hNrv#&bV3D8 zOSM)`O$MPFM}Q>jlJDm9lw9@*%q$npx4Kp7tb7?=>FlM~QS_^13Dp#j%IvLg>y+J_ zJo>|_`e6{VL6K&Hxa!4tN-ahhhmdNnx}LK=-Lc`KXv zg*$^hSQU|3=F_}(q*h0sPbde`Acx!=>OlC+G%GT_4VgiSL zCqyf<<3636JYbubAGfJh4uQubM(@-r?Z`1(g4#9k5Ab%Juws$WW_j|Rol^}r#A(EC zONdqn&+<@9>7^hDF{^$ke80NF8ZplyVV4<&t4IS+&=BLQw#*lVtA>L#30YXnA9(lA z>H?_tsx_enDaykSquzZ<68H`)koWV|B$=ev+OiEzK|H5=R+1c zbw`HvkwlhY%_4Jg^5(w@c{)K4uhlxjnwXXQ@Of}=JzTa=y4mRTsDcWJf#z(#b$Cq@_vVt?9F3$_t zJ=d-xIR|L81ghnE{)XPMZJD=H(nk1_`}jBB-GmL*r@#%3V{p+;H5r$--P4~FU3C#dJ#=ZVot~=0f`AYPD32uMx*hi4GNPxXxB9M@d6M^>E{PQ7ftDepk`$m2CbA-*1aW zCdl|ZXHi|h>$}S|Br^fXH>bNA3ejlgukw3)cad3Wrxs!I?3yI;PmRyzlYDRMSihIw z>O7M!{xZf#j>}MGPd>SZ^qO_cRN^FD2ph#(v<#cR4R3l7RHMHRNdg}Kv)p^_ zBJA~tL)d7_9?3If!y6Z*fcc=W$~v1vOPBS>DF2;gWv%8yfB2sEH{8m35o5&F9ZxHP zK@KOo2b{6Y=*l|=G%41M9eaVmQt)0sp7@UZmHeIW+^pd2|DFI?~EyBq^@*BxW>d!Gw{H|<+(0_mQ$K(OU+GzDYWjs zqxv6x4XtiFJE?_f=mC8};+}X;F<>vSuJl~G!Ta~h3(Q|i%tjl>9~)vxfn5~;LVtHY z%>bf{XtUt_{ukkFHAJ-}!dh+2_%!j{>U*)0#UXCl#(C72XrEDq_@%#___eRIF~`ic zYp-t-c3L!I(MUc~+~3Q3ZiWc)7F#E~YZJr5g_t!{qeAnerok%=YRQpTQlW9)k!$Tp z`p^mwy0{=;rlf9yh+CdN_qH`XQKQCKjv-|?Z7fH~KU=)pbd#HMFf7EpKgf*9+ z4&ui8Xyk8!>cM-@%dgBDXkIP7%0?E`chQXlU)XYx>fW6mxlu(>XFbE;X=b*P&o6xr z;91>d#z?AMKIL4R=0P3zEPiPAT}$^^{TeYH>B>4GN>~5k(Xh-8LnpWRWOdro+lmW!_jg3Tn&#rUk*33=DTD3+I`~l%@cz-)KJ80P)oKLIJ(nHEWt2zb#>% zh_&7x1mWq`IpUW3C=5`2x($Jkq2Uu_^*b_DZuI_iDPW)^H9>u0dGO##byu~bd?(no zWI5a%)?Cu{tHw7U@K+08)!d@n#4#PGUZycPiPW?!{aHElEe&5~3GVddO?iqDUU2#r zi@m#xWyNDH8YuXHrLXWH>}YZ4@eF2lh;SOv*S;mL61DNwwjqW22I0jruQ{ZiCS@bU z?pC7+`s%&uXei%a*BieZZjS~!FFk(#i^0x56@TMQ$v!q59~aeTDqtL4%|jbm-BALd z$FZ1zwI>zNF(BI`ZpOWKnk`p9-TI-Ce-*YCaRh(GK03h1JP60&k z8!LX>Tj?gKTNCK><{&N3zE&O z-nmE!^c}V7)eJeZ^LYUkR@&2#R$)HRBsJ_y)ZCFJQev8_0J^aDlRk%i^`fs|*psuP|+JQWz#lr@0Ao0mgq=beg;NGRsp*VTcL672!#@ z&`%8IIlY02^DD5RLpoduL+->8!Vns7f=*Z3nb6x^A#4MQICcK!d|Zj00C=U;$7FwV zSgfaNdJ?<>wCMLe=(bBZT#dj4ax36sxi|Do#+IJd3<^DHPQ?X-Qm7$IzFnyYnv2Bj zOW1?-?QG6a{FYoZQFvAfQw?~2A;Y))>B_R&k!&wv)$X@7@>svYJ_I4B0}C0?{Z8=N zi>4eDU5kQZPYa)Mucp0_ ze-9a8iYeh)#L>ykj5~!k$sK&WGO#$&uW1(LD(y&}kU&__!pxIt<)j?j0yznE@-k!G zj&J^5tr^s1?Hf|5mlT{|faw~`{bKN`o4vp&{fTz^>G^=Kk3U8=8C{{PSemCR_?P6T ze&_EW!PS!><2*zg!@T@o_6b*Jbl$UhW`Wy@XvJIvhBHu3hsq`bp+li3(j!QbX!CcG zRY8kU%Xj-Coj6{QMLzogb5Ca#k^O0C#o1^y&jH6N8^^POPNDUt8+@%O(Sfz%Th;YF z>4o1euoA2j70!-|ZWJSG&gcnx0t3gzrgn{E9M-D~>^pcOLos`qGEM3+q-0gNWJC+3 zdI6!*3Y}9~jl&A0_I_16U}YRZIjFPme(1~zp94o4op*4U$b(zz$G~TtL^(gJCHo25 zo||ARJe+T`EsNqz+ecZUO2mV%gvEaG-rQp}?pjYslq{D3kLj9y_A$KH0u$G-b z7jA)Wl^mFxI{Eu~Gf@#Xm_)h9uobyo>DvH%fB|)048EDRfqSxFvfR%>1G2biHU2jj zGznl+QACt62V=7|8w|QGoJubyh?4mA!0{y%aWY#JXTRD73*=xsPlUU@NF#|G6{f{{ z_F_LkX-~Y$9qWEg?V0_-e!XK~rc_mU*~qhZPzSyW51G8{eVO{E zjn}#}2S8swk}}81tFW@Af@KlQASBJ1j_8{D1}?g~C-wb}QFt=>>J5;>B};6p=#i)p zBP|MGNBF}}{%WAdfcf9%r*>KiO4aPs!f+N2>T8K87!Qohq%Mi@xzyG4IxHeo;OlZmYW7>%y z!S!h0j`jOjHC&_l8XV{rR5$*tfqE)UhkJxnlHi%up13GzK<=qIF~R;GSG!!gHn8mx zY@RW6Ip_>fH`LXb(pF>@O`gU2A)nhO9AbnV-h}*ZPe8?@Sa7xuek|uGk`eJn%{Dne zRLI%~hj>4f5c$Rhf_X)Ms-Gu7lV*n%A6|}%=G`-^vvXeMY?Z5y1^;Wm%YQr^*q7qi zBf)adx4mew@m&z2H{8F_2r=;0k`~ooy~c3XQ74r8H}zC{d(eNnuVKG!z_xPPT}h$a zwshaApnboM1~K;4OKnfL8dXw2PiAjzg)SxEX z5m#2y1NkivXNUQ|>%$fGlQ~vZc&>bMIbq2lANQoE7 zzu$KI0Cnx=mA6#k#u|y)Kk@9!^RD7wWHxD9j3NQt>F9}!Q*TEK$6reapLvrCVSQQ) zqfaz)Ca3iKIdc^S)=3%hUzK>H5)&UMc${BYF)GS2niow5y|ADL&$_K}pbS(QXCOwfQmOUU7#lmFC zy1*vJNTe6ay)JMj?B>LbkogoRdP=?8;ir)+PlLGjY3{+9tTxZ)IK3P!^4LA?9F_^w zmLqB0{<$kb0RFtrymswp6${Zk4Xj3bU;I`r7p(0#9OmwN8I@5Pi&gm9B9AH|FhQNt zx(Uv+Eh*<`BB@tq5Dgj%%S>dxJ9dXc2cP-&&0+@X`$!k9zcmZoI_nKG&ytfsLnHmC zU&eDb!kB6eOS;xlV!sq6uC_2dSaFJIzxxqTy6m$ms_e1v6jF@2`7`kyVEJ+@>>?@o z)<|@Jk4Dw~Qn;j6M)EyheJm{cQ1I?+;6UKay`2aHQ1WZj%uK!kZ*#D2O^m7V!M_#- z4|l+5)2A$rzx8^|3xBV0{Z^7;oVVeDKArJl+S50MKUp=_D^%)fP2K$#NY^meB;Dhf z2s5Jq&R(0krqq@#RnE+5Rx35?MqU&LCI5g5{PFi>+Aw$#c1!LN-GZ@Z9Ep2PxTnR~ zuPC16peT9<-Blhw*T=Pibm`{LAXRda zbEd?0C~REh<_~A8EXQ}tBZNp5>tUZi^0&W{^aib6fs=d?N@r4r4aODCjo*VG%5_^s zpL}SVmw1nO=~Vbg4$qE|!T;^2F;Mx!08a2?-;T{VpuVquUsIxgjcrX9|HEzcIP)8m z0yM*O_AjY0-1Ex5@%s_>Rrn2r$RAP5@F2+pf0lif_wWFe9+|9Y{~lI%FP?N;5wXp>RB&VPLS z&&wbFn~?j!n>J`q`cU~Fnweghg2eDShLK0``_%8U&!S*gD*1z+Wdi0Fr$pSk4!&HB zgSAU?F3hycn^efekk%$R`Vpe0Otq@PEJweY)E^MWJzFvF%<|@$ckD8Gqtq^UYb8q+ zz~ZO}F(5wvgD$2iGy?w=+OE>DMGGs-H}A&)R$4{T+?5{^gObh8pK9{4Xc?=T0XIr# zDQTamy;$(EQ_|(D7AID(Y;n0?Q=rl&5vxAtK6v^Brpy8zDKi8K5*`=nM=>7o^jK2v5f7 z_nj;Y+h2Sj(77?_%q0YjU|c>PXDR-BW0Ez$@8qgPa~MJB#u?KN<$-HdBP%4v_u)&6 zgBy$|OodlYFCEc0Vbk{iY%wc12oHcm_j<1$B*RVE)YUJd3<<|2mhfqSyYjWJaL|Au zp`!D+81=4!QeH0-6H-Jmi4a_`y%-C~5p5J&Q;yIlvTb8fLCmcO5XRy9i(f8`9ZE4F z-_{e;0G=!`HT0T>$i!bm)ijCUZ}91w3PNkwmetv|GEerEWO{NsjTzjUUdo#UyD%Na zS+moge?4k73cFexNxIa_w5=i~%)B7Ok9yI*5^rrv7pcX#7T!YS(Vc8YrjY#s1U5Oz zcM7ObNm6FbTE0)Trm|bcL+ETN=p+Bh8!O>3{JXu;Q2V3^4bR2Qa~EbS_TxCQh{1PE zt6|g5cZN4sdO|;B`P-j-tWbFETd@7(j^kz({Um2*->4^-KuaDzW#0HU{0@jQ!iXK6 zpGN>bHrISTA-6Y@7ZW5(r%^1j?xJTS5s6f41gtY$xqYczB1lm5!ky_sXvX|BGsXDd zr}A9agtw^xF<5xBs>0(^f#AN!LibLU_F>#zJ`Plaf~Rk=iiexQ1*P1B?R?SlA+lo~ z36=hS&?ifkau>Q>>G%I~t9<_#o_UXWZ@}r}bF1qLHbPrz-|tr|HIJ_T-Uw9oBO?C@A|&K$6BiB{Z#*o1@w zZlH6m{pqV)Q*`yKn%DgX9`3zP5HD?MSX$WcnN0WSq2LB->aX`28`^5_(r(**k?L8N zShcvh%h4MmWjZ~|y(8E4O4B%>%6xp?d&#jtWoiJc5re;LQ_iyU$it_&wi|FktL6eARW^s(cI9s8x@iae{oE8@S@FQT(IMWcd@Gbk}w zdF+-Kf7?$bM*G1B@9FTIa(x^Mbv8!7`ga1e@W8%d0C-p^R3M6 z$xB)HpL}@ij_C?(!L5XSep8cnh{A>wNTNv4{@}4+;p;+F`&hW$)>8dkpwZte(x<@Ij#NkseL4-VT;;+y!&pYi8|E` zMUs!Aj$b$1uG$Wc+~^3`ZmZy_zuL02cHs=`|i0vTW%OhbehT`DlHoV5<;U$3abfn~NIO^2?&@vn_7Dvw~j z68~f97LGV*IBy|}rSliAe9N-qezeGAVt?qzuveYb9M?USk&CDTzxyjuE~!bqi2qE+ z+fG13S?39b2Q<-l93z10V4kOm&!U|4*HjA?)Opu591o6tN5PWeuVf5!Kc^gKUeYMh zm~!=whUX|i2I$JhF&98mjz?zmSq)MglqY>BkSE%%17TVz#yh?T?5o6Q%n3jjv4|Cq zGjC=qQ^r+54OMVnLrQQS!ao4ffjc+5<_c2uALUvm1xkp`UxY$*I`_jI9#6QHbqE(Q z!Uo^Y``$DlFJDmmewkvXBk%jV_}sGXA%^lxWL~vgd>EIaPrbpG<;&1sC`OPh!E_d` z9zT@lRWSW+#TwL&;RJGH>D6j*@lmGD$h?u#qtsrTOak*w{KPSzGhV>C^o z{n7|8`YlsN?B_9ME1IRTCv$=G)bgU`578tWr_40ysv+0OvP@s_qlj>GrZqqPdF^$$ z@BaXIK#0E>jB#oAy$a~OxGlzKr`##9J8I?z&@)mUfi5~YKThj1z#VA+*#$Uss|U(^ zI@hC|Q%nrnMSKMNhcx#W@JG`Umli_KxVO6C>z6J8dKu_}zqhnK@&hW)V!lrA(h>R2 z>#!e83q7(Oa(vu5AA(JP0wq1SpjSVJttzTgH3@$ z_6i@!NOKic4hj6ZQ`XfB_UCr7=_$y|6?Ynfe2*^hgL5t1g+Lk7+(hjOg55cF#e}DgZY~7>yQ71(q&E}K~8$-?Bhbc z(j6?*fE`w1f03^3BzzbnP4Dzu_@GvrZnX#d&U9(!6hUvg>XU=u@AwnvkLl)1{sX_` z1Ds=~y98j}NT1aG9@5)%iieyzow3fP_xrN~dWLpv3pt(*5x~gP`;osmbuRcP_{SoB z@HCuDr8{q0gK{I^GgLarb9;%-==T}u&YazQRfP1MobHb>{?cY)z028Bfd5r;^1eI* z-~59Yz_;A0kI>&aTd({;`YJm-XL8aJ=jI>YGeUaNfA&JZ=WIw7J|vUoEV5ZP2DtB? z6!{lNBEMjuA@pQtYJ<*5bwc?<#SzfA=28yJt-lKU=JlJ5@_Xb>gnH#{Dma@B`!bD? zo*8!@>4oLDfE$nD`J1!2jlD2_a~5Q*27S-f4)r(|8!!a*dg~VpyPhWt^C9Qre5^Y; zrx)Hr{+d`3_?KjM1>Y9?(U7;it1a|onqoZU92$^^@^>B#0{>-G_<1?|F5iQky>c5t zU-{7$c)r#U^*W^ALujXhcYTBps-*?ba+7KWy!S3us9(YDt-^;-(t=OnU4(WjxEt5T zS-{tkt%de0xFc;W7VyPBFTw7D>uDoHA+JUVT=1{_sp0sTUKo?v&uttVDOeG8t>e*ylxyv zTvZ5rp7xJM`o)*R3)KJYaNRut@}^&bo|(bnLisH}2KRq1U_<#mV*zvbq^JtGOz)zg zcgx%Z&A^Nt;f3;l^fsR&0k;lU5!!LfCed_3{+1$@%6D*@IfAVE~yf3fD zQr@KQ)HiZF^_(?edLiTH6|eMS`m&*8?n8YwjK5P}c!GGy z3s`!PaS}_{F%DVzP-CY1EG2E_L|ixpa>}>qusu%c!k*HmrEHgEmj4~Yc(tW*$50LoCbZWkdeo)56~%a#Fb=_};^#zK=QW3)x1#1IH=vL^0?((=cGe8pb

%tl@aaGMEnkqI@b-P&)lZ`9UiQg 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 QSje0HAHgs*k7M!$0Qx