为什么在 proc 中求平均值和 proc sql 步骤会根据 proc 比较产生不同的结果?
Why does finding the average in a proc means and a proc sql step yield different results according to a proc compare?
我有以下代码。创建的数据集是 test_means
和 test_sql
。两者都采用您选择的变量的简单平均值。
两者通过 eye
创建完全相同的数字。
为什么 proc compare
说这些值不等于一个愚蠢的小值,比如 0E-14?这与数字在两个过程中的存储方式有关吗?
%let var=; *Insert numeric variable to check;
%let dsn=; *Insert dataset name;
proc means noprint mean data=&dsn.;
var &var.;
output out=test_means (keep=_STAT_ &var. where=(_STAT_="MEAN"));
run;
proc sql;
create table test_sql as select
"MEAN" as _STAT_ length=8,
mean(&var.) as &var.
from &dsn.
;
quit;
proc compare data=test_means compare=test_sql;
run;
根据对浮点值(如 SAS 数字)的计算,预计会有 E-14
数量级的差异。这与不同的 PROC 没有特别的关系;所要做的就是以不同的顺序对值求和,以沿着这些方向产生错误。如果行最终处理方式不同(例如,由于多线程),即使 PROC SQL
中的两次不同运行也可能产生如此大的差异。
PROC COMPARE
运行通常应使用 FUZZ
选项来完成,除非您比较的数字非常小。这通常应该是标准做法的一部分,除非您特别想看到这种差异(意思是,除非您想要验证两个文件是同一个文件,而不仅仅是相同的值)。
我有以下代码。创建的数据集是 test_means
和 test_sql
。两者都采用您选择的变量的简单平均值。
两者通过 eye
创建完全相同的数字。
为什么 proc compare
说这些值不等于一个愚蠢的小值,比如 0E-14?这与数字在两个过程中的存储方式有关吗?
%let var=; *Insert numeric variable to check;
%let dsn=; *Insert dataset name;
proc means noprint mean data=&dsn.;
var &var.;
output out=test_means (keep=_STAT_ &var. where=(_STAT_="MEAN"));
run;
proc sql;
create table test_sql as select
"MEAN" as _STAT_ length=8,
mean(&var.) as &var.
from &dsn.
;
quit;
proc compare data=test_means compare=test_sql;
run;
根据对浮点值(如 SAS 数字)的计算,预计会有 E-14
数量级的差异。这与不同的 PROC 没有特别的关系;所要做的就是以不同的顺序对值求和,以沿着这些方向产生错误。如果行最终处理方式不同(例如,由于多线程),即使 PROC SQL
中的两次不同运行也可能产生如此大的差异。
PROC COMPARE
运行通常应使用 FUZZ
选项来完成,除非您比较的数字非常小。这通常应该是标准做法的一部分,除非您特别想看到这种差异(意思是,除非您想要验证两个文件是同一个文件,而不仅仅是相同的值)。