# File src/library/stats/R/princomp-add.R # Part of the R package, https://www.R-project.org # # Copyright (C) 1995-2014 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # https://www.R-project.org/Licenses/ predict.princomp <- function(object, newdata, ...) { if (missing(newdata)) return(object$scores) if(length(dim(newdata)) != 2L) stop("'newdata' must be a matrix or data frame") p <- NCOL(object$loadings) nm <- rownames(object$loadings) if(!is.null(nm)) { if(!all(nm %in% colnames(newdata))) stop("'newdata' does not have named columns matching one or more of the original columns") newdata <- newdata[, nm] } else { if(NCOL(newdata) != p) stop("'newdata' does not have the correct number of columns") } ## next line does as.matrix scale(newdata, object$center, object$scale) %*% object$loadings } summary.princomp <- function(object, loadings = FALSE, cutoff = 0.1, ...) { object$cutoff <- cutoff object$print.loadings <- loadings class(object) <- "summary.princomp" object } print.summary.princomp <- function(x, digits = 3L, loadings = x$print.loadings, cutoff = x$cutoff, ...) { vars <- x$sdev^2 vars <- vars/sum(vars) cat("Importance of components:\n") print(rbind("Standard deviation" = x$sdev, "Proportion of Variance" = vars, "Cumulative Proportion" = cumsum(vars))) if(loadings) { cat("\nLoadings:\n") cx <- format(round(x$loadings, digits = digits)) cx[abs(x$loadings) < cutoff] <- strrep(" ", nchar(cx[1,1], type="w")) print(cx, quote = FALSE, ...) } invisible(x) } plot.princomp <- function(x, main = deparse1(substitute(x)), ...) screeplot.default(x, main = main, ...) screeplot <- function(x, ...) UseMethod("screeplot") screeplot.default <- function(x, npcs = min(10, length(x$sdev)), type = c("barplot", "lines"), main = deparse1(substitute(x)), ...) { main type <- match.arg(type) pcs <- x$sdev^2 xp <- seq_len(npcs) dev.hold(); on.exit(dev.flush()) if(type == "barplot") barplot(pcs[xp], names.arg = names(pcs[xp]), main = main, ylab = "Variances", ...) else { plot(xp, pcs[xp], type = "b", axes = FALSE, main = main, xlab = "", ylab = "Variances", ...) axis(2) axis(1, at = xp, labels = names(pcs[xp])) } invisible() } loadings <- function(x, ...) x$loadings