blob: a245eae6df5aecbd379f6bf4b98864c6f458a866 [file] [log] [blame]
# 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 = deparse(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 = deparse(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