FOPCS
Computes an orthogonal Procrustes rotation of a factor‑loading matrix using a target matrix.
Required Arguments
A — NVAR by NF matrix of unrotated factor loadings. (Input)
X — NVAR by NF target matrix of the rotation. (Input)
B — NVAR by NF matrix of rotated factor loadings. (Output)
T — NF by NF factor rotation matrix. (Output)
Optional Arguments
NVAR — Number of variables. (Input)
Default: NVAR = size (A,1).
NF — Number of factors. (Input)
Default: NF = size (A,2).
LDA — Leading dimension of A exactly as specified in the dimension statement in the calling program. (Input)
Default: LDA = size (A,1).
LDX — Leading dimension of X exactly as specified in the dimension statement in the calling program. (Input)
Default: LDX = size (X,1).
LDB — Leading dimension of B exactly as specified in the dimension statement in the calling program. (Input)
Default: LDB = size (B,1).
LDT — Leading dimension of T exactly as specified in the dimension statement in the calling program. (Input)
Default: LDT = size (T,1).
FORTRAN 90 Interface
Generic: CALL FOPCS (A, X, B, T [, …])
Specific: The specific interface names are S_FOPCS and D_FOPCS.
FORTRAN 77 Interface
Single: CALL FOPCS (NVAR, NF, A, LDA, X, LDX, B, LDB, T, LDT )
Double: The double precision name is DFOPCS.
Description
Routine FOPCS performs orthogonal Procrustes rotation according to a method proposed by Schöneman (1966). Let k = NF denote the number of factors, p = NVAR denote the number of variables, A denote the p × k matrix of unrotated factor loadings, T denote the k × k orthogonal rotation matrix (orthogonality requires that TT T be a k × k identity matrix), and let X denote the target matrix. The basic idea in orthogonal Procrustes rotation is to find an orthogonal rotation matrix T such that B = AT and T provides a least‑squares fit between the target matrix X and the rotated loading matrix B. Schöneman’s algorithm proceeds by finding the singular value decomposition of the matrix AT X = UΣVT. The rotation matrix is computed as T = UVT.
Comments
1. Workspace may be explicitly provided, if desired, by use of F2PCS/DF2PCS. The reference is:
CALL F2PCS (NVAR, NF, A, LDA, X, LDX, B, LDB, T, LDT, WK, S)
The additional arguments are as follows:
WK — Work vector of length NF * (2 * NF + 3) ‑ 1.
S — Work vector of length NF * (NF + 1).
2. Informational errors
Type |
Code |
Description |
4 |
1 |
NF = 1. No rotation is possible. |
4 |
2 |
The rank of AT * X is less than NF. |
3. The target matrix is a hypothesized rotated factor loading matrix with loadings chosen (based on prior knowledge) to enhance interpretability. A simple structure solution will have most of the elements in X near zero or one (for correlation matrix loadings).
4. This routine may also be used to refine a solution obtained by analytic rotation in routine FROTA. Choose the target matrix so that it closely resembles the analytic solution but modified to have a simple structure.
Example
The following example is taken from Harman (1976, page 355). It involves the orthogonal Procrustes rotation of an 8 × 2 unrotated factor loading matrix. The original variables are measures of physical features (“lankiness” and “stockiness”). The target matrix X is also printed. Note that because different methods are used, Harman (1976) gets slightly different results.
USE FOPCS_INT
USE WRRRN_INT
IMPLICIT NONE
INTEGER LDA, LDB, LDT, LDX, NF, NVAR
PARAMETER (LDA=8, LDB=8, LDT=2, LDX=8, NF=2, NVAR=8)
!
REAL A(LDA,NF), B(LDB,NF), T(LDT,NF), X(LDX,NF)
!
DATA A/0.856, 0.848, 0.808, 0.831, 0.750, 0.631, 0.569, 0.607, &
-0.324, -0.412, -0.409, -0.342, 0.571, 0.492, 0.510, 0.351/
DATA X/0.9, 0.9, 0.9, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, &
0.9, 0.9, 0.9, 0.9/
!
CALL FOPCS (A, X, B, T)
!
CALL WRRRN ('A', A)
CALL WRRRN ('X', X)
CALL WRRRN ('B', B)
CALL WRRRN ('T', T)
END
Output
A
1 2
1 0.8560 -0.3240
2 0.8480 -0.4120
3 0.8080 -0.4090
4 0.8310 -0.3420
5 0.7500 0.5710
6 0.6310 0.4920
7 0.5690 0.5100
8 0.6070 0.3510
X
1 2
1 0.9000 0.0000
2 0.9000 0.0000
3 0.9000 0.0000
4 0.9000 0.0000
5 0.0000 0.9000
6 0.0000 0.9000
7 0.0000 0.9000
8 0.0000 0.9000
B
1 2
1 0.8763 0.2643
2 0.9235 0.1896
3 0.8900 0.1677
4 0.8674 0.2348
5 0.2471 0.9096
6 0.2009 0.7745
7 0.1407 0.7510
8 0.2677 0.6481
T
1 2
1 0.7932 0.6090
2 -0.6090 0.7932