
Oblique Procrustes rotation and configuration orientation checks
Source:R/MdsExtra.R
ProcrustesOblique.RdProcrustesOblique: Browne's oblique target rotation
\(L = A (T')^{-1}\) minimising \(\|L - B\|^2\) with unit-length columns
of \(T\), by Jennrich's gradient projection (as
GPArotation::targetQ: Barzilai-Borwein steps with a non-monotone
Armijo search over the last fwindow iterations); NA targets are
unspecified. MdsReflect: axis signs agreeing with a target, or
making each axis's largest-magnitude coordinate positive.
MdsFlip: orthogonal Procrustes of Y onto X; a
negative determinant flags a reflection, with per-axis correlations.
MdsPolarity: orient each dimension so its anchor object is
non-negative (W-NOMINATE polarity), with the poles. MdsAnisotropy:
covariance eigenvalues, ratio \(\lambda_1 / \lambda_p\), principal-axis
angle in degrees and eccentricity. Identical to the Python arm
morie.fn.mdsext; anchors and poles are 1-based here.
Usage
ProcrustesOblique(A, target, eps = 1e-08, maxit = 5000L, fwindow = 10L)
MdsReflect(X, target = NULL)
MdsFlip(X, Y)
MdsPolarity(X, anchors)
MdsAnisotropy(X)References
Browne, M. W. (2001). An overview of analytic rotation in exploratory factor analysis. Multivariate Behavioral Research 36, 111-150.
Jennrich, R. I. (2002). A simple general method for oblique rotation. Psychometrika 67, 7-19.
Borg, I. and Groenen, P. J. F. (2005). Modern Multidimensional Scaling, 2nd ed. Springer.
Examples
A <- rbind(c(0.8, 0.1), c(0.7, 0.2), c(0.2, 0.9), c(0.1, 0.7))
ProcrustesOblique(A, rbind(c(1, 0), c(1, 0), c(0, 1), c(0, 1)))$Phi
#> [,1] [,2]
#> [1,] 1.0000000 0.5472815
#> [2,] 0.5472815 1.0000000
MdsFlip(rbind(c(0, 0), c(1, 0), c(0, 2)), rbind(c(0, 0), c(-1, 0), c(0, 2)))$reflected
#> [1] TRUE
MdsAnisotropy(rbind(c(-2, 0), c(2, 0), c(0, -1), c(0, 1)))$ratio
#> [1] 4