NAG Library Routine Document
G03ACF
1 Purpose
G03ACF performs a canonical variate (canonical discrimination) analysis.
2 Specification
SUBROUTINE G03ACF ( 
WEIGHT, N, M, X, LDX, ISX, NX, ING, NG, WT, NIG, CVM, LDCVM, E, LDE, NCV, CVX, LDCVX, TOL, IRANKX, WK, IWK, IFAIL) 
INTEGER 
N, M, LDX, ISX(M), NX, ING(N), NG, NIG(NG), LDCVM, LDE, NCV, LDCVX, IRANKX, IWK, IFAIL 
REAL (KIND=nag_wp) 
X(LDX,M), WT(*), CVM(LDCVM,NX), E(LDE,6), CVX(LDCVX,NG1), TOL, WK(IWK) 
CHARACTER(1) 
WEIGHT 

3 Description
Let a sample of $n$ observations on ${n}_{x}$ variables in a data matrix come from ${n}_{g}$ groups with ${n}_{1},{n}_{2},\dots ,{n}_{{n}_{g}}$ observations in each group, $\sum {n}_{i}=n$. Canonical variate analysis finds the linear combination of the ${n}_{x}$ variables that maximizes the ratio of betweengroup to withingroup variation. The variables formed, the canonical variates can then be used to discriminate between groups.
The canonical variates can be calculated from the eigenvectors of the withingroup sums of squares and crossproducts matrix. However, G03ACF calculates the canonical variates by means of a singular value decomposition (SVD) of a matrix
$V$. Let the data matrix with variable (column) means subtracted be
$X$, and let its rank be
$k$; then the
$k$ by (
${n}_{g}1$) matrix
$V$ is given by:
where
${Q}_{g}$ is an
$n$ by
$\left({n}_{g}1\right)$ orthogonal matrix that defines the groups and
${Q}_{X}$ is the first
$k$ rows of the orthogonal matrix
$Q$ either from the
$QR$ decomposition of
$X$:
if
$X$ is of full column rank, i.e.,
$k={n}_{x}$, else from the SVD of
$X$:
Let the SVD of
$V$ be:
then the nonzero elements of the diagonal matrix
$\Delta $,
${\delta}_{\mathit{i}}$, for
$\mathit{i}=1,2,\dots ,l$, are the
$l$ canonical correlations associated with the
$l=\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(k,{n}_{g}1\right)$ canonical variates, where
$l=\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left(k,{n}_{g}\right)$.
The eigenvalues,
${\lambda}_{i}^{2}$, of the withingroup sums of squares matrix are given by:
and the value of
${\pi}_{i}={\lambda}_{i}^{2}/\sum {\lambda}_{i}^{2}$ gives the proportion of variation explained by the
$i$th canonical variate. The values of the
${\pi}_{i}$'s give an indication as to how many canonical variates are needed to adequately describe the data, i.e., the dimensionality of the problem.
To test for a significant dimensionality greater than
$i$ the
${\chi}^{2}$ statistic:
can be used. This is asymptotically distributed as a
${\chi}^{2}$distribution with
$\left(ki\right)\left({n}_{g}1i\right)$ degrees of freedom. If the test for
$i=h$ is not significant, then the remaining tests for
$i>h$ should be ignored.
The loadings for the canonical variates are calculated from the matrix ${U}_{x}$. This matrix is scaled so that the canonical variates have unit withingroup variance.
In addition to the canonical variates loadings the means for each canonical variate are calculated for each group.
Weights can be used with the analysis, in which case the weighted means are subtracted from each column and then each row is scaled by an amount $\sqrt{{w}_{i}}$, where ${w}_{i}$ is the weight for the $i$th observation (row).
4 References
Chatfield C and Collins A J (1980) Introduction to Multivariate Analysis Chapman and Hall
Gnanadesikan R (1977) Methods for Statistical Data Analysis of Multivariate Observations Wiley
Hammarling S (1985) The singular value decomposition in multivariate statistics SIGNUM Newsl. 20(3) 2–25
Kendall M G and Stuart A (1969) The Advanced Theory of Statistics (Volume 1) (3rd Edition) Griffin
5 Parameters
 1: WEIGHT – CHARACTER(1)Input
