#' Gets estimated SDR basis. #' #' Returns the SDR basis matrix for SDR dimension(s). #' @param object instance of \code{cve} as output from \code{\link{cve}} or #' \code{\link{cve.call}} #' @param k the SDR dimension. #' @param ... ignored. #' #' @return dir the matrix of CS or CMS of given dimension #' #' @examples #' # set dimensions for simulation model #' p <- 8 # sample dimension #' k <- 2 # real dimension of SDR subspace #' n <- 200 # samplesize #' # create B for simulation #' b1 <- rep(1 / sqrt(p), p) #' b2 <- (-1)^seq(1, p) / sqrt(p) #' B <- cbind(b1, b2) #' #' set.seed(21) #' # creat predictor data x ~ N(0, I_p) #' x <- matrix(rnorm(n * p), n, p) #' # simulate response variable #' # y = f(B'x) + err #' # with f(x1, x2) = x1^2 + 2 * x2 and err ~ N(0, 0.25^2) #' y <- (x %*% b1)^2 + 2 * (x %*% b2) + 0.25 * rnorm(100) #' # calculate cve for k = 1, ..., 5 #' cve.obj <- cve(y ~ x, max.dim = 5) #' # get cve-estimate for B with dimensions (p, k = 2) #' B2 <- coef(cve.obj, k = 2) #' #' # Projection matrix on span(B) #' # equivalent to `B %*% t(B)` since B is semi-orthonormal #' PB <- B %*% solve(t(B) %*% B) %*% t(B) #' # Projection matrix on span(B2) #' # equivalent to `B2 %*% t(B2)` since B2 is semi-orthonormal #' PB2 <- B2 %*% solve(t(B2) %*% B2) %*% t(B2) #' # compare estimation accuracy by Frobenius norm of difference of projections #' norm(PB - PB2, type = 'F') #' #' @method coef cve #' @aliases coef.cve #' @rdname coef.cve #' @export coef.cve <- function(object, k, ...) { if (missing(k)) { Bs <- list() for (k in names(object$res)) { Bs[[k]] <- object$res[[k]]$B } return(Bs) } else if (k %in% names(object$res)) { return(object$res[[as.character(k)]]$B) } else { stop("Requested dimension `k` not computed.") } }