0% found this document useful (0 votes)
101 views

SAS/IML - Interactive Matrix Language

SAS/IML is an interactive programming language that uses matrices as its fundamental data structure. It allows accessing and modifying SAS data sets. SAS/IML provides operators and functions for performing calculations on entire matrices at once and supports defining custom functions. The language also enables interactive execution of commands or collection of commands into modules.

Uploaded by

Débora Morales
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
101 views

SAS/IML - Interactive Matrix Language

SAS/IML is an interactive programming language that uses matrices as its fundamental data structure. It allows accessing and modifying SAS data sets. SAS/IML provides operators and functions for performing calculations on entire matrices at once and supports defining custom functions. The language also enables interactive execution of commands or collection of commands into modules.

Uploaded by

Débora Morales
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 41

SAS/IML - Interactive Matrix Language

v SAS/IML is part of the SAS system


v you can access SAS data sets or external files
v you can edit existing SAS data sets or create new SAS data sets

v The fundamental data element in SAS/IML is a data matrix

v SAS/IML is a programming language


v a wide range of subroutines are available
v you have access to many operators and functions
v a complete set of control statements is available
v you can define your own functions or subroutines using SAS/IML modules

v SAS/IML uses operators and functions that apply to an entire matrix

v SAS/IML is interactive
v commands can be executed as entered or
v commands can be collected in a module and executed later

v SAS/IML processes data


v you can read all observations or conditionally select observations from a SAS
v data set into a matrix
v you can create a new SAS data set or edit or append observations to an existing SAS data
set

10-1
SAMPLE IML SESSION

3476 PROC IML ;


IML Ready
3477 RESET PRINT;
3478
3479 A=3 ;
3480
3481 B={1 2 3 } ;
3482
3483 C={1, 2, 3} ;
3484
3485 D={1 2 3, 4 5 6} ;
3486
3487 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 0.22 seconds.
----------------------------------------------------

A 1 row 1 col (numeric)


3

B 1 row 3 cols (numeric)

1 2 3

C 3 rows 1 col (numeric)

1
2
3

D 2 rows 3 cols (numeric)

1 2 3
4 5 6

10-2
DEFINING A MATRIX

v The fundamental data object on which all IML commands operate is a two-dimensional
numeric or character matrix

v matrices in SAS have the following properties:

v matrices can be either character or numeric


v elements in a numeric matrix are stored in double precision
v elements of a character matrix are character strings of equal length
v matrices are referred to by valid SAS names
v matrices have dimension defined by the number of rows and columns
v matrices can contain elements that have missing values

v The dimension of a matrix is defined by the number of rows and columns it has. An m X n
matrix has mn elements arranged in m rows and n columns

1 X n matrices are called row vectors

m X 1 matrices are called column vectors

1 X 1 matrices are called scalers

10-3
ROW VECTOR 1 X N

R 1 row 3 cols (numeric)

1 2 3

COLUMN VECTOR M X 1

C 3 rows 1 col (numeric)

1
2
3

SCALAR 1 X 1

S 1 row 1 col (numeric)

M X N MATRIX

M 3 rows 3 cols (numeric)

1 2 3
4 5 6
7 8 9

10-4
MATRIX NAMES and MATRIX LITERALS

A) Matrix Names
- a matrix is referred to by a valid SAS name
- naming convention rules are the same as in Base SAS
- a name is associated with a matrix when the matrix is created
- the type(character or numeric), dimension, or values of a matrix can be changed at any time

B) Matrix Literals
- when you represent a matrix by a literal, you specify the values of each element of the
matrix.
- matrix literals can have a single element or have many elements arranged in rectangular
form.
- if there are multiple elements, use braces({ }) to enclose the values and commas
to separate the rows.
- within the braces, values must be either all numeric or all character.
- all rows must have the same number of elements.

C) Scaler Literals

a=12 ;
a=. ;
a='bios 111'
a="BIOS111" ;

D) Numeric Literals

x={1 2 3 4 5 6} ;

assigns a row vector to the matrix X

y={1,2,3,4,5} ;

assigns a column vector to the matrix Y

z={1 2, 3 4, 5 6} ;

assigns a 3X2 matrix literal to the matrix Z

