% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/EFAtools-superseded.R
\name{PROCRUSTES}
\alias{PROCRUSTES}
\title{Rotate a loading matrix to a target using Procrustes alignment}
\usage{
PROCRUSTES(
  A,
  Target,
  rotation = c("orthogonal", "oblique"),
  S = NULL,
  T_init = NULL,
  oblique_eps = 1e-05,
  oblique_maxit = 1000,
  oblique_max_line_search = 10,
  oblique_step0 = 1,
  oblique_normalize = FALSE,
  oblique_random_starts = 0,
  oblique_screen_keep = 2,
  oblique_triage_maxit = 25,
  oblique_triage_improve_tol = 0
)
}
\arguments{
\item{A}{Numeric loading matrix to be aligned.}

\item{Target}{Numeric target matrix with the same dimensions as \code{A}.}

\item{rotation}{Character string, either \code{"orthogonal"} or \code{"oblique"}.}

\item{S}{Optional \verb{k x k} cross-product matrix \code{crossprod(A)}, kept for
compatibility. It enters both the oblique criterion and its gradient, so any
other matrix would minimize a different criterion: where \code{S} is used it is
checked against \code{crossprod(A)} and must agree with it up to a relative
tolerance of \code{1e-8}. That check forms \code{crossprod(A)} itself, so passing \code{S}
no longer avoids any work: omitting it gives the same result for slightly
less. \code{S} is used, and therefore checked, only on the oblique path with more
than one factor and \code{oblique_normalize = FALSE}; if Kaiser normalization is
requested, the cross-product must be recomputed on the normalized matrix and
\code{S} is ignored.}

\item{T_init}{Optional \verb{k x k} starting transformation matrix for the oblique
solver. Its columns are normalized internally, and the normalized matrix must
be well enough conditioned to define a proper factor correlation matrix: its
smallest singular value must be at least \code{1e-4}, the same floor the solver
applies to every candidate it evaluates. If \code{NULL} (the default), the oblique
solver is warm-started from the closed-form orthogonal Procrustes solution.}

\item{oblique_eps}{Positive convergence tolerance for the projected-gradient
norm in the oblique solver.}

\item{oblique_maxit}{Non-negative integer. Maximum number of projected-gradient
updates in the full oblique solver.}

\item{oblique_max_line_search}{Non-negative integer. Maximum number of
step-halving attempts after the initial line-search step.}

\item{oblique_step0}{Positive initial step size for the oblique solver.}

\item{oblique_normalize}{Logical; if \code{TRUE}, apply Kaiser row normalization to
the loadings (only) in the oblique solver and back-transform the aligned
loadings afterwards, leaving \code{Target} unnormalized (as in
\code{GPArotation::targetQ(normalize = TRUE)}).}

\item{oblique_random_starts}{Non-negative integer. Number of additional random
starts used by the oblique solver.}

\item{oblique_screen_keep}{Non-negative integer. Number of random starts
retained after cheap objective screening and sent to triage optimization.}

\item{oblique_triage_maxit}{Non-negative integer. Number of short optimization
iterations used in the triage stage.}

\item{oblique_triage_improve_tol}{Non-negative scalar. Relative improvement
required for a triaged start to be promoted to full optimization.}
}
\value{
A list identical to the value of \code{\link[=efa_procrustes]{efa_procrustes()}}; see there for the
components.
}
\description{
\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}}

\code{PROCRUSTES()} has been superseded by \code{\link[=efa_procrustes]{efa_procrustes()}}, which is the
recommended interface going forward. It remains available and unchanged so
existing code keeps working.
}
\seealso{
\code{\link[=efa_procrustes]{efa_procrustes()}}
}
