我碰巧发现以下问题困扰了我好几个小时。
data test;
input RandNo$ Trt$ Tmax;
cards;
K64 R 0.5
K64 T 0.15
K64 R 0.15
K64 T 0.5
K65 T 0.5
K65 R 0.33
K65 T 0.17
K65 R 0.5
;
run;
proc sql noprint;
create table SQL as
select RandNo, TRT, avg(Tmax) as Tmax_Mean
from test
group by RandNo, TRT
;
quit;
ods output Summary = Means;
proc means data = test n mean;
class RandNo TRT;
var Tmax;
run;
ods output;
proc sql;
select a.RandNo, a.TRT, a.Tmax_Mean as SQL,
b.Tmax_Mean as Means,
SQL - Means as Dif
from SQL as a
left join Means as b
on a.RandNo = b.RandNo and a.TRT = b.TRT
;
quit;
输出:
RandNo Trt SQL Mean Dif
K64 R 0.325 0.325 0
K64 T 0.325 0.325 -555E-19
K65 R 0.415 0.415 0
K65 T 0.335 0.335 -555E-19
那么为什么剂量来自proc手段和proc sql的结果不同于另一个? Thx提前。
PS:我试过删除'K64'或'K65'的观察结果,这次差异就消失了。
标准程序(均值,单变量,摘要等)下的统计引擎是相同的,但是,您发现的SQL统计引擎与Procs引擎的变化非常小。
至于为什么SAS开发人员更多的问题。一种可能性是SQL引擎可能有一个额外的位可用于处理或表示SQL ISO NULL与SAS MISSING值(.
到.Z
),这反过来可能会影响结果。
您可以使用RB8查看双精度表示的基础位。
put(SQL,RB8.) format=$hex16. as SQL_RB8,
put(Means,RB8.) format=$hex16. as Means_RB8
RandNo Trt SQL Mean Dif SQL_RB8 Means_RB8.
--------------------------------------------------------------------------------------------
K64 R 0.325 0.325 0 CDCCCCCCCCCCD43F CDCCCCCCCCCCD43F
K64 T 0.325 0.325 -555E-19 CCCCCCCCCCCCD43F CDCCCCCCCCCCD43F
K65 R 0.415 0.415 0 90C2F5285C8FDA3F 90C2F5285C8FDA3F
K65 T 0.335 0.335 -555E-19 703D0AD7A370D53F 713D0AD7A370D53F
当你看到微不足道的差异时
CC...
和CD...
为.32570...
和71...
为.335差异在于一个非常低阶的位。如果您想了解更多关于在双精度空间中存储十进制值的细节,请查找IEEE 754。
我猜测一个proc默认应用模糊测试但另一个不应用。除了“遗留原因”之外,很难确切地说出原因。