## Output from imlproj.sas

Source
0 Graphs

```NOTE: Capture of log output started.
```
```NOTE: %INCLUDE (level 1) file n:\psy6140\examples\iml\imlproj.sas is file
n:\psy6140\examples\iml\imlproj.sas.```
```803  +title 'IMLPROJ: Projections';
804  +proc iml;```
`IML Ready`
```805  +   *-- Define a function for a projection of y on X;
806  +start proj(y,X) global(P);
807  +   reset noprint;
808  +   if nrow(X)=1 then X = t(X);
809  +   XPX = t(X) * X;
810  +   P = X * ginv(XPX) * t(X);
811  +   reset print;
812  +   return( P * y );
813  +   finish;```
`NOTE: Module PROJ defined.`
```814  +
815  +   *-- Define a length function (LEN);
816  +start len(X);
817  +   return (sqrt( X[##,] ));
818  +   finish;```
`NOTE: Module LEN defined.`
```819  +
820  +   reset print log fuzz fw=6;
821  +*PROJECTIONS (BOCK: EX.2.6-1);
822  +X= {1 1, 1 1, 1 -1, 1 -1};```
```                X             4 rows      2 cols    (numeric)

1      1
1      1
1     -1
1     -1

```
`823  +Y= t(1:4);`
```                Y             4 rows      1 col     (numeric)

1
2
3
4

```
```824  +* 1. Project y on X[,1] and X[,2] separately;
825  +r = proj(y,X[,1]);```
`WARNING: Temporary variable passed as result to module PROJ, argument X.`
```                R             4 rows      1 col     (numeric)

2.5
2.5
2.5
2.5

```
`826  +r = proj(y,X[,2]);`
`WARNING: Temporary variable passed as result to module PROJ, argument X.`
```                R             4 rows      1 col     (numeric)

-1
-1
1
1

```
```827  +
828  +* 2. Resolve y into 2 orthogonal components, u and v such that
829  +     y = u + v  and u  *  v = 0;
830  +u = proj(y,X);```
```                U             4 rows      1 col     (numeric)

1.5
1.5
3.5
3.5

```
```831  +* 3. the projection matrix is P: ;
832  +print P;```
```                              P
0.5    0.5      0      0
0.5    0.5      0      0
0      0    0.5    0.5
0      0    0.5    0.5
```
`833  +V=(I(4) - P)  *  Y;`
```                V             4 rows      1 col     (numeric)

-0.5
0.5
-0.5
0.5

```
```834  +* 4. u and v are orthogonal, and sum to Y: ;
835  +r = t(u) *  v;```
```                R             1 row       1 col     (numeric)

0

```
`836  +y = u + v;`
```                Y             4 rows      1 col     (numeric)

1
2
3
4

```
```837  +* 5. the sq-lengths sum to y's;
838  +r = len(Y)##2;```
```                R             1 row       1 col     (numeric)

30

```
`839  +r = len(U)##2;`
```                R             1 row       1 col     (numeric)

29

```
`840  +r = len(V)##2;`
```                R             1 row       1 col     (numeric)

1

```
```841  +;
842  +* 6. P and (I-P) are idempotent matrices;
843  +*  --> P = P  *  P;
844  +*  --> det(P)= det(I-P)=0 (not of full rank);
845  +*  --> nrow(P) = rank(P) + rank(I-P);
846  +r = P  *  P;```
```                R             4 rows      4 cols    (numeric)

0.5    0.5      0      0
0.5    0.5      0      0
0      0    0.5    0.5
0      0    0.5    0.5

```
`847  +r = DET(P);`
```                R             1 row       1 col     (numeric)

0

```
`848  +r = echelon(P);`
```                R             4 rows      4 cols    (numeric)

1      1      0      0
0      0      1      1
0      0      0      0
0      0      0      0

```
`849  +r = echelon(I(4) - P);`
```                R             4 rows      4 cols    (numeric)

1     -1      0      0
0      0      1     -1
0      0      0      0
0      0      0      0

```
```851  +/*------------------------------------*
852  + |    The Gram-Schmidt process        |
853  + *------------------------------------*/
854  +*-- MAKES SUCCESSIVE COLUMNS OF A MATRIX ORTHOGONAL.;
855  +X= {1 2 1 6, -1 0 1 2, 1 4 3 3, 0 1 1  0,  1 2 1 0};```
```                X             5 rows      4 cols    (numeric)

1      2      1      6
-1      0      1      2
1      4      3      3
0      1      1      0
1      2      1      0

```
```856  +*-- get lengths of each column;
857  +r = len(X);```
```                R             1 row       4 cols    (numeric)

2      5 3.6056      7

```
`858  +XPX=t(X) *  X;`
```                XPX           4 rows      4 cols    (numeric)

4      8      4      7
8     25     17     24
4     17     13     17
7     24     17     49

```
```859  +*-- The diagonal elements of X'X are the squared column lengths;
860  +r = vecdiag(XPX);```
```                R             4 rows      1 col     (numeric)

4
25
13
49

```
```861  +*-- but X is singular - det(XPX) = 0;
862  +r = det(XPX);```
```                R             1 row       1 col     (numeric)

0

```
```863  +;
864  +* the Gram-Schmidt process finds new matrix, Z, which spans same space.;
865  +Z =J(nrow(X), ncol(X), 0);```
```                Z             5 rows      4 cols    (numeric)

0      0      0      0
0      0      0      0
0      0      0      0
0      0      0      0
0      0      0      0

```
`866  +Z[,1] = X[,1];`
```                Z             5 rows      4 cols    (numeric)

1      0      0      0
-1      0      0      0
1      0      0      0
0      0      0      0
1      0      0      0

```
`867  +Z[,2] = X[,2] - proj(X[,2], Z[,1]);`
`WARNING: Temporary variable passed as result to module PROJ, argument X.`
```                Z             5 rows      4 cols    (numeric)

1      0      0      0
-1      2      0      0
1      2      0      0
0      1      0      0
1      0      0      0

```
```868  +* the next col is linearly dependent since orthog. proj = 0;
869  +Z[,3] = X[,3] - proj(X[,3], Z[,1]) - proj(X[,3], Z[,2]);```
```WARNING: Temporary variable passed as result to module PROJ, argument X.
WARNING: Temporary variable passed as result to module PROJ, argument X.```
```                Z             5 rows      4 cols    (numeric)

1      0      0      0
-1      2      0      0
1      2      0      0
0      1      0      0
1      0      0      0

```
`870  +Z[,4] = X[,4] - proj(X[,4], Z[,1]) - proj(X[,4], Z[,2]);`
```WARNING: Temporary variable passed as result to module PROJ, argument X.
WARNING: Temporary variable passed as result to module PROJ, argument X.```
```                Z             5 rows      4 cols    (numeric)

1      0      0   4.25
-1      2      0 1.5278
1      2      0 -0.972
0      1      0 -1.111
1      0      0  -1.75

```
```871  +
872  +   *-- now, all cols of Z are orthogonal;
873  +ZPZ = t(Z) *  Z;```
```                ZPZ           4 rows      4 cols    (numeric)

4      0      0      0
0      9      0      0
0      0      0      0
0      0      0 25.639

```
```874  +   *-- but they differ in length;
875  +r = len(Z);```
```                R             1 row       4 cols    (numeric)

2      3      0 5.0635

```
```876  +   *-- delete column 3 (0 vector);
877  +Z = Z[,{1 2 4}];```
```                Z             5 rows      3 cols    (numeric)

1      0   4.25
-1      2 1.5278
1      2 -0.972
0      1 -1.111
1      0  -1.75

```
```878  +   *-- and normalize the columns to make lengths = 1;
879  +Z = Z * diag( 1 / len(Z) ) ;```
```                Z             5 rows      3 cols    (numeric)

0.5      0 0.8393
-0.5 0.6667 0.3017
0.5 0.6667 -0.192
0 0.3333 -0.219
0.5      0 -0.346

```
```880  +   *--the new columns of y span the same space,
881  +      but are orthogonal and = length;
882  +r = t(Z) *  Z;```
```                R             3 rows      3 cols    (numeric)

1      0      0
0      1      0
0      0      1

```
```883  +
884  +*-- The steps above are carried out by the GSORTH routine;
885  +*   Z is orthonormal matrix, same size as X;
886  +*   T is an upper-triangular matrix, such that X = Z*T;
887  +*   flag is 0 if columns of X are linearly independent, else 1;
888  +*   rank deficiency -> 0 columns of Z and 0 rows of T;
889  +
890  + call gsorth(Z,T,flag,X);```
```                Z             5 rows      4 cols    (numeric)

0.5      0      0 0.8393
-0.5 0.6667      0 0.3017
0.5 0.6667      0 -0.192
0 0.3333      0 -0.219
0.5      0      0 -0.346

T             4 rows      4 cols    (numeric)

2      4      2    3.5
0      3      3 3.3333
0      0      0      0
0      0      0 5.0635

FLAG          1 row       1 col     (numeric)

1

```
```891  +
892  +*-- Where orthogonal polynomials come from;
893  + C = {1 1 1, 1 2 4, 1 3 9, 1 4 16};```
```                C             4 rows      3 cols    (numeric)

1      1      1
1      2      4
1      3      9
1      4     16

```
`894  + call gsorth(Z,T,flag,C);`
```                Z             4 rows      3 cols    (numeric)

0.5 -0.671    0.5
0.5 -0.224   -0.5
0.5 0.2236   -0.5
0.5 0.6708    0.5

T             3 rows      3 cols    (numeric)

2      5     15
0 2.2361  11.18
0      0      2

FLAG          1 row       1 col     (numeric)

0

```
`895  +quit;`
`Exiting IML.`
```NOTE: The PROCEDURE IML used 0.39 seconds.

```
`896  +`
`NOTE: %INCLUDE (level 1) ending.`