在 SAS IML 中,如果两个矩阵包含缺失值,则不能相乘以获得两个矩阵的乘积,这对吗?
SAS 中没有解决这个问题的方法???
根据关于缺失值的 IML 文档,您是正确的:不可能使用矩阵乘法将两个包含缺失值(或更多)的矩阵相乘(元素很好)。这是出于效率的原因;我不确定这意味着什么,但大概有一些 IML 使用的线性代数快捷方式,如果可能存在缺失值,这些快捷方式将无法正常工作。
请记住,“缺失”实际上并不是后端的值;这是一个特定的负值(实际上是可能的最低负数),SAS 在对其进行数学运算时知道以某种方式处理。
如果您想使用缺失值,您可以将它们重新编码为一个比数据中任何可能值大得多的非常低的负数,例如 -999999,然后在乘法完成后,重新编码负值(或大负值)返回。
这是一个例子:
proc iml;
xvar = {1 1,2 2};
yvar = {-99999 2,1 1};
zvar = xvar*yvar;
do z=1 to nrow(zvar) ;
if zvar[z,1] < 0 then do;
zvar[z,1]=.;
end;
end;
print zvar;
quit;
这仅在您的值始终为正的情况下才有效,并且 -999999 必须足够大,以使其超过任何可能的加法(因此 -1 不起作用,例如,您有 -1*1+1+1 =0)。如果您在两个矩阵中都有缺失,则还必须过滤掉较大的正值(同样,这仅在您的数据允许的情况下才有效;许多情况会导致这产生不良结果。)
我写了一篇博客文章,讨论了用缺失值解释乘法的各种方法。文章“SAS 中缺失值的矩阵乘法”还包括 SAS/IML 代码,使您能够对包含缺失值的矩阵进行乘法运算。