João Ciocca
João Ciocca

Reputation: 866

SAS trouble with field functions

So, I'm doing some "reverse engineering" on a SAS routine - to bring it to SQL and Pentaho.

I tried going straight through it, but I noted a lot of redundant processes, so I started to map everything in a mind map to identify all the redundacies and treat them before doing anything on SQL.

I stumble upon these lines:

use table1
    read all into A
use table2
    read all into B
fieldA = nrow(B);
fieldB = B[,n:fieldA];
fieldC = 2.33*sqrt(A`*fieldB*A);

And I have no idea on how to map this process, specially "fieldB" and the equation inside sqrt.

Could anyone give me a hand?

(edit) Okay, Joe really helped me out with the general... my two still remaining doubts are:

1- "fieldB = B[,n:fieldA];" what does this stand for? I mean, I now what it does if n is static, but I came around another part of the process where...

use table1;
    read all into A;
use table2;
    read all into B;
fieldA = ncol(B);
fieldB = ncol(A);
ncurvas = fieldA/fieldB;
N = J(ncurvas+1,1,fieldB);
N[1] = 1;
NCUM = cusum(N)-1;
fieldC = B[,(NCUM[&t]+1):NCUM[&t+1]];

I'm all good until it comes to fieldC. I understand what cusum does and all, but I have really no idea what happens on fieldC. When I checked it out with &t = 1, it showed me an 18x18 matrix from B, starting at B[1,1] - but when I tried another number, like 10, it started at col163 of B.

2- I don't know if this has anything to do with matrix transformations/multiplication that I, at least so far don't understand, but why does "2.33*sqrt(A`*fieldB*A)" (the original fieldC) returns a single value? shouldn't it return a matrix?

Upvotes: 2

Views: 109

Answers (1)

Joe
Joe

Reputation: 63424

That's SAS/IML, just to be clear (very different from Base SAS).

FieldB is all rows of B, and some number of columns of B. 'n' is not defined there, so I don't know what it would be; if it's 1, then it would be a square matrix (so, if it is 4 rows 5 columns, then fieldB is a matrix that is 4x4 dropping the fifth column).

This test code shows the results:

proc iml;
B={1 2 3 4 5, 4 5 6 7 8, 7 8 9 10 11, 10 11 12 13 14};
print B;
fieldA = nrow(B);
print FieldA;
fieldB = B[,1:fieldA];
print FieldB;
quit;

Results:

B 
1 2 3 4 5 
4 5 6 7 8 
7 8 9 10 11 
10 11 12 13 14 



fieldA 
4 



fieldB 
1 2 3 4 
4 5 6 7 
7 8 9 10 
10 11 12 13 

FieldC is using matrix transformations and matrix multiplication. SQRT will return a matrix where each value is the square root of the original value, so that's as straightforward as you probably think. Matrix multiplication is more complicated; look it up in the SAS reference for more detail: http://support.sas.com/documentation/cdl/en/imlug/59656/HTML/default/viewer.htm#langref_sect14.htm

The wikipedia page actually is a bit better at answering how to actually do it, though. http://en.wikipedia.org/wiki/Matrix_multiplication#Matrix_product_.28two_matrices.29

Finally, A` is the transpose of A, important presumably to make sure the number of rows/columns works out for the matrix multiplication. Incidentally, I'm a bit surprised that fieldB isn't subset by the number of rows of A here, unless there's some sort of relationship behind the data not disclosed here.

Upvotes: 2

Related Questions