Почему proc sql и proc означает получение разных результатов? - PullRequest
0 голосов
/ 12 апреля 2019

Мне довелось найти следующую проблему, которая смутила меня на несколько часов.

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, отличается отдругой?Спасибо заранее.

PS: я попытался удалить наблюдения «K64» или «K65», и на этот раз разница просто исчезла.

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Статистический механизм под стандартными процедурами (средними, одномерными, сводными и т. Д.) Такой же, однако статистический механизм 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 голосов
/ 12 апреля 2019

Я предполагаю, что один процесс применяет фаззинг по умолчанию, а другой - нет. Трудно сказать точно, почему, за исключением «наследственных причин».

...