Computes Velicer's Minimum Average Partial (MAP) criterion for determining the number of factors/components to retain. The function implements the original MAP criterion (Velicer, 1976), expressed via the \(\mathrm{TR2}\) representation, and the revised \(\mathrm{TR4}\) variant proposed by Velicer, Eaton, and Fava (2000).
MAP(
x,
use = c("pairwise.complete.obs", "all.obs", "complete.obs", "everything",
"na.or.complete"),
cor_method = c("pearson", "spearman", "kendall")
)An object of class "MAP" with the following elements:
eigenvalues: Eigenvalues of the (possibly smoothed) correlation matrix.
n_factors_TR2: Index \(m\) that minimizes the TR2 (original MAP) criterion.
n_factors_TR4: Index \(m\) that minimizes the TR4 (revised MAP) criterion.
criteria: A matrix with columns m, TR2 (orig. MAP), and
TR4 (revised MAP).
settings: A list containing use, cor_method, and N.
A numeric matrix or data.frame. Can be either (a) a correlation matrix, or
(b) raw data (rows = observations, columns = variables) from which correlations are computed.
Character string specifying the treatment of missing values when computing correlations.
Passed to cor. Defaults to "pairwise.complete.obs".
Character string specifying the correlation coefficient to be computed if raw
data are supplied. Passed to cor. Defaults to "pearson".
#' MAP is based on the idea that systematic common variance is increasingly removed from a correlation matrix \(R\) as principal components are partialled out. After removing the first \(m\) components, a residual (partial) covariance matrix is obtained as $$C_m = R - A_m A_m',$$ where \(A_m\) contains the first \(m\) principal component loading vectors (PCA loadings). This residual matrix is then standardized to a partial correlation matrix $$R^*_m = D_m^{-1/2} \, C_m \, D_m^{-1/2},$$ with \(D_m = \mathrm{diag}(C_m)\). The MAP criteria summarize the off-diagonal association remaining in \(R^*_m\). The recommended number of factors/components is the \(m\) that minimizes the chosen criterion.
This function returns two MAP criteria:
TR2 (original MAP): $$\mathrm{MAP}_m = \frac{\mathrm{Trace}(R^{*2}_m) - p}{p(p-1)}$$ which is algebraically equivalent to the mean squared off-diagonal partial correlations and corresponds to Velicer's original MAP procedure.
TR4 (revised MAP): $$\mathrm{MAP4}_m = \frac{\mathrm{Trace}(R^{*4}_m) - p}{p(p-1)}$$ a higher-order variant that places more weight on dominant residual association structure.
Input handling. x can be a correlation matrix or raw data. If x is not a
correlation matrix, correlations are computed using cor with the requested
missing-data handling (use) and association measure (cor_method). If a correlation
matrix is supplied, N must be provided.
Matrix conditioning. The function stops if the correlation matrix is singular (non-invertible),
because subsequent computations rely on stable matrix operations. If the correlation matrix is not
positive definite (e.g., due to sampling error), it is smoothed using cor.smooth.
PCA-based partialing. The PCA loading matrix \(A\) is obtained from the eigen-decomposition of \(R\) as \(A = V \Lambda^{1/2}\). For each \(m = 0, \dots, p-1\), the first \(m\) columns of \(A\) are used to compute \(C_m = R - A_m A_m'\). The residual is re-standardized to the partial correlation matrix \(R^*_m\) using \(D_m^{-1/2}\) (i.e., dividing by the square roots of residual variances).
Termination. If residual variances (the diagonal of \(C_m\)) become non-positive or numerically unstable, the loop terminates early because \(R^*_m\) cannot be formed reliably.
Velicer, W. F. (1976). Determining the number of components from the matrix of partial correlations. Psychometrika, 41, 321--327.
Velicer, W. F., Eaton, C. A., & Fava, J. L. (2000). Construct explication through factor or component analysis: A review and evaluation of alternative procedures for determining the number of factors or components. In Goffin, R. D. & Helmes, E. (Eds.), Problems and Solutions in Human Assessment: Honoring Douglas N. Jackson at Seventy (pp. 41--71). Boston: Kluwer.
## Example with raw data
res <- MAP(GRiPS_raw)
res
## Example with a correlation matrix
res2 <- MAP(test_models$baseline$cormat)
res2
Run the code above in your browser using DataLab