E) Character Literals

- are input by entering character strings


- if you don't use quotes all elements are converted to upper case
- you must you singe or double quotes to preserve case or when blanks or special
characters are in the string
- the legnth of the elements is determined by the length of the longest string
- shorter strings are padded on the right with blanks

10-5
a={abc defg} ;

creates A, a 1X2 matrix, with string legnth 4

A
ABC DEFG

a={'abc' 'DEFG'}

preserves the case of the elements

A
abc DEFG

F) Reassigning Values

You can reassign values to a matrix at any time.


The statement below create a 2X3 numeric matrix
named A .

a={1 2 3, 4 5 6} ;

The statement

a={'Gonzo' 'Piggy' } ;

redefines matrix A as a 1X3 character matrix.

10-6
Scaler Literals Example

84 PROC IML ;
IML Ready
85 RESET PRINT ;
86
87 A = 12 ;
88 B = . ;
89 C = 'bios 111' ;
90 d = "BIOS111" ;
91
92 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 0.71 seconds.

SCALER LITERALS

A 1 row 1 col (numeric)

12

B 1 row 1 col (numeric)

C 1 row 1 col (character, size 8)

bios 111

D 1 row 1 col (character, size 7)

BIOS111

10-7
Numeric Literals Example
93 TITLE "NUMERIC LITERALS" ;
94 PROC IML ;
IML Ready
95 RESET PRINT ;
96
97 X = {1 2 3 4 5 6} ;
98 Y = {1,2,3,4,5} ;
99 Z = {1 2, 3 4, 5 6} ;
100
101 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 4.0 seconds.

NUMERIC LITERALS

X 1 row 6 cols (numeric)

1 2 3 4 5 6

Y 5 rows 1 col (numeric)

1
2
3
4
5

Z 3 rows 2 cols (numeric)

1 2
3 4
5 6

10-8
Character Literals Example
93 TITLE "CHARACTER LITERALS" ;
94 PROC IML ;
IML Ready
95 RESET PRINT ;
96
97 A = {abc defg} ;
98 B = {‘abc’‘defg’} ;
99 B = {1 2 3, 4 5 6} ;
100
101 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 4.0 seconds.

CHARACTER LITERALS

A 1 row 2 cols (character, size)

ABC DEFG

B 1 row 2 cols (character, size)

abc defg

B 2 rows 3 cols (numeric)

1 2 3
4 5 6

10-9
IML: ASSIGNMENT STATEMENTS

Assignment statements create matrices by evaluating expressions and assigning results to a matrix

The expressions can be composed of operators or functions

Assignments statements have the general form:

result= expression ;

where result is the name of a new matrix and expression is an expression that is evaluated, the
results of which is assigned to a new matrix

OPERATORS

There are 3 general types of operators used in matrix expressions:

prefix operators are placed in front of operands . For example, -A uses the sign reverse prefix
operator in front of the operand A to reverse the sign of each element of A.

infix operators are placed between operands. For example, A+B uses the addition infix operator (+)
.

postfix operators are placed after an operand. For example, A` uses the transpose postfix operator
after the operand A to transpose A.

10-10
Table A1.1 Operators

Operator Symbol Syntax type Data type


Sign reverse - Prefix Num
Addition + Infix Num
Subtraction - Infix Num
Index creation : Infix Num
Matrix multiplication * Infix Num
Elementwise multiplication # Infix Num
Matrix power ** Infix Num
Elementwise power ## Infix Num
Division / Infix Num
Horizontal concatenation || Infix Both
Vertical concatenation // Infix Both
Element maximum <> Infix Both
Element minimum >< Infix Both
Logical AND & Infix Num
Logical OR | Infix Num
Logical NOT ^ Prefix Num
Less than < Infix Both
Greater than > Infix Both
Equal to = Infix Both
Less than or equal to <= Infix Both
Greater than or equal to >= Infix Both
Not equal to ^= Infix Both
Transpose ` Postfix Both
Subscripts [] Postfix both

Table A1.2 Subscript Reduction Operators

Operator Action
+ Addition
# Multiplication
<> Maximum
>< Minimum
<:> Index of maximum
>:< Index of minimum
: Mean
## Sum of squares

