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.