NAG FL Interface
g03aaf (prin_​comp)

1 Purpose

g03aaf performs a principal component analysis on a data matrix; both the principal component loadings and the principal component scores are returned.

2 Specification

Fortran Interface
Subroutine g03aaf ( matrix, std, weight, n, m, x, ldx, isx, s, wt, nvar, e, lde, p, ldp, v, ldv, wk, ifail)
Integer, Intent (In) :: n, m, ldx, isx(m), nvar, lde, ldp, ldv
Integer, Intent (Inout) :: ifail
Real (Kind=nag_wp), Intent (In) :: x(ldx,m), wt(*), wk(1)
Real (Kind=nag_wp), Intent (Inout) :: s(m), e(lde,6), p(ldp,nvar), v(ldv,nvar)
Character (1), Intent (In) :: matrix, std, weight
C Header Interface
#include <nag.h>
void  g03aaf_ (const char *matrix, const char *std, const char *weight, const Integer *n, const Integer *m, const double x[], const Integer *ldx, const Integer isx[], double s[], const double wt[], const Integer *nvar, double e[], const Integer *lde, double p[], const Integer *ldp, double v[], const Integer *ldv, const double wk[], Integer *ifail, const Charlen length_matrix, const Charlen length_std, const Charlen length_weight)
The routine may be called by the names g03aaf or nagf_mv_prin_comp.

3 Description

Let X be an n by p data matrix of n observations on p variables x1,x2,,xp and let the p by p variance-covariance matrix of x1,x2,,xp be S. A vector a1 of length p is found such that:
a1TSa1  is maximized subject to  a1Ta1=1.  
The variable z1=i=1pa1ixi is known as the first principal component and gives the linear combination of the variables that gives the maximum variation. A second principal component, z2=i=1pa2ixi, is found such that:
a2TSa2  is maximized subject to ​a2Ta2=1and ​a2Ta1=0.  
This gives the linear combination of variables that is orthogonal to the first principal component that gives the maximum variation. Further principal components are derived in a similar way.
The vectors a1,a2,,ap, are the eigenvectors of the matrix S and associated with each eigenvector is the eigenvalue, λi2. The value of λi2/λi2 gives the proportion of variation explained by the ith principal component. Alternatively, the ai's can be considered as the right singular vectors in a singular value decomposition with singular values λi of the data matrix centred about its mean and scaled by 1/n-1, Xs. This latter approach is used in g03aaf, with
Xs=VΛP  
where Λ is a diagonal matrix with elements λi, P is the p by p matrix with columns ai and V is an n by p matrix with VV=I, which gives the principal component scores.
Principal component analysis is often used to reduce the dimension of a dataset, replacing a large number of correlated variables with a smaller number of orthogonal variables that still contain most of the information in the original dataset.
The choice of the number of dimensions required is usually based on the amount of variation accounted for by the leading principal components. If k principal components are selected, then a test of the equality of the remaining p-k eigenvalues is
n-2p+5/6 -i=k+1plogλi2+p-klogi=k+1pλi2/p-k  
which has, asymptotically, a χ2-distribution with 12p-k-1p-k+2 degrees of freedom.
Equality of the remaining eigenvalues indicates that if any more principal components are to be considered then they all should be considered.
Instead of the variance-covariance matrix the correlation matrix, the sums of squares and cross-products matrix or a standardized sums of squares and cross-products matrix may be used. In the last case S is replaced by σ-12Sσ-12 for a diagonal matrix σ with positive elements. If the correlation matrix is used, the χ2 approximation for the statistic given above is not valid.
The principal component scores, F, are the values of the principal component variables for the observations. These can be standardized so that the variance of these scores for each principal component is 1.0 or equal to the corresponding eigenvalue.
Weights can be used with the analysis, in which case the matrix X is first centred about the weighted means then each row is scaled by an amount wi, where wi is the weight for the ith observation.

4 References

Chatfield C and Collins A J (1980) Introduction to Multivariate Analysis Chapman and Hall
Cooley W C and Lohnes P R (1971) Multivariate Data Analysis 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
Morrison D F (1967) Multivariate Statistical Methods McGraw–Hill

