Re: NCAR's EOF functions

From: Dennis Shea (shea AT XXXXXX)
Date: Thu Jun 21 2001 - 12:00:30 MDT


Background:

EOFs (Empirical Orthogonal Functions; also known as Principal
Components) result from deriving eigenvalues and eigenvectors from a
covariance or correlation matrix. NCL takes the input data and
creates the covariance or correlation matrix. (NCL uses
symmetric storage mode to save space.) The public domain LAPACK
routine called "dspevx" is then used to derive the EOFs.

Note that no "physics" are involved. A series of mathematical operations
are performed on the input data. Nonetheless, the resulting
EOFs (ie, eigenvectors) associated with eigenvalues have been
interpreted as representing natural modes or patterns associated
with the input data. In particular, the low order modes (first
few EOFs) have been used in many studies.

The time series coefficients for each mode reprent the variability
of each mode over the the time span of the data. Even the
lowest mode (ie, the pattern which represents the most variance)
may be unimportant [near 0.0] at any individual time.

Users should make sure that the resulting modes are distinct.
Ie: EOF-1 should be distinct from EOF-2, EOF-2 should be distinct
from EOF-1 and EOF3, etc. If they are not distinct, they may
represent sampling variations (ie noise). North et al (Mon.
Wea. Rev., 110:699-706, 1982) offer a "rule-of-thumb" for
ascertaing if a pattern is distinct.

A little known fact: If you have, say, 8000 grid points
with, say, 10 winters, the maximum possible number of
distinct EOF patterns is 10 (not 8000). Anything more than
10 is guaranteed to be noise.

Your question:

If you have data from one time series at, say, one station
then you can not do an EOF analysis. Why? Well there
can be no covariance matrix. (I guess you could have
a matrix with one entry but ...)

If you have a set of one-dimensional arrays, where each
represents a time series of length N at, say, different stations
or grid-points, then you would have to create a
multi-dimensional array that contains these time series.

eg: let x0, x1, x2, x3, ... represent M one dimensional
    vectors of length N, then

       X = new ( (/M,N/), typeof(x1) )
       X(0,:) = x0
       X(1,:) = x1
       X(2,:) = x2
 
       neval = 3 ; calculate 3 EOFs
       ev = eofcov (X, neval) ; ev(neval,M)
       ev_ts = eofcov_ts (X,ev) ; ev_ts(neval,ntim)

good luck
Dennis Shea



This archive was generated by hypermail 2b29 : Mon Jun 25 2001 - 01:03:57 MDT