2

因此,我正在对 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-“字段B = B [,n:字段A];” 这是什么意思?我的意思是,如果 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 ) 返回单个值?它不应该返回一个矩阵吗?

4

1 回答 1

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 的行数的子集,除非此处未披露的数据背后存在某种关系。

于 2013-01-16T20:52:40.753 回答