SAS有现场功能的麻烦

时间:2013-01-16 20:22:46

标签: sas

所以,我正在SAS例程上做一些“逆向工程” - 将它带到SQL和Pentaho。

我尝试直接浏览它,但是我注意到了许多冗余进程,因此我开始在思维导图中映射所有内容以识别所有冗余并在对SQL执行任何操作之前对其进行处理。

我偶然发现了这些问题:

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);

我不知道如何映射这个过程,特别是“fieldB”和sqrt中的等式。

有人能帮我一把吗?

(编辑)好吧,乔真的帮助了我和将军...我仍然存在两个疑问:

1-“fieldB = B [,n:fieldA];”这代表什么?我的意思是,我现在如果n是静态的,它会做什么,但我来到了过程的另一部分......

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]];

直到fieldC,我都很好。我理解cusum所做的一切,但我真的不知道fieldC会发生什么。当我用& t = 1检查时,它显示了一个来自B的18x18矩阵,从B [1,1]开始 - 但是当我尝试另一个数字时,如10,它从B的col163开始。

2-我不知道这是否与矩阵变换/乘法有关,至少到目前为止我还不明白,但为什么“2.33 * sqrt(A` * fieldB * A)”(原始fieldC)返回单个值?它不应该返回矩阵吗?

1 个答案:

答案 0 :(得分:2)

那个SAS / IML,只是要明确(与Base SAS非常不同)。

FieldB是B的所有行,以及B.' n'的一些列。那里没有定义,所以我不知道它会是什么;如果它是1,则它将是一个方阵(因此,如果它是4行5列,那么fieldB是一个4x4的矩阵,丢弃第五列)。

此测试代码显示结果:

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;

结果:

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正在使用矩阵变换和矩阵乘法。 SQRT将返回一个矩阵,其中每个值都是原始值的平方根,因此您可能会认为这很简单。矩阵乘法更复杂;请在SAS参考中查找更多详细信息: http://support.sas.com/documentation/cdl/en/imlug/59656/HTML/default/viewer.htm#langref_sect14.htm

维基百科页面实际上在回答如何实际操作方面要好一些。 http://en.wikipedia.org/wiki/Matrix_multiplication#Matrix_product_.28two_matrices.29

最后,A`是A的转置,重要的可能是为了确保行/列的数量能够用于矩阵乘法。顺便说一句,我有点惊讶的是,fieldB不是这里A行的子集,除非这里没有公开的数据背后存在某种关系。