IML 中缺少元素的 SAS 矩阵产品
SAS matrix product with missing elements in IML
在 SAS IML 中,如果两个矩阵包含缺失值,则不能乘以得到它们的乘积是对的吗??
SAS 中没有解决此问题的方法???
根据 IML Documentation on missing values,您是正确的:不可能使用矩阵乘法(逐元素)将包含缺失值(或更多)的两个矩阵相乘。这是出于效率原因而声明的;我不确定这意味着什么,但大概有一些 IML 使用的线性代数快捷方式,如果可能存在缺失值,这些快捷方式将无法正常工作。
请记住 'missing' 实际上不是后端中的值;它是一个特定的负值(实际上是可能的最小负数),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)。如果您在 both 矩阵中都有缺失,您还必须过滤掉较大的正值(同样,这只有在您的数据允许的情况下才有效;许多情况会导致这种情况有不良结果。)
我写了一篇博客 post,讨论了解释具有缺失值的乘法的各种方法。文章 "Matrix multiplication with missing values in SAS" 还包含 SAS/IML 代码,可让您乘以包含缺失值的矩阵。
在 SAS IML 中,如果两个矩阵包含缺失值,则不能乘以得到它们的乘积是对的吗??
SAS 中没有解决此问题的方法???
根据 IML Documentation on missing values,您是正确的:不可能使用矩阵乘法(逐元素)将包含缺失值(或更多)的两个矩阵相乘。这是出于效率原因而声明的;我不确定这意味着什么,但大概有一些 IML 使用的线性代数快捷方式,如果可能存在缺失值,这些快捷方式将无法正常工作。
请记住 'missing' 实际上不是后端中的值;它是一个特定的负值(实际上是可能的最小负数),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)。如果您在 both 矩阵中都有缺失,您还必须过滤掉较大的正值(同样,这只有在您的数据允许的情况下才有效;许多情况会导致这种情况有不良结果。)
我写了一篇博客 post,讨论了解释具有缺失值的乘法的各种方法。文章 "Matrix multiplication with missing values in SAS" 还包含 SAS/IML 代码,可让您乘以包含缺失值的矩阵。