10-11
EXAMPLES:

LET A= 2 2 and B= 4 5
3 4 1 0

A + B yields 6 7 addition
4 4

A # B yields 8 10 elementwise
3 0 multiplication

A * B yields 10 10 matrix
16 15 multiplication

A ##2 yields 4 4 element power


9 16 operator

A <>B yields 4 5 element maximum


3 4 operator

A <=B yields 1 1 less than or


0 0 equal to operator

A` 2 3 transpose operator
2 4

A || B yields 2 2 4 5 horizontal
3 4 1 0 concatenation

A // B yields 2 2 vertical
3 4 concatenation
4 5
1 0

10-12
Operators Example

123 PROC IML ;


IML Ready
124 RESET PRINT ;
125
126 A = {2 2, 3 4} ;
127 B = {4 5, 1 0} ;
128 C = -B ;
129 D = A + B ;
130 E = A` ;
131
132 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 0.5 seconds.

OPERATORS

A 2 rows 2 cols (numeric)

2 2
3 4

B 2 rows 2 cols (numeric)

4 5
1 0

C 2 rows 2 cols (numeric)

-4 -5
-1 0

10-13
D 2 rows 2 cols (numeric)

6 7
4 4

E 2 rows 2 cols (numeric)

2 3
2 4

IML: SUBSCRIPTS
Subscripts are special postfix operators placed in square brackets([ ]) after a matrix operand.
Subscript operators have the general form:

operand[row,column]

where

operand is usually a matrix name

row is an expression selecting 1 or more rows

column is an expression selecting 1 or more columns

subscripts are used to:

- refer to a single element of a matrix

- refer to entire row or column of a matrix

- refer to a submatrix within a matrix

- preform a reduction across rows or columns of a matrix

10-14
SELECTING A SINGLE ELEMENT

You can select a single element in two ways. You can use two subscipts (row,column), or you can
use 1 subscript to look for the element down the rows.

For example:

LET A= 1 2 3
4 5 6
7 8 9

B=A[2,3] yields 6

You can also look for an element down the rows. In this case you would refer to this element as the
sixth element of A .

B=A[6] ;

SELECTING A ROW OR COLUMN

To select an entire row or column, write the subscript with the row or column number, omitting the
other subscript but not the comma.

To select row 1 of matrix A.

C=A[1,] ; C
1 2 3

To select column 2 of A.

D=A[,2] ; D
2
5
8

10-15
SUBMATRICES

You can refer to submatrix by the specific rows and columns that you want. Include within the
brackets the row you want, a comma, and the columns you want.

To create a submatrix consisting of the first and third rows and the first and second columns of A:

E=A[{1 3},{1,2}] ; E
1 2
7 8

You can use the index creation operator(:) to refer to successive rows or columns. For example, to
create a submatrix consisting of rows 1-3 and columns 1-2 from B :

LET B= 1 2 3 4
5 6 7 8
9 10 11 12

F=B[1:3,1:2] ; F

1 2
5 6
9 10

SUBSCRIPT ASSIGNMENT

You can assign values into a matrix using subscripts to refer to the element or submatrix. For
example to change the value in the first row, second column of A from 2 to 30:

A[1,2]=30;

To change the values in column 3 of A:

A[,3]={20 30 40} ; A
1 2 20
4 5 30
7 8 40

10-16
Subscript Reduction Operators

You can use subscript reduction operators to perform operations across all rows or columns. Using
these operators will result in a matrix of reduced dimensions. For example, subscript reduction
operators can be used to obtain column sums, row sums, or column or row means. To get column
sums of the matrix X (sum across the rows, which reduces the row dimension to 1), specify X[+,1].
The first subscript (+) indicates summation reduction takes place across the rows. Omitting the
column subscript, leaves the column dimension unchanged.

These operators can be used to reduce rows, columns, or both. When both rows and columns are
reduced, rows are reduced first. Table A1.2 lists the eight operators for subscript reduction.

Subscript Reduction Operators Examples

PROC IML;
RESET PRINT ;
A={0 1 2,5 4 3,7 6 8} ;
B=A[,+] ;
C=A[,:] ;
D=A[+,] ;
E=A[:,] ;
QUIT;

