|
|
|
|
||
|
DEFINITION MODULE CanCor; (******************************************************************* Module CanCor (Version 1.0) Copyright (c) 1993-2006 by Dimitrios Gyalistras and ETH Zurich. Purpose Perform Canonical Correlation Analysis (CCA) of two data matrices in the sub-spaces spanned by their empirical orthogonal functions (EOFs). Remarks Requires input data as calculated by means of procedure PrinComp.MakePCA. Programming o Design Dimitrios Gyalistras 27/07/1993 o Implementation Dimitrios Gyalistras 27/07/1993 ETH Zurich Systems Ecology CHN E 35.1 Universitaetstrasse 16 8092 Zurich SWITZERLAND URLs: <mailto:RAMSES@env.ethz.ch> <http://www.sysecol.ethz.ch> <http://www.sysecol.ethz.ch/SimSoftware/RAMSES> Last revision of definition: 24/05/2002 AF *******************************************************************) FROM DMFiles IMPORT TextFile; IMPORT Errors; FROM LgMatrices IMPORT LMatrix, LVector; FROM PrinComp IMPORT WeightingType; (******************************************************************) CONST (* result codes returned *) allOk = Errors.allOk; notDone = Errors.onlyAnInsert; CONST (* types of matrices supported *) ccCoeffSqMatType = 201; (* squared canonical correlation coefficients *) tvxXMatType = 202; (* X total variances explained by canonical modes *) tvxYMatType = 203; (* Y total variances explained by canonical modes *) mapXMatType = 210; (* X canonical maps *) lvxXMatType = 211; (* X local variances explained by canonical modes *) cmpXMatType = 212; (* X components of canonical modes *) mapYMatType = 220; (* Y canonical maps *) lvxYMatType = 221; (* Y local variances explained by canonical modes *) cmpYMatType = 222; (* Y components of canonical modes *) xEstCmpMatType = 230; (* X estimated components from CCA model application *) yEstMatType = 231; (* Y estimated variables from CCA model application *) yCrossVldMatType = 232; (* Y estimated variables from CCA model cross-validation *) (* Note: the dimensions of all LVector and LMatrix objects used below are determined automatically via procedures LgMatrices.NElems, LgMatrices.NRows and LgMatrices.NCols. *) (*********************************) (*##### Main procedures #####*) (*********************************) PROCEDURE MakeCCA( (* in: input data sets and their means *) xDat : LMatrix; yDat : LMatrix; (* in, or in/out: numbers of EOFs to use *) VAR nXEofs : INTEGER; (* if = 0, minXCumulV or maxXEigValREB is considered *) VAR nYEofs : INTEGER; (* if = 0, minYCumulV or maxYEigValREB is considered *) (* in: criteria used to automatically determine number of EOFs (used only if n*Eofs=0) *) minXCumulV : LONGREAL; (* if undefined or = 0, maxXEigValREB is considered *) minYCumulV : LONGREAL; (* if undefined or = 0, maxYEigValREB is considered *) maxXEigValREB : LONGREAL; maxYEigValREB : LONGREAL; (* in: results of PC analyses (see module PrinComp) *) muX : LMatrix; (* 1 x NCols(X) *) wghtX : LMatrix; (* 1 x NCols(X) *) eigValX : LMatrix; (* 1 x NEofs(X) *) pcX : LMatrix; (* NRows(X) x NCols(X) *) muY : LMatrix; (* 1 x NCols(Y) *) wghtY : LMatrix; (* 1 x NCols(Y) *) eigValY : LMatrix; (* 1 x NEofs(Y) *) pcY : LMatrix; (* NRows(Y) x NCols(Y) *) (* out: results of CCA *) ccCoeffSq : LMatrix; (* 1 x NCCCoeffs *) mapX : LMatrix; (* NCCCoeffs x NCols(X) *) cmpX : LMatrix; (* NRows(X) x NCols(X) *) tvxX : LMatrix; (* 1 x NCols(X) *) lvxX : LMatrix; (* NCCCoeffs x NCols(X) *) mapY : LMatrix; (* NCCCoeffs x NCols(Y) *) cmpY : LMatrix; (* NRows(Y) x NCols(Y) *) tvxY : LMatrix; (* 1 x NCols(Y) *) lvxY : LMatrix; (* NCCCoeffs x NCols(Y) *) VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); PROCEDURE ApplyCCA( (* in: independent data *) xDat : LMatrix; areAnomalies : BOOLEAN; (* if FALSE, X data are converted to anomalies first *) (* in, or in/out: specification of canonical modes to use *) VAR nCanModes : INTEGER; (* if = 0, taken are all modes for which ccCoeffSq is above ccCfSqTrshld *) ccCfSqTrshld : LONGREAL; (* considered only if nCanModes = 0 *) (* in: CCA model parameters *) ccCoeffSq : LMatrix; muX : LMatrix; wghtX : LMatrix; mapX : LMatrix; muY : LMatrix; wghtY : LMatrix; mapY : LMatrix; (* out: estimated components and y-values *) xEstCmp : LMatrix; yEst : LMatrix; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); TYPE PCAResultsProc = PROCEDURE ( (* resultNr *) INTEGER, VAR (* mu *) LMatrix, VAR (* wght *) LMatrix, VAR (* eigVal *) LMatrix, VAR (* pcX *) LMatrix, VAR (* resCode *) INTEGER, VAR (* errTxt *) ARRAY OF CHAR ); PROCEDURE EmptyPCAResultsProc( resultNr : INTEGER; VAR mu : LMatrix; VAR wght : LMatrix; VAR eigVal : LMatrix; VAR pc : LMatrix; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); PROCEDURE CrossValidCCA( (* in: independent data *) xDat : LMatrix; yDat : LMatrix; xWType : WeightingType; yWType : WeightingType; (* in, or in/out: numbers of EOFs to use *) VAR nXEofs : INTEGER; (* if = 0, minXCumulV or maxXEigValREB is considered *) VAR nYEofs : INTEGER; (* if = 0, minYCumulV or maxYEigValREB is considered *) (* in: criteria used to automatically determine number of EOFs (used only if n*Eofs=0) *) minXCumulV : LONGREAL; (* if undefined or = 0, maxXEigValREB is considered *) minYCumulV : LONGREAL; (* if undefined or = 0, maxYEigValREB is considered *) maxXEigValREB : LONGREAL; maxYEigValREB : LONGREAL; (* in: procedures for geting pre-calculated eofs *) getXPCAResults : PCAResultsProc; getYPCAResults : PCAResultsProc; (* in: specification of canonical modes to use *) nCanModes : INTEGER; (* if = 0, taken are all modes for which ccCoeffSq is above ccCfSqTrshld *) ccCfSqTrshld : LONGREAL; (* considered only if nCanModes = 0 *) (* in: procedure called to signify progress report *) progrReport : PROC; (* out: results from cross-validation *) yCrossVld : LMatrix; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (**************************) (*##### Auxilary #####*) (**************************) PROCEDURE InDataMatsOK( xDat : LMatrix; yDat : LMatrix; xGenericDescr : ARRAY OF CHAR; (* used if xDat has no descriptor attached to it *) yGenericDescr : ARRAY OF CHAR; (* used if yDat has no descriptor attached to it *) callee : ARRAY OF CHAR; VAR errTxt : ARRAY OF CHAR ): BOOLEAN; PROCEDURE NCanModesOK( ccCoeffSq : LMatrix; nCanModes : INTEGER; genericDescr : ARRAY OF CHAR; (* used if ccCoeffSq has no descriptor attached to it *) callee : ARRAY OF CHAR; VAR errTxt : ARRAY OF CHAR ): BOOLEAN; PROCEDURE GetNumCanModes( ccCoeffSq : LMatrix; ccCfSqTrshld : LONGREAL; VAR nCanModes : INTEGER; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (* Returns the number of canonical modes for which ccCoeffSq is above ccCfSqTrshld. *) PROCEDURE AllocCCAResVars( nXEofs : INTEGER; nYEofs : INTEGER; xDat : LMatrix; yDat : LMatrix; VAR ccCoeffSq : LMatrix; VAR mapX, cmpX, tvxX, lvxX : LMatrix; VAR mapY, cmpY, tvxY, lvxY : LMatrix; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); PROCEDURE DeallocCCAResVars( VAR ccCoeffSq : LMatrix; VAR mapX, cmpX, tvxX, lvxX : LMatrix; VAR mapY, cmpY, tvxY, lvxY : LMatrix ); (************************************) (*##### I/O of CCA results #####*) (************************************) PROCEDURE WriteCCAResults( VAR outF : TextFile; (* main results *) wrCcCoeffSq : BOOLEAN; ccCoeffSq : LMatrix; wrTvxX : BOOLEAN; tvxX : LMatrix; wrTvxY : BOOLEAN; tvxY : LMatrix; (* X model parameters *) wrMuX : BOOLEAN; muX : LMatrix; wrWghtX : BOOLEAN; wghtX : LMatrix; wrMapX : BOOLEAN; mapX : LMatrix; (* Y model parameters *) wrMuY : BOOLEAN; muY : LMatrix; wrWghtY : BOOLEAN; wghtY : LMatrix; wrMapY : BOOLEAN; mapY : LMatrix; (* X local explained variances and components *) wrLvxX : BOOLEAN; lvxX : LMatrix; wrCmpX : BOOLEAN; cmpX : LMatrix; (* Y local explained variances and components *) wrLvxY : BOOLEAN; lvxY : LMatrix; wrCmpY : BOOLEAN; cmpY : LMatrix; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); PROCEDURE ReadCCAResults( inFName : ARRAY OF CHAR; tryOpenFile : BOOLEAN; keepFileOpen : BOOLEAN; (* main results *) rdCcCoeffSq : BOOLEAN; VAR ccCoeffSq : LMatrix; rdTvxX : BOOLEAN; VAR tvxX : LMatrix; rdTvxY : BOOLEAN; VAR tvxY : LMatrix; (* X model parameters *) rdMuX : BOOLEAN; VAR muX : LMatrix; rdWghtX : BOOLEAN; VAR wghtX : LMatrix; rdMapX : BOOLEAN; VAR mapX : LMatrix; (* Y model parameters *) rdMuY : BOOLEAN; VAR muY : LMatrix; rdWghtY : BOOLEAN; VAR wghtY : LMatrix; rdMapY : BOOLEAN; VAR mapY : LMatrix; (* X local explained variances and components *) rdLvxX : BOOLEAN; VAR lvxX : LMatrix; rdCmpX : BOOLEAN; VAR cmpX : LMatrix; (* Y local explained variances and components *) rdLvxY : BOOLEAN; VAR lvxY : LMatrix; rdCmpY : BOOLEAN; VAR cmpY : LMatrix; VAR endOfFile : BOOLEAN; VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); END CanCor.
|
||
|
|
|