Reputation: 866
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
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