A 3 rows 3 cols (numeric)

0 1 2
5 4 3
7 6 8

B 3 rows 1 col (numeric)

3
12
21

10-17
C 3 rows 1 col (numeric)

1
4
7

D 1 row 3 cols (numeric)

12 11 13

E 1 row 3 cols (numeric)

4 3.6666667 4.3333333

FUNCTIONS AS EXPRESSIONS

Matrices can also be created as a result of a function call. Scalar functions such as LOG or SQRT
operate on each element of the matrix, while matrix function such as INV or RANK operate on the
entire matrix. The general form of a function is:

result=FUNCTION(arguements) ;

For example:

A=SQRT(B) ;

assigns the square root of each element of B to the corresponding element of A.

10-18
MATRIX GENERATING FUNCTIONS

THE BLOCK FUNCTION

BLOCK(matrix1,matrix2,...) ;

creates a block diagonal matrix from the argument matrices

A 2 rows 2 cols (numeric)

1 1
1 1

B 2 rows 2 cols (numeric)

2 2
2 2

C = BLOCK(A,B) ; RESULTS IN THE MATRIX

C 4 rows 4 cols (numeric)

1 1 0 0
1 1 0 0
0 0 2 2
0 0 2 2

THE J FUNCTION

J(nrow,rcol,value) ;

creates a matrix with nrow rows, ncol columns, and all element
values equal to value

10-19
C = J(2,2,1) ; RESULTS IN THE MATRIX

C 2 rows 2 cols (numeric)

1 1
1 1

THE I FUNCTION

I(dimension) ;

generates an identity matrix with dimension rows and dimension


columns.

C = I(3) ; RESULTS IN THE MATRIX

C 3 rows 3 cols (numeric)

1 0 0
0 1 0
0 0 1

OTHER USEFUL FUNCTIONS

THE NCOL FUNCTION

NCOL(matrix) ;

Returns a scalar containing the number of columns in a matrix.

For example, to let B contain the number of columns in A, use the


statement

B=NCOL(A) ;

10-20
THE NROW FUNCTION

NROW(matrix) ;

Returns a scalar containing the number of rows in a matrix.

For example, to let B contain the number of rows in A, use the


statement

B=NROW(A) ;

THE ABS FUNCTION

ABS(matrix) ;

Returns a matrix containing the absolute value of every element in


the input matrix, where matrix is a numeric matrix or literal

An example of how to use the ABS function is

C=ABS(A) ;

THE SQRT FUNCTION

SQRT(matrix) ;

Returns a matrix containing the square roots of every element in


the input matrix, where matrix is a numeric matrix or literal

An example of how to use the SQRT function is

C=SQRT(A) ;

10-21
THE EXP FUNCTION

EXP(matrix) ;

Returns a matrix containing the exponential function of every


element in the input matrix, where matrix is a numeric matrix or
literal

B={2 3 4} ;

A=EXP(b) ; returns the matrix

A 1 row 3 col (numeric)

7.3890561 20.085537 54.59815

THE LOG FUNCTION

LOG(matrix) ;

Returns a matrix containing the natural logarithm of every element


in the input matrix, where matrix is a numeric matrix or literal

An example of how to use the LOG function is

C=LOG(A) ;

THE MAX FUNCTION

MAX(matrix1,matrix2, ...matrix15) ;

Returns a scalar that is the largest element in all arguments.


There can be as many as 15 argument matrices. The input matrices
can be numeric, character or literal. The function checks for
missing numeric values and does not include them in the result.

10-22
An example of how to use the MAX function is

C=MAX(A) ;

Note: there is also a MIN function that works the


same way.

THE DET FUNCTION

DET(matrix) ;

Returns a scalar containing the determinant of a square matrix,


where matrix is a numeric matrix or literal

An example of how to use the DET function is

C=DET(A) ;

THE INV FUNCTION

INV(matrix) ;

Returns the inverse of a matrix, where matrix is a square and


nonsingular matrix.

An example of how to use the INV function is

C=INV(A) ;

THE DIAG FUNCTION

DIAG(matrix) ;

where matrix can either be a numeric square matrix or a vector.

