# NAG Library Routine Document

## 1Purpose

g03baf computes orthogonal rotations for a matrix of loadings using a generalized orthomax criterion.

## 2Specification

Fortran Interface
 Subroutine g03baf ( g, nvar, k, fl, ldfl, flr, r, ldr, acc, iter, wk,
 Integer, Intent (In) :: nvar, k, ldfl, ldr, maxit Integer, Intent (Inout) :: ifail Integer, Intent (Out) :: iter Real (Kind=nag_wp), Intent (In) :: g, acc Real (Kind=nag_wp), Intent (Inout) :: fl(ldfl,k), flr(ldfl,k), r(ldr,k) Real (Kind=nag_wp), Intent (Out) :: wk(2*nvar+k*k+5*(k-1)) Character (1), Intent (In) :: stand
#include <nagmk26.h>
 void g03baf_ (const char *stand, const double *g, const Integer *nvar, const Integer *k, double fl[], const Integer *ldfl, double flr[], double r[], const Integer *ldr, const double *acc, const Integer *maxit, Integer *iter, double wk[], Integer *ifail, const Charlen length_stand)

## 3Description

Let $\Lambda$ be the $p$ by $k$ matrix of loadings from a variable-directed multivariate method, e.g., canonical variate analysis or factor analysis. This matrix represents the relationship between the original $p$ variables and the $k$ orthogonal linear combinations of these variables, the canonical variates or factors. The latter are only unique up to a rotation in the $k$-dimensional space they define. A rotation can then be found that simplifies the structure of the matrix of loadings, and hence the relationship between the original and the derived variables. That is, the elements, ${\lambda }_{ij}^{*}$, of the rotated matrix, ${\Lambda }^{*}$, are either relatively large or small. The rotations may be found by minimizing the criterion:
 $V=∑j=1k∑i=1p λij* 4-γp∑j=1k ∑i=1p λij* 2 2$
where the constant $\gamma$ gives a family of rotations with $\gamma =1$ giving varimax rotations and $\gamma =0$ giving quartimax rotations.
It is generally advised that factor loadings should be standardized, so that the sum of squared elements for each row is one, before computing the rotations.
The matrix of rotations, $R$, such that ${\Lambda }^{*}=\Lambda R$, is computed using first an algorithm based on that described by Cooley and Lohnes (1971), which involves the pairwise rotation of the factors. Then a final refinement is made using a method similar to that described by Lawley and Maxwell (1971), but instead of the eigenvalue decomposition, the algorithm has been adapted to incorporate a singular value decomposition.

## 4References

Cooley W C and Lohnes P R (1971) Multivariate Data Analysis Wiley
Lawley D N and Maxwell A E (1971) Factor Analysis as a Statistical Method (2nd Edition) Butterworths

## 5Arguments

1:     $\mathbf{stand}$ – Character(1)Input
On entry: indicates if the matrix of loadings is to be row standardized before rotation.
${\mathbf{stand}}=\text{'S'}$
${\mathbf{stand}}=\text{'U'}$
Constraint: ${\mathbf{stand}}=\text{'S'}$ or $\text{'U'}$.
2:     $\mathbf{g}$ – Real (Kind=nag_wp)Input
On entry: $\gamma$, the criterion constant with $\gamma =1.0$ giving varimax rotations and $\gamma =0.0$ giving quartimax rotations.
Constraint: ${\mathbf{g}}\ge 0.0$.
3:     $\mathbf{nvar}$ – IntegerInput
On entry: $p$, the number of original variables.
Constraint: ${\mathbf{nvar}}\ge {\mathbf{k}}$.
4:     $\mathbf{k}$ – IntegerInput
On entry: $k$, the number of derived variates or factors.
Constraint: ${\mathbf{k}}\ge 2$.
5:     $\mathbf{fl}\left({\mathbf{ldfl}},{\mathbf{k}}\right)$ – Real (Kind=nag_wp) arrayInput/Output
On entry: $\Lambda$, the matrix of loadings. ${\mathbf{fl}}\left(\mathit{i},\mathit{j}\right)$ must contain the loading for the $\mathit{i}$th variable on the $\mathit{j}$th factor, for $\mathit{i}=1,2,\dots ,p$ and $\mathit{j}=1,2,\dots ,k$.
On exit: if ${\mathbf{stand}}=\text{'S'}$, the elements of fl are standardized so that the sum of squared elements for each row is $1.0$ and then after the computation of the rotations are rescaled; this may lead to slight differences between the input and output values of fl.
If ${\mathbf{stand}}=\text{'U'}$, fl will be unchanged on exit.
6:     $\mathbf{ldfl}$ – IntegerInput
On entry: the first dimension of the arrays fl and flr as declared in the (sub)program from which g03baf is called.
Constraint: ${\mathbf{ldfl}}\ge {\mathbf{nvar}}$.
7:     $\mathbf{flr}\left({\mathbf{ldfl}},{\mathbf{k}}\right)$ – Real (Kind=nag_wp) arrayOutput
On exit: the rotated matrix of loadings, ${\Lambda }^{*}$. ${\mathbf{flr}}\left(\mathit{i},\mathit{j}\right)$ will contain the rotated loading for the $\mathit{i}$th variable on the $\mathit{j}$th factor, for $\mathit{i}=1,2,\dots ,p$ and $\mathit{j}=1,2,\dots ,k$.
8:     $\mathbf{r}\left({\mathbf{ldr}},{\mathbf{k}}\right)$ – Real (Kind=nag_wp) arrayOutput
On exit: the matrix of rotations, $R$.
9:     $\mathbf{ldr}$ – IntegerInput
On entry: the first dimension of the array r as declared in the (sub)program from which g03baf is called.
Constraint: ${\mathbf{ldr}}\ge {\mathbf{k}}$.
10:   $\mathbf{acc}$ – Real (Kind=nag_wp)Input
On entry: indicates the accuracy required. The iterative procedure of Cooley and Lohnes (1971) will be stopped and the final refinement computed when the change in $V$ is less than ${\mathbf{acc}}×\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1.0,V\right)$. If acc is greater than or equal to $0.0$ but less than machine precision or if acc is greater than $1.0$, machine precision will be used instead.
Suggested value: $0.00001$.
Constraint: ${\mathbf{acc}}\ge 0.0$.
11:   $\mathbf{maxit}$ – IntegerInput
On entry: the maximum number of iterations.
Suggested value: $30$.
Constraint: ${\mathbf{maxit}}\ge 1$.
12:   $\mathbf{iter}$ – IntegerOutput
On exit: the number of iterations performed.
13:   $\mathbf{wk}\left(2×{\mathbf{nvar}}+{\mathbf{k}}×{\mathbf{k}}+5×\left({\mathbf{k}}-1\right)\right)$ – Real (Kind=nag_wp) arrayWorkspace
14:   $\mathbf{ifail}$ – IntegerInput/Output
On entry: ifail must be set to $0$, . If you are unfamiliar with this argument you should refer to Section 3.4 in How to Use the NAG Library and its Documentation for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value  is recommended. If the output of error messages is undesirable, then the value $1$ is recommended. Otherwise, if you are not familiar with this argument, the recommended value is $0$. When the value  is used it is essential to test the value of ifail on exit.
On exit: ${\mathbf{ifail}}={\mathbf{0}}$ unless the routine detects an error or a warning has been flagged (see Section 6).

## 6Error Indicators and Warnings

If on entry ${\mathbf{ifail}}=0$ or $-1$, explanatory error messages are output on the current error message unit (as defined by x04aaf).
Errors or warnings detected by the routine:
${\mathbf{ifail}}=1$
On entry, ${\mathbf{acc}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{acc}}\ge 0.0$.
On entry, ${\mathbf{g}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{g}}\ge 0.0$.
On entry, ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{k}}\ge 2$.
On entry, ${\mathbf{ldfl}}=〈\mathit{\text{value}}〉$ and ${\mathbf{nvar}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{ldfl}}\ge {\mathbf{nvar}}$.
On entry, ${\mathbf{ldr}}=〈\mathit{\text{value}}〉$ and ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{ldr}}\ge {\mathbf{k}}$.
On entry, ${\mathbf{maxit}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{maxit}}>0$.
On entry, ${\mathbf{nvar}}=〈\mathit{\text{value}}〉$ and ${\mathbf{k}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{nvar}}\ge {\mathbf{k}}$.
On entry, ${\mathbf{stand}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{stand}}=\text{'S'}$ or $\text{'U'}$.
${\mathbf{ifail}}=2$
The singular value decomposition has failed to converge. This is an unlikely error exit.
${\mathbf{ifail}}=3$
The algorithm to find R has failed to reach the required accuracy in maxit iterations. You should try increasing acc or increasing maxit. The returned solution should be a reasonable approximation.
${\mathbf{ifail}}=-99$
See Section 3.9 in How to Use the NAG Library and its Documentation for further information.
${\mathbf{ifail}}=-399$
Your licence key may have expired or may not have been installed correctly.
See Section 3.8 in How to Use the NAG Library and its Documentation for further information.
${\mathbf{ifail}}=-999$
Dynamic memory allocation failed.
See Section 3.7 in How to Use the NAG Library and its Documentation for further information.

## 7Accuracy

The accuracy is determined by the value of acc.

## 8Parallelism and Performance

g03baf makes calls to BLAS and/or LAPACK routines, which may be threaded within the vendor library used by this implementation. Consult the documentation for the vendor library for further information.
Please consult the X06 Chapter Introduction for information on how to control and interrogate the OpenMP environment used within this routine. Please also consult the Users' Note for your implementation for any additional implementation-specific information.

If the results of a principal component analysis as carried out by g03aaf are to be rotated, the loadings as returned in the array p by g03aaf can be supplied via the argument fl to g03baf. The resulting rotation matrix can then be used to rotate the principal component scores as returned in the array v by g03aaf. The routine f06yaf (dgemm) may be used for this matrix multiplication.

## 10Example

This example is taken from page 75 of Lawley and Maxwell (1971). The results from a factor analysis of ten variables using three factors are input and rotated using varimax rotations without standardizing rows.

### 10.1Program Text

Program Text (g03bafe.f90)

### 10.2Program Data

Program Data (g03bafe.d)

### 10.3Program Results

Program Results (g03bafe.r)