1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
#' @rdname principal_components
#' @export
factor_analysis <- function(x,
n = "auto",
rotation = "none",
sort = FALSE,
threshold = NULL,
standardize = TRUE,
cor = NULL,
...) {
UseMethod("factor_analysis")
}
#' @export
factor_analysis.data.frame <- function(x,
n = "auto",
rotation = "none",
sort = FALSE,
threshold = NULL,
standardize = TRUE,
cor = NULL,
...) {
# Standardize
if (standardize && is.null(cor)) {
x <- datawizard::standardize(x, ...)
}
# N factors
n <- .get_n_factors(x, n = n, type = "FA", rotation = rotation, cor = cor)
.factor_analysis_rotate(
x,
n,
rotation = rotation,
sort = sort,
threshold = threshold,
cor = cor,
...
)
}
#' @keywords internal
.factor_analysis_rotate <- function(x,
n,
rotation,
sort = FALSE,
threshold = NULL,
cor = NULL,
...) {
if (!inherits(x, "data.frame")) {
insight::format_error("`x` must be a data frame.")
}
# rotate loadings
if (!requireNamespace("psych", quietly = TRUE)) {
insight::format_error(sprintf("Package `psych` required for `%s`-rotation.", rotation))
}
# Pass cor if available
if (is.null(cor)) {
out <- model_parameters(
psych::fa(x, nfactors = n, rotate = rotation, ...),
sort = sort,
threshold = threshold
)
} else {
out <- model_parameters(
psych::fa(
cor,
nfactors = n,
rotate = rotation,
n.obs = nrow(x),
...
),
sort = sort,
threshold = threshold
)
}
attr(out, "dataset") <- x
out
}
|