10-23
If matrix is a square matrix, the DIAG function creates a matrix
with diagonal elements equal to the corresponding diagonal
elements. All off-diagonal elements in the new matrix are zeros.

If matrix is a vector, the DIAG function creates a matrix whose


diagonal elements are the values of the vector. All off-diagonal
elements are zeros.

For example,

A={4 3,
2 1} ;

C=DIAG(A) ; results in

C 2 rows 2 cols (numeric)

4 0
0 1

B={1 2 3} ;
D=DIAG(B) ; results in

D 3 rows 3 cols (numeric)

1 0 0
0 2 0
0 0 3

THE VECDIAG FUNCTION

VECDIAG(matrix) ;

returns a column vector whose elements are the main diagonal


elements of matrix, where matrix is a square numeric matrix.

10-24
For example

A={4 3,
2 1} ;

C=DIAG(A) ; results in

C 2 rows 1 cols (numeric)

4
1

10-25
Functions Example

proc logistic data=in.v2 covout


outest=out(drop=_link_ _type_ _name_ _lnlike_) noprint ;
model smoker = sysba chol trig alcohol;
run;

PROC IML;
RESET PRINT ;
USE OUT;
READ ALL INTO VB ; /* betas/variance covariance matrix */
NVB= NROW(VB); /* number of rows in VB */
BETA=VB[1,]; /* row vector or betas */
BETA=BETA`; /* convert to column vector of betas*/
V=VB[2:NVB,]; /* variance covariance matrix */
V=VECDIAG(V) ; /* column vector of variances */
S=SQRT(V) ; /* column vector of standard errors */
L=BETA - (1.96#S) ; /* lower 95% CI */
H=BETA + (1.96#S) ; /* upper 95% CI */
LBH = BETA || L || H ; /* lower CI, betas, upper CI */
QUIT;

OUT DATA SET


OBS INTERCEP SYSBA CHOL TRIG ALCOHOL

1 2.10335 0.01019 -0.01004 .00023 -0.02835


2 2.94187 -0.01546 -0.00389 .00001 -0.00135
3 -0.01546 0.00014 -0.00001 .00000 -0.00002
4 -0.00389 -0.00001 0.00002 .00000 0.00001
5 0.00001 0.00000 0.00000 .00000 0.00000
6 -0.00135 -0.00002 0.00001 .00000 0.00016

10-26
IML Output

VB 6 rows 5 cols (numeric)

2.10335 0.01019 -0.01004 0.00023 -0.02835


2.94187 -0.01546 -0.00389 0.00001 -0.00135
-0.01546 0.00014 -0.00001 0 -0.00002
-0.00389 -0.00001 0.00002 0 0.00001
0.00001 0 0 0 0
-0.00135 -0.00002 0.00001 0 0.00016

NVB 1 row 1 col (numeric)

BETA 1 row 5 cols (numeric)

2.10335 0.01019 -0.01004 0.00023 -0.02835

BETA 5 rows 1 col (numeric)

2.10335
0.01019
-0.01004
0.00023
-0.02835

V 5 rows 5 cols (numeric)

2.94187 -0.01546 -0.00389 0.00001 -0.00135


-0.01546 0.00014 -0.00001 0 -0.00002
-0.00389 -0.00001 0.00002 0 0.00001
0.00001 0 0 0 0
-0.00135 -0.00002 0.00001 0 0.00016

10-27
V 5 rows 1 col (numeric)

2.94187
0.00014
0.00002
0
0.00016

S 5 rows 1 col (numeric)

1.715188
0.0118322
0.0044721
0
0.0126491

L 5 rows 1 col (numeric)

-1.258419
-0.013001
-0.018805
0.00023
-0.053142

H 5 rows 1 col (numeric)

5.4651186
0.033381
-0.001275
0.00023
-0.003558

LBH 5 rows 3 cols (numeric)

2.10335 -1.258419 5.4651186


0.01019 -0.013001 0.033381
-0.01004 -0.018805 -0.001275
0.00023 0.00023 0.00023
-0.02835 -0.053142 -0.003558

10-28
WORKING WITH SAS DATA SETS
v SAS/IML software can pass data from SAS data sets to matrices and from matrices to SAS data
sets.

v You can create matrices from the variables and observations in several ways. You can create a
column vector for each data set variable, or you can create a matrix where columns correspond
to data set variables.

v You can use all observations in a data set or a subset of them.

v You can create a SAS data set from a matrix. The columns correspond to data set variables and
the rows correspond to observations.

OPENING A SAS DATASET

v Before you can access a SAS data set, you must first open it. There are three ways to open a
SAS data set:

v To read from an existing SAS dataset, submit a USE command to open it. The general form of
the USE statement is:

USE sas_dataset <VAR operand> <WHERE expression>;

v To read and write to an existing SAS data set, use the EDIT statement. The general form of
the EDIT statement is:

EDIT sas_dataset <VAR operand> <WHERE expression>;

v To create a new SAS dataset, use the CREATE statement. The general form of the CREATE
statement is:

CREATE sas_dataset <VAR operand>;


CREATE sas_dataset FROM from_name
<[COLNAME=column_name ROWNAME=row_name}> ;

v Use the APPEND statement to place observation into the newly created data set. If you don't
use the APPEND statement, the new data set will have no records.

READING OBSERVATION FROM A SAS DATASET

v Transferring data from a SAS data set to a matrix is done with the READ statement.

v The SAS data set that you want to read from must already be open.

10-29
v You can open a SAS data set with the USE or EDIT statement.

v The general form of the READ statement is:

READ <range> <var operand> <where expression> <into name> ;

where

range specifies a range of observations

operand selects a set of variables

expression is a true/false expression

name names a target matrix for the data

USING THE READ STATEMENT WITH THE VAR CLAUSE


v Use the READ statement with the VAR clause to read variables from the current SAS data set
into column vectors of the VAR clause.

v Each variable in the VAR clause becomes a column vector with the same name as the variable
in the SAS data set.

v The number of observations is equal to the number of observations processed, depending on


the range specification and the WHERE clause.

v For example, to read the variables AGE, HEIGHT, and WEIGHT for all observations in
CLASS, use the statements
USE classlib.class ;
READ all VAR{age height weight} ;

The read statement above creates 3 numeric vectors AGE, HEIGHT, and WEIGHT. The two
statements above can also be written as:

USE classlib VAR{age height weight} ;


READ all ;

10-30
USING THE READ STATEMENT WITH THE VAR & INTO CLAUSES

v You can use the READ statement with the VAR and INTO clauses to read the variables listed
in the VAR clause into a single matrix named in the INTO clause.

v Each variable in the VAR clause becomes a column in the target matrix. If there are p variables
in the var clause and n observations processed, the target matrix in the INTO clause is an nXp
matrix.

v The following creates a matrix X containing all numeric variables in the CLASS data set.

USE classlib.class ;
READ all VAR _num_ INTO X ;

USING THE READ STATEMENT WITH THE WHERE CLAUSE

You can use the WHERE clause to conditionally select observations from within the specified
range. IF you want to create a matrix FEMALE containing AGE, HEIGHT, and WEIGHT for
females only:

USE classlib.class ;
READ all VAR _num_ INTO female WHERE(sex="F");

CREATING A SAS DATASET FROM A MATRIX

v The CREATE and APPEND statements can be used to create a SAS data set from a matrix.

v The columns of the matrix become the data set variables and the rows of the matrix become the
observations.

v An nXm matrix creates a SAS data set with m variables and n observations.

v The CREATE statement opens the new SAS data set for both input and output, and the
APPEND statement writes to the SAS data set.

10-31
USING THE CREATE STATEMENT WITH THE FROM OPTION

You can create a SAS data set from a matrix using the CREATE statement with the FROM
option. This form of the CREATE statement is:

CREATE sas_dataset FROM matrix


<[COLNAME=column_name ROWNAME=row_name]> ;

where

sas_dataset names the new SAS data set

matrix names the matrix containing the data

column_name names the variables in the data set

row_name adds a variable containing row tiles to the data set

Suppose you want to create a SAS data set named RATIO containing a variable with the height-to-
weight ratios for each student and the ratio is stored in a one column matrix called HTWT. You can
use the CREATE and APPEND statements to open a new SAS data set called RATIO and append
the observations, naming the data set variable HTWT instead of COL1.

CREATE ratio FROM htwt[COLNAME='htwt'] ;


APPEND from htwt;

USING THE CREATE STATEMENT WITH THE VAR CLAUSE

You can create a SAS dataset from a matrix using the CREATE statement with the VAR option.
This form of the CREATE statement is:

CREATE sas_dataset <VAR operand> ;

where operand are the variables to be included in the SAS data set

For example the following statements create a new SAS data set CLASS having variables NAME,
SEX, AGE, HT, and WT. The data come from IML matrices having the same name.

CREATE class VAR{name sex age ht wt} ;


APPEND ;

you could not do the above using the FROM option because NAME and SEX are character, while
AGE, WT, and HT are numeric.

10-32
Working With SAS Data sets: Examples

20 PROC IML ;
IML Ready
21 USE SC.CLASS ;
23 ** LIST ALL OPEN DATASETS ** ;
25 SHOW DATASETS ;
27 ** CONTENTS OF ALL OPEN DATASETS ** ;
29 SHOW CONTENTS ;
31 READ ALL VAR{AGE HT WT} ;
33 ** LIST ALL MATRICES CREATED SO FAR ** ;
35 SHOW NAMES ;
36
37 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 0.32 seconds.

LIBNAME MEMNAME OPEN MODE STATUS


------- ------- --------- ------
SC .CLASS Input Current Input

DATASET : SC.CLASS.DATA

VAR NAME TYPE SIZE


NAME CHAR 12
SEX CHAR 1
AGE NUM 8
HT NUM 8
WT NUM 8
Number of Variables: 5
Number of Observations: 6

AGE 6 rows 1 col num 8


HT 6 rows 1 col num 8
WT 6 rows 1 col num 8
Number of symbols = 5 (includes those without values)

10-33
Working With SAS Datasets: Examples

38 PROC IML ;
IML Ready
39 USE SC.CLASS ;
40
41 READ ALL VAR _NUM_ INTO X ;
42
43 ** PRINT X ** ;
44
45 PRINT X ;
46
47 ** CLOSE SC.CLASS ** ;
48
49 CLOSE SC.CLASS ;
50 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 4.78 seconds.

_________________________________________

X
37 71 195
31 70 160
41 74 195
. 48 .
3 12 1
14 25 45

10-34
Working With SAS Data Sets: Examples

69 PROC IML ;
IML Ready
70 USE SC.CLASS ;
71
72 READ ALL VAR _NUM_ INTO X WHERE(SEX='M');
73
74 ** CREATE MATRIX CONTAINING VARIABLE **
** NAMES ** ;
75
76 NAMES={"AGE" "HT" "WT"} ;
77
78 ** PRINT X ** ;
79
80 PRINT X[COLNAME=NAMES FORMAT=6.2] ;
81
82 ** CLOSE SC.CLASS ** ;
83
84 CLOSE SC.CLASS ;
85 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 2.37 seconds.

_________________________________________

X AGE HT WT

37.00 71.00 195.00


31.00 70.00 160.00
41.00 74.00 195.00
3.00 12.00 1.00

10-35
Working With SAS Datasets: Examples

161 PROC IML ;


IML Ready
162 USE SC.CLASS ;
163
164 READ ALL VAR _NUM_
165 INTO X[COLNAME=NAMES ROWNAME=NAME]
166 WHERE(SEX='M') ;
167
168 ** PRINT X ** ;
169
170 PRINT "CLASS DATESET",
171 X[COLNAME=NAMES ROWNAME=NAME FORMAT=6.2] ;
172
173 ** CLOSE SC.CLASS ** ;
174
175 CLOSE SC.CLASS ;
176 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 0.28 seconds.

_________________________________________

CLASS DATESET

X AGE HT WT

CHRISTIANSEN 37.00 71.00 195.00


HOSKING J 31.00 70.00 160.00
HELMS R 41.00 74.00 195.00
FROG K 3.00 12.00 1.00

10-36
Working With SAS Datasets: Examples

36 PROC IML ;
37 USE SC.CLASS ;
38 READ ALL ;
39 HTWT=HT/WT ;
40 SHOW NAMES ;
41 CREATE RATIO FROM HTWT[COLNAME='HTWT'];
42 APPEND FROM HTWT;
43 SHOW DATASETS ;
44 SHOW CONTENTS ;
45 CLOSE RATIO ;
NOTE: The data set WORK.RATIO has 6 observations and 1 variables.
46 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 0.66 seconds.
_________________________________________

AGE 6 rows 1 col num 8


HT 6 rows 1 col num 8
HTWT 6 rows 1 col num 8
NAME 6 rows 1 col char 12
SEX 6 rows 1 col char 1
WT 6 rows 1 col num 8

LIBNAME MEMNAME OPEN MODE STATUS


------- ------- --------- ------
SC .CLASS Input
WORK .RATIO Update Current Input Current Output

DATASET : WORK.RATIO.DATA

VAR NAME TYPE SIZE


HTWT NUM 8
Number of Variables: 1
Number of Observations: 6

10-37
Working With SAS Datasets: Examples

47 PROC IML ;
48 USE SC.CLASS ;
49 READ ALL VAR{NAME SEX HT WT} ;
50 SHOW NAMES ;
51 CREATE RATIO2 VAR{NAME SEX HT WT};
52 APPEND ;
53 SHOW DATASETS ;
54 SHOW CONTENTS ;
55 CLOSE RATIO2 ;
NOTE: The data set WORK.RATIO2 has 6 observations and 4 variables.
56 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 7.96 seconds.
_________________________________________

HT 6 rows 1 col num 8


NAME 6 rows 1 col char 12
SEX 6 rows 1 col char 1
WT 6 rows 1 col num 8

LIBNAME MEMNAME OPEN MODE STATUS


------- ------- --------- ------
SC .CLASS Input
WORK .RATIO2 Update Current Input Current Output

DATASET : WORK.RATIO2.DATA

VAR NAME TYPE SIZE


NAME CHAR 12
SEX CHAR 1
HT NUM 8
WT NUM 8
Number of Variables: 4
Number of Observations: 6

10-38
OTHER EXAMPLES

A) SOLVING A SYSTEM OF EQUATIONS

3X1 - X2 + 2X3 = 8
2X1 - 2X2 + 3X3 = 2
4X1 + X2 - 4X3 = 9

The equations may be written in matrix form as

3 -1 2 X1 8
2 -2 3 X2 = 2
4 1 -4 X3 9

and can be expressed symbolically as

AX = C or

X = A-1 C

This system of equations can be solved in IML


using the IML statements:

5 PROC IML;
IML Ready
6 RESET PRINT ;
7 A={3 -1 2,
8 2 -2 3,
9 4 1 -4} ;
10
11 C={8, 2, 9} ;
12
13 X=INV(A)*C ;
14 QUIT ;
Exiting IML.
NOTE: The PROCEDURE IML used 4.67 seconds.

10-39
A 3 rows 3 cols (numeric)

3 -1 2
2 -2 3
4 1 -4

C 3 rows 1 col (numeric)

8
2
9

X 3 rows 1 col (numeric)

3
5
2

B) LINEAR REGRESSION EXAMPLE

A linear regression model is usually written

Y = XB + E

where Y is a vector of responses, X is the design matrix and B is


a vector of unknown parameters estimated by minimizing the sum of
squares of E, the error or residual. The least-squares solution of
B is:

B = (X`X)-1*X`*Y ;

Suppose that you have response data Y measured at 5 values of the


independent variables X1 and X2 and you want to solve the
following equation for the unknown parameters B1 and B2

Y = B1X1 + B2X2

10-40
28 PROC IML;
29 RESET PRINT ;
30 X={1 1 1,
31 1 2 4,
32 1 3 9,
33 1 4 16,
34 1 5 25} ;
35 Y={1, 5, 9, 23, 36} ;
36 B=INV(X`*X)*X`*Y ;
37 QUIT ;
Exiting IML.

X 5 rows 3 cols (numeric)

1 1 1
1 2 4
1 3 9
1 4 16
1 5 25

Y 5 rows 1 col (numeric)

1
5
9
23
36

B 3 rows 1 col (numeric)

2.4
-3.2
2

10-41

You might also like