notes.016a October 18, 2002 Some Basic Facts About IML. ============================================================================== 1. How to define an array of a specified size: Example 1: x = {1.1 1.0 2.3 3.2 4.5} defines a 1 x 5 array. Example 2: x = {1.1, 1.0, 2.3, 3.2, 4.5} defines a 5 x 1 array. Example 3: x = {1 2 3, 4 5 6} defines a 2 x 3 array: | 1 2 3 | x = | | | 4 5 6 | Example 4: x = j(2, 3, 0) creates a 2 x 3 matrix of all 0's. Example 5: x = j(3) creates a 3 x 3 matrix of all 1's. Example 6: x = j(3, 3, 0) creates a 3 x 3 matrix of all 0's. Example 7: x = 7:10 ; creates a 1 x 4 matrix x = {7 8 9 10}. 2. Elementwise specifications: Example 8: x = j(3, 3, 0); x[1, 1] = 3 ; x[1, 2] = 5 ; x[1, 3] = 7 ; x[2, 1] = 11; x[2, 2] = 13; x[2, 3] = 17 ; x[3, 1] = 19; x[3, 2] = 23; x[3, 3] = 29 ; These statements create the matrix: | 3 5 7 | | | x = | 11 13 17 |. | | | 19 23 29 | Example 9: y = x[2, 3], with x as above. Note y = 17. 3. Operations: 3.1 Addition of matrices: x = {1 2, 3 4} + {3 2, 2 1} = {5 5, 5 5}. Note: dimensions must match. Subtraction is like addition ... 3.2 Multiplication of matrices: x = {1 2, 3 4} * {3 2, 2 1} = {7 4, 17 10}. 3.3 Elementwise multiplication of matrices: x = {1 2, 3 4} # {3 2, 2 1} = {3 4, 6 4}. 3.4 Elementwise power of matrices: x = {1 2, 3 4}##2 = {1 4, 9 16}. 3.5 Maximum of two matrices: x = {1 2, 3 4} <> {3 2, 2 1} = {3 2, 3 4}. Minimum " >< " is similar. 3.6 Transpose of a matrix: If x = {1 2, 3 4}, x` = {1 3, 2 4}. Note: this is the backwards-single-quote mark, not same as: '. 3.7 Inverse of a square matrix: x = inv{1 2, 3 4} = {-2 1, 1.5 -.5}. 3.8 Determinant of a square matrix: x = det{1 2, 3 4} = -2. 3.9 Exponential of a matrix: x = exp{1 2, 3 4} = {exp(1) exp(2), exp(3) exp(4)}. 3.10 Trace of a square matrix (sum of diagonal terms): If x = {1 2, 3 4}, then trace(x) = 1 + 4 = 5. 3.11 Sum of elements of a matrix: sumx = sum(x) : If x = {1 2 3 4}, then sum(x) = 1 + 2 + 3 + 4 = 10. 4. Mistakes ... x = {1 2, 2, 1}. x = {1 2} * {1 2} (should be: x = {1 2} * {1 2}`). 5. Subsets of matrices: | 3 5 7 | If y = | | | 7 6 13 |, then x = y[2, ] = 2nd row = {7 6 13}. z = y[ ,2] = 2nd column = {5, 6}. 6. Joining matrices together vertically: If y = {1 2, 3 4} and x = {11 19}, then | 1 2 | | | y // x = | 3 4 | = [1 2, 3 4, 11 19}. | | |11 19 | Note: dimensions must match properly for this to work. 7. Joining matrices together horizontally: If x = {1 2, 3 4} and y = {11, 17}, then x || y = {1 2 11, 3 4 17}. 8. More examples - if x = {1 2 3, 4 5 6, 7 8 9} and y = x[1, ] and z = x[, 1] and v = x[, 2] || x[, 3] then | 1 2 3 | x = | 4 5 6 | , | 7 8 9 | y = |1 2 3|, | 1 | z = | 4 | , | 7 | | 2 | w = | 5 | , | 8 | | 2 3 | v = | 5 6 | | 8 9 | . 9. Functions of matrices, etc. 8.1 Number of rows of a matrix : r = nrow(x) ; 8.2 Number of columns of a matrix: c = ncol(x) ; 8.3 Sum of elements of a matrix: s = sum(x) ; 8.4 Sum of squares of elements of a matrix: s = ssq(x) ; 8.5 Absolute value : absx = abs(x) ; 10. Miscellaneous. 10.1 Suppose you want to create a 5 x 5 matrix that has the the numbers 1, 2, 3, 4, 5 down the main diagonal and 0's elsewhere: x = j(5, 5, 0) ; do i = 1 to 5 ; x[i, i] = i ; end ; print x ; Another way to do this: b = {1 2 3 4 5} ; diagb = diag(b) ; 10.2 Suppose x and y are n x 1 column vectors, and you want to set the i-th element of x equal to a random element of y: r = nrow(y) ; i = 5 ; rand = 1 + int(r * ranuni(-1)) ; (note rand is a random integer between 1 and r) x[i] = y[rand] ; 11. Eigenvalues and eigenvectors: For a square n x n matrix A, call eigen(x, y, A) ; will create an n x 1 vector x of eigenvalues, and an n x n matrix y of eigenvectors. x = eigval(A) will compute eigenvalues of a square matrix A. x = eigvec(A) will compute an n x n matrix whose columns are eigenvectors of A. 12. Getting data into iml: Create a dataset in 'ordinary' SAS, then 'use' the dataset in proc iml. Read the variables from the dataset into vectors or arrays in proc iml. Example: ============================================================================== DATA lhs ; infile '/home/gnome/john-c/5421/lhs.data' ; INPUT CASENUM AGE GENDER BASECIGS GROUP RANDDATE DEADDATE DEADCODE BODYMASS F31MSTAT VPCQUIT1 VPCQUIT2 VPCQUIT3 VPCQUIT4 VPCQUIT5 CIGSA0 CIGSA1 CIGSA2 CIGSA3 CIGSA4 CIGSA5 S1MFEV S2FEVPRE A1FEVPRE A2FEVPRE A3FEVPRE A4FEVPRE A5FEVPRE S2FEVPOS A1FEVPOS A2FEVPOS A3FEVPOS A4FEVPOS A5FEVPOS WEIGHT0 WEIGHT1 WEIGHT2 WEIGHT3 WEIGHT4 WEIGHT5 ; RUN ; proc iml ; use lhs ; read all var {age gender} into x ; read all var {s2fevpos} into y ; etc. quit ; ============================================================================= The iml section above "uses" the dataset lhs, and puts the two variables, age and gender, into a 500 x 2 array. It reads the one variable s2fevpos from lhs and puts the result into a 500 x 1 column vector. ======================================================================== 12. Writing a dataset out of iml: Writing data out of proc iml is accomplished by the use of the "create" statement. For example, in proc iml, the following code creates a dataset called 'yobs': Example: within proc iml: ------------------------------------------------------------------------------- varnames = {'y1' 'y2'} ; * Create a 1 x 2 array of labels ... create yobs from V [colname = varnames]; * V is an n x 2 array ... append from V ; * read data from V into yobs quit ; data yobs; set yobs; * dataset yobs has variables y1, y2 on it. ysum = y1 + y2 ; etc. run ; =============================================================================== /home/gnome/john-c/5421/notes.016a Last date revised: October 12, 2011.