为什么proc sql和proc意味着产生不同的结果?

问题描述 投票:0回答:2

我碰巧发现以下问题困扰了我好几个小时。

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'的观察结果,这次差异就消失了。

sas average
2个回答
1
投票

标准程序(均值,单变量,摘要等)下的统计引擎是相同的,但是,您发现的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...为.325
  • 70...71...为.335

差异在于一个非常低阶的位。如果您想了解更多关于在双精度空间中存储十进制值的细节,请查找IEEE 754。


0
投票

我猜测一个proc默认应用模糊测试但另一个不应用。除了“遗留原因”之外,很难确切地说出原因。

© www.soinside.com 2019 - 2024. All rights reserved.