5 Arguments

1: matrix Character(1) Input
On entry: indicates for which type of matrix the principal component analysis is to be carried out.
matrix='C'
It is for the correlation matrix.
matrix='S'
It is for a standardized matrix, with standardizations given by s.
matrix='U'
It is for the sums of squares and cross-products matrix.
matrix='V'
It is for the variance-covariance matrix.
Constraint: matrix='C', 'S', 'U' or 'V'.
2: std Character(1) Input
On entry: indicates if the principal component scores are to be standardized.
std='S'
The principal component scores are standardized so that FF=I, i.e., F=XsPΛ-1=V.
std='U'
The principal component scores are unstandardized, i.e., F=XsP=VΛ.
std='Z'
The principal component scores are standardized so that they have unit variance.
std='E'
The principal component scores are standardized so that they have variance equal to the corresponding eigenvalue.
Constraint: std='E', 'S', 'U' or 'Z'.
3: weight Character(1) Input
On entry: indicates if weights are to be used.
weight='U'
No weights are used.
weight='W'
Weights are used and must be supplied in wt.
Constraint: weight='U' or 'W'.
4: n Integer Input
On entry: n, the number of observations.
Constraint: n2.
5: m Integer Input
On entry: m, the number of variables in the data matrix.
Constraint: m1.
6: xldxm Real (Kind=nag_wp) array Input
On entry: xij must contain the ith observation for the jth variable, for i=1,2,,n and j=1,2,,m.
7: ldx Integer Input
On entry: the first dimension of the array x as declared in the (sub)program from which g03aaf is called.
Constraint: ldxn.
8: isxm Integer array Input
On entry: isxj indicates whether or not the jth variable is to be included in the analysis.
If isxj>0, the variable contained in the jth column of x is included in the principal component analysis, for j=1,2,,m.
Constraint: isxj>0 for nvar values of j.
9: sm Real (Kind=nag_wp) array Input/Output
On entry: the standardizations to be used, if any.
If matrix='S', the first m elements of s must contain the standardization coefficients, the diagonal elements of σ.
Constraint: if isxj>0, sj>0.0, for j=1,2,,m.
On exit: if matrix='S', s is unchanged on exit.
If matrix='C', s contains the variances of the selected variables. sj contains the variance of the variable in the jth column of x if isxj>0.
If matrix='U' or 'V', s is not referenced.
10: wt* Real (Kind=nag_wp) array Input
Note: the dimension of the array wt must be at least n if weight='W', and at least 1 otherwise.
On entry: if weight='W', the first n elements of wt must contain the weights to be used in the principal component analysis.
If wti=0.0, the ith observation is not included in the analysis. The effective number of observations is the sum of the weights.
If weight='U', wt is not referenced and the effective number of observations is n.
Constraints:
  • wti0.0, for i=1,2,,n;
  • the sum of weights nvar+1.
11: nvar Integer Input
On entry: p, the number of variables in the principal component analysis.
Constraint: 1nvarminn-1,m.
12: elde6 Real (Kind=nag_wp) array Output
On exit: the statistics of the principal component analysis.
ei1
The eigenvalues associated with the ith principal component, λi2, for i=1,2,,p.
ei2
The proportion of variation explained by the ith principal component, for i=1,2,,p.
ei3
The cumulative proportion of variation explained by the first ith principal components, for i=1,2,,p.
ei4
The χ2 statistics, for i=1,2,,p.
ei5
The degrees of freedom for the χ2 statistics, for i=1,2,,p.
If matrix'C', ei6 contains significance level for the χ2 statistic, for i=1,2,,p.
If matrix='C', ei6 is returned as zero.
13: lde Integer Input
On entry: the first dimension of the array e as declared in the (sub)program from which g03aaf is called.
Constraint: ldenvar.
14: pldpnvar Real (Kind=nag_wp) array Output
On exit: the first nvar columns of p contain the principal component loadings, ai. The jth column of p contains the nvar coefficients for the jth principal component.
15: ldp Integer Input
On entry: the first dimension of the array p as declared in the (sub)program from which g03aaf is called.
Constraint: ldpnvar.
16: vldvnvar Real (Kind=nag_wp) array Output
On exit: the first nvar columns of v contain the principal component scores. The jth column of v contains the n scores for the jth principal component.
If weight='W', any rows for which wti is zero will be set to zero.
17: ldv Integer Input
On entry: the first dimension of the array v as declared in the (sub)program from which g03aaf is called.
Constraint: ldvn.
18: wk1 Real (Kind=nag_wp) array Input
This argument is no longer accessed by g03aaf. Workspace is provided internally by dynamic allocation instead.
19: ifail Integer Input/Output
On entry: ifail must be set to 0, -1 or 1 to set behaviour on detection of an error; these values have no effect when no error is detected.
A value of 0 causes the printing of an error message and program execution will be halted; otherwise program execution continues. A value of -1 means that an error message is printed while a value of 1 means that it is not.
If halting is not appropriate, the value -1 or 1 is recommended. If message printing is undesirable, then the value 1 is recommended. Otherwise, the value 0 is recommended. When the value -1 or 1 is used it is essential to test the value of ifail on exit.
On exit: ifail=0 unless the routine detects an error or a warning has been flagged (see Section 6).

