在SAS IML中,如果两个矩阵包含缺失值,就不可能相乘得到它们的乘积,这是对的吗??
SAS中没有解决此问题的方法???
根据IML关于缺失值的文档,您是正确的:不可能使用矩阵乘法将包含缺失值(或更多)的两个矩阵相乘(elementwise很好)。这是出于效率的原因;我不确定这意味着什么,但据推测,IML使用了一些线性代数快捷方式,如果可能丢失值,这些快捷方式就不会很好地工作。
请记住,"missing"实际上并不是后端中的值;这是一个特定的负值(事实上是尽可能低的负数),SAS知道在用它进行数学运算时要以某种方式处理。
如果你想使用missing,你可以将它们重新编码为一个非常低的负数,比数据中的任何可能值都大得多,比如-9999999,然后在乘法运算完成后,将负值(或大负值)重新编码回来。
这里有一个例子:
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;
只有当你的值总是正的,并且-9999999必须足够大,超过任何可能的加法(例如,-1不起作用,因为你有-1*1+1+1=0),这才有效。如果两个矩阵中都有缺失,则还必须过滤掉较大的正值(同样,只有在数据允许的情况下,这才会起作用;许多情况下会导致产生不希望的结果。)
我写了一篇博客文章,讨论了用缺失值解释乘法的各种方法。"SAS中缺少值的矩阵乘法"一文还包括SAS/IML代码,该代码使您能够对包含缺失值的矩阵进行乘法运算。