#' Predicts SDR dimension using \code{\link[mda]{mars}} via a Cross-Validation. #' #' @param object instance of class \code{cve} (result of \code{cve}, #' \code{cve.call}). #' @param ... ignored. #' #' @return list with #' \itemize{ #' \item MSE: Mean Square Error, #' \item k: predicted dimensions. #' } #' #' @examples #' # create B for simulation #' B <- rep(1, 5) / sqrt(5) #' #' set.seed(21) #' # creat predictor data x ~ N(0, I_p) #' x <- matrix(rnorm(500), 100) #' #' # simulate response variable #' # y = f(B'x) + err #' # with f(x1) = x1 and err ~ N(0, 0.25^2) #' y <- x %*% B + 0.25 * rnorm(100) #' #' # Calculate cve for unknown k between min.dim and max.dim. #' cve.obj.simple <- cve(y ~ x) #' #' predict_dim(cve.obj.simple) #' #' @export predict_dim <- function(object, ...) { # Get centered training data and dimensions X <- scale(object$X, center = TRUE, scale = FALSE) n <- nrow(object$X) # umber of training data samples Sigma <- (1 / n) * crossprod(X, X) eig <- eigen(Sigma) Sigma_root <- eig$vectors %*% tcrossprod(diag(sqrt(eig$values)), eig$vectors) X <- X %*% solve(Sigma_root) pred <- matrix(0, n, length(object$res)) colnames(pred) <- names(object$res) for (dr.k in object$res) { # get "name" of current dimension k <- as.character(dr.k$k) # Project dataset with current SDR basis X.proj <- X %*% dr.k$B for (i in 1:n) { model <- mda::mars(X.proj[-i, ], object$Y[-i]) pred[i, k] <- predict(model, X.proj[i, , drop = F]) } } MSE <- colMeans((pred - object$Y)^2) return(list( MSE = MSE, k = as.integer(names(which.min(MSE))) )) }