6 Error Indicators and Warnings

If on entry 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:
ifail=1
On entry, lde=value and nvar=value.
Constraint: ldenvar.
On entry, ldp=value and nvar=value.
Constraint: ldpnvar.
On entry, ldv=value and n=value.
Constraint: ldvn.
On entry, ldx=value and n=value.
Constraint: ldxn.
On entry, m=value.
Constraint: m1.
On entry, matrix=value.
Constraint: matrix='C', 'S', 'U' or 'V'.
On entry, n=value.
Constraint: n2.
On entry, n=value and nvar=value.
Constraint: n>nvar.
On entry, nvar=value.
Constraint: nvar1.
On entry, nvar=value and m=value.
Constraint: nvarm.
On entry, std=value.
Constraint: std='E', 'S', 'U' or 'Z'.
On entry, weight=value.
Constraint: weight='U' or 'W'.
ifail=2
On entry, i=value and wti<0.0.
Constraint: wti0.0.
ifail=3
Number of selected variables effective number of observations.
On entry, nvar=value and value values of isx>0.
Constraint: exactly nvar elements of isx>0.
ifail=4
On entry, j=value and sj0.0.
Constraint: sj>0.0.
ifail=5
The singular value decomposition has failed to converge. This is an unlikely error exit.
ifail=6
All eigenvalues/singular values are zero. This will be caused by all the variables being constant.
ifail=-99
An unexpected error has been triggered by this routine. Please contact NAG.
See Section 7 in the Introduction to the NAG Library FL Interface for further information.
ifail=-399
Your licence key may have expired or may not have been installed correctly.
See Section 8 in the Introduction to the NAG Library FL Interface for further information.
ifail=-999
Dynamic memory allocation failed.
See Section 9 in the Introduction to the NAG Library FL Interface for further information.

7 Accuracy

As g03aaf uses a singular value decomposition of the data matrix, it will be less affected by ill-conditioned problems than traditional methods using the eigenvalue decomposition of the variance-covariance matrix.

8 Parallelism and Performance

g03aaf 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.

9 Further Comments

None.

10 Example

A dataset is taken from Cooley and Lohnes (1971), it consists of ten observations on three variables. The unweighted principal components based on the variance-covariance matrix are computed and the principal component scores requested. The principal component scores are standardized so that they have variance equal to the corresponding eigenvalue.

10.1 Program Text

Program Text (g03aafe.f90)

10.2 Program Data

Program Data (g03aafe.d)

10.3 Program Results

Program Results (g03aafe.r)
GnuplotProduced by GNUPLOT 4.6 patchlevel 3 Example Program Principal Component Analysis −3 −2 −1 0 1 2 3 4 −5 −4 −3 −2 −1 0 1 2 3 4 5 Second Principal Component (PC 2) First Principal Component (PC 1) Observation ID for the First and Second Principal Components gnuplot_plot_1a 1 2 3 4 5 6 7 8 9 10 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 PC 1 PC 2 PC 3 Percentage Variation Scree Plot gnuplot_plot_1b