On entry: indicates if weights are to be used.
 ${\mathbf{WEIGHT}}=\text{'U'}$
 No weights are used.
 ${\mathbf{WEIGHT}}=\text{'W'}$ or $\text{'V'}$
 Weights are used and must be supplied in WT.
If ${\mathbf{WEIGHT}}=\text{'W'}$, the weights are treated as frequencies and the effective number of observations is the sum of the weights.
If ${\mathbf{WEIGHT}}=\text{'V'}$, the weights are treated as being inversely proportional to the variance of the observations and the effective number of observations is the number of observations with nonzero weights.
Constraint:
${\mathbf{WEIGHT}}=\text{'U'}$, $\text{'W'}$ or $\text{'V'}$.
 2: N – INTEGERInput
On entry: $n$, the number of observations.
Constraint:
${\mathbf{N}}\ge {\mathbf{NX}}+{\mathbf{NG}}$.
 3: M – INTEGERInput
On entry: $m$, the total number of variables.
Constraint:
${\mathbf{M}}\ge {\mathbf{NX}}$.
 4: X(LDX,M) – REAL (KIND=nag_wp) arrayInput
On entry: ${\mathbf{X}}\left(\mathit{i},\mathit{j}\right)$ must contain the $\mathit{i}$th observation for the $\mathit{j}$th variable, for $\mathit{i}=1,2,\dots ,n$ and $\mathit{j}=1,2,\dots ,m$.
 5: LDX – INTEGERInput
On entry: the first dimension of the array
X as declared in the (sub)program from which G03ACF is called.
Constraint:
${\mathbf{LDX}}\ge {\mathbf{N}}$.
 6: ISX(M) – INTEGER arrayInput
On entry:
${\mathbf{ISX}}\left(j\right)$ indicates whether or not the
$j$th variable is to be included in the analysis.
If
${\mathbf{ISX}}\left(\mathit{j}\right)>0$, the variables contained in the
$\mathit{j}$th column of
X is included in the canonical variate analysis, for
$\mathit{j}=1,2,\dots ,m$.
Constraint:
${\mathbf{ISX}}\left(j\right)>0$ for
NX values of
$j$.
 7: NX – INTEGERInput
On entry: the number of variables in the analysis, ${n}_{x}$.
Constraint:
${\mathbf{NX}}\ge 1$.
 8: ING(N) – INTEGER arrayInput
On entry: ${\mathbf{ING}}\left(\mathit{i}\right)$ indicates which group the $\mathit{i}$th observation is in, for $\mathit{i}=1,2,\dots ,n$. The effective number of groups is the number of groups with nonzero membership.
Constraint:
$1\le {\mathbf{ING}}\left(\mathit{i}\right)\le {\mathbf{NG}}$, for $\mathit{i}=1,2,\dots ,n$.
 9: NG – INTEGERInput
On entry: the number of groups, ${n}_{g}$.
Constraint:
${\mathbf{NG}}\ge 2$.
 10: WT($*$) – REAL (KIND=nag_wp) arrayInput

Note: the dimension of the array
WT
must be at least
${\mathbf{N}}$ if
${\mathbf{WEIGHT}}=\text{'W'}$ or
$\text{'V'}$, and at least
$1$ otherwise.
On entry: if
${\mathbf{WEIGHT}}=\text{'W'}$ or
$\text{'V'}$, the first
$n$ elements of
WT must contain the weights to be used in the analysis.
If ${\mathbf{WT}}\left(i\right)=0.0$, the $i$th observation is not included in the analysis.
If
${\mathbf{WEIGHT}}=\text{'U'}$,
WT is not referenced.
Constraints:
 ${\mathbf{WT}}\left(\mathit{i}\right)\ge 0.0$, for $\mathit{i}=1,2,\dots ,n$;
 $\sum _{1}^{n}}{\mathbf{WT}}\left(i\right)\ge {\mathbf{NX}}+\text{effective number of groups$.
 11: NIG(NG) – INTEGER arrayOutput
On exit: ${\mathbf{NIG}}\left(\mathit{j}\right)$ gives the number of observations in group $\mathit{j}$, for $\mathit{j}=1,2,\dots ,{n}_{g}$.
 12: CVM(LDCVM,NX) – REAL (KIND=nag_wp) arrayOutput
On exit: ${\mathbf{CVM}}\left(\mathit{i},\mathit{j}\right)$ contains the mean of the $\mathit{j}$th canonical variate for the $\mathit{i}$th group, for $\mathit{i}=1,2,\dots ,{n}_{g}$ and $\mathit{j}=1,2,\dots ,l$; the remaining columns, if any, are used as workspace.
 13: LDCVM – INTEGERInput
On entry: the first dimension of the array
CVM as declared in the (sub)program from which G03ACF is called.
Constraint:
${\mathbf{LDCVM}}\ge {\mathbf{NG}}$.
 14: E(LDE,$6$) – REAL (KIND=nag_wp) arrayOutput
On exit: the statistics of the canonical variate analysis.
 ${\mathbf{E}}\left(i,1\right)$
 The canonical correlations,
${\delta}_{\mathit{i}}$, for $\mathit{i}=1,2,\dots ,l$.
 ${\mathbf{E}}\left(i,2\right)$
 The eigenvalues of the withingroup sum of squares matrix,
${\lambda}_{\mathit{i}}^{2}$, for $\mathit{i}=1,2,\dots ,l$.
 ${\mathbf{E}}\left(i,3\right)$
 The proportion of variation explained by the
$\mathit{i}$th canonical variate, for $\mathit{i}=1,2,\dots ,l$.
 ${\mathbf{E}}\left(i,4\right)$
 The ${\chi}^{2}$ statistic for the
$\mathit{i}$th canonical variate, for $\mathit{i}=1,2,\dots ,l$.
 ${\mathbf{E}}\left(i,5\right)$
 The degrees of freedom for ${\chi}^{2}$ statistic for the
$\mathit{i}$th canonical variate, for $\mathit{i}=1,2,\dots ,l$.
 ${\mathbf{E}}\left(i,6\right)$
 The significance level for the ${\chi}^{2}$ statistic for the
$\mathit{i}$th canonical variate, for $\mathit{i}=1,2,\dots ,l$.
 15: LDE – INTEGERInput
On entry: the first dimension of the array
E as declared in the (sub)program from which G03ACF is called.
Constraint:
${\mathbf{LDE}}\ge \mathrm{min}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{NX}},{\mathbf{NG}}1\right)$.
 16: NCV – INTEGEROutput
On exit: the number of canonical variates,
$l$. This will be the minimum of
${n}_{g}1$ and the rank of
X.
 17: CVX(LDCVX,${\mathbf{NG}}1$) – REAL (KIND=nag_wp) arrayOutput
On exit: the canonical variate loadings.
${\mathbf{CVX}}\left(\mathit{i},\mathit{j}\right)$ contains the loading coefficient for the $\mathit{i}$th variable on the $\mathit{j}$th canonical variate, for $\mathit{i}=1,2,\dots ,{n}_{x}$ and $\mathit{j}=1,2,\dots ,l$; the remaining columns, if any, are used as workspace.
 18: LDCVX – INTEGERInput
On entry: the first dimension of the array
CVX as declared in the (sub)program from which G03ACF is called.
Constraint:
${\mathbf{LDCVX}}\ge {\mathbf{NX}}$.
 19: TOL – REAL (KIND=nag_wp)Input
On entry: the value of
TOL is used to decide if the variables are of full rank and, if not, what is the rank of the variables. The smaller the value of
TOL the stricter the criterion for selecting the singular value decomposition. If a nonnegative value of
TOL less than
machine precision is entered, the square root of
machine precision is used instead.
Constraint:
${\mathbf{TOL}}\ge 0.0$.
 20: IRANKX – INTEGEROutput
On exit: the rank of the dependent variables.
If the variables are of full rank then ${\mathbf{IRANKX}}={\mathbf{NX}}$.
If the variables are not of full rank then
IRANKX is an estimate of the rank of the dependent variables.
IRANKX is calculated as the number of singular values greater than
${\mathbf{TOL}}\times \text{(largest singular value)}$.
 21: WK(IWK) – REAL (KIND=nag_wp) arrayWorkspace
 22: IWK – INTEGERInput
On entry: the dimension of the array
WK as declared in the (sub)program from which G03ACF is called.
Constraints:
 if ${\mathbf{NX}}\ge {\mathbf{NG}}1$, ${\mathbf{IWK}}\ge {\mathbf{N}}\times {\mathbf{NX}}+\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(5\times \left({\mathbf{NX}}1\right)+\left({\mathbf{NX}}+1\right)\times {\mathbf{NX}},{\mathbf{N}}\right)+1$;
 if ${\mathbf{NX}}<{\mathbf{NG}}1$, ${\mathbf{IWK}}\ge {\mathbf{N}}\times {\mathbf{NX}}+\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(5\times \left({\mathbf{NX}}1\right)+\left({\mathbf{NG}}1\right)\times {\mathbf{NX}},{\mathbf{N}}\right)+1$.
 23: IFAIL – INTEGERInput/Output

On entry:
IFAIL must be set to
$0$,
$1\text{ or}1$. If you are unfamiliar with this parameter you should refer to
Section 3.3 in the Essential Introduction for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value
$1\text{ or}1$ is recommended. If the output of error messages is undesirable, then the value
$1$ is recommended. Otherwise, if you are not familiar with this parameter, the recommended value is
$0$.
When the value $\mathbf{1}\text{ or}\mathbf{1}$ 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).
6 Error Indicators and Warnings
If on entry
${\mathbf{IFAIL}}={\mathbf{0}}$ or
${{\mathbf{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{NX}}<1$, 
or  ${\mathbf{NG}}<2$, 
or  ${\mathbf{M}}<{\mathbf{NX}}$, 
or  ${\mathbf{N}}<{\mathbf{NX}}+{\mathbf{NG}}$, 
or  ${\mathbf{LDX}}<{\mathbf{N}}$, 
or  ${\mathbf{LDCVX}}<{\mathbf{NX}}$, 
or  ${\mathbf{LDCVM}}<{\mathbf{NG}}$, 
or  ${\mathbf{LDE}}<\mathrm{min}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{NX}},{\mathbf{NG}}1\right)$, 
or  ${\mathbf{NX}}\ge {\mathbf{NG}}1$ and ${\mathbf{IWK}}<{\mathbf{N}}\times {\mathbf{NX}}+\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(5\times \left({\mathbf{NX}}1\right)+\left({\mathbf{NX}}+1\right)\times {\mathbf{NX}},{\mathbf{N}}\right)$, 
or  ${\mathbf{NX}}<{\mathbf{NG}}1$ and ${\mathbf{IWK}}<{\mathbf{N}}\times {\mathbf{NX}}+\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(5\times \left({\mathbf{NX}}1\right)+\left({\mathbf{NG}}1\right)\times {\mathbf{NX}},{\mathbf{N}}\right)$, 
or  ${\mathbf{WEIGHT}}\ne \text{'U'}$, $\text{'W'}$ or $\text{'V'}$, 
or  ${\mathbf{TOL}}<0.0$. 
 ${\mathbf{IFAIL}}=2$
On entry,  ${\mathbf{WEIGHT}}=\text{'W'}$ or $\text{'V'}$ and a value of ${\mathbf{WT}}<0.0$. 
 ${\mathbf{IFAIL}}=3$
On entry,  a value of ${\mathbf{ING}}<1$, 
or  a value of ${\mathbf{ING}}>{\mathbf{NG}}$. 
 ${\mathbf{IFAIL}}=4$
On entry, the number of variables to be included in the analysis as indicated by
ISX is not equal to
NX.
 ${\mathbf{IFAIL}}=5$
A singular value decomposition has failed to converge. This is an unlikely error exit.
 ${\mathbf{IFAIL}}=6$
A canonical correlation is equal to $1$. This will happen if the variables provide an exact indication as to which group every observation is allocated.
 ${\mathbf{IFAIL}}=7$
On entry,  less than two groups have nonzero membership, i.e., the effective number of groups is less than $2$, 
or  the effective number of groups plus the number of variables, NX, is greater than the effective number of observations. 
 ${\mathbf{IFAIL}}=8$
The rank of the variables is $0$. This will happen if all the variables are constants.
7 Accuracy
As the computation involves the use of orthogonal matrices and a singular value decomposition rather than the traditional computing of a sum of squares matrix and the use of an eigenvalue decomposition, G03ACF should be less affected by illconditioned problems.
None.
9 Example
This example uses a sample of nine observations, each consisting of three variables plus a group indicator. There are three groups. An unweighted canonical variate analysis is performed and the results printed.
9.1 Program Text
Program Text (g03acfe.f90)
9.2 Program Data
Program Data (g03acfe.d)
9.3 Program Results
Program Results (g03acfe.r)