SAS如何区分缺失值和非缺失值?

SAS如何区分缺失值和非缺失值?,sas,storage,missing-data,Sas,Storage,Missing Data,人们常说“SAS缺失值等于负无穷大”。但该语句有一个问题,因为可能有27或28个“风格”的缺失值(默认的和.a到.z和.),每个都有预定义的排序顺序 由于不可能有些无穷大比其他无穷大,我开始理解: 与有效的数值数据相比,缺失值被视为负无穷大,并且 当与其他缺失值进行比较时,它们将使用另一组预定义规则进行排序 所以我的问题是:在最低级别上,SAS如何存储数字数据,从而能够区分缺失和未缺失的数值?有没有像“符号位”一样的“缺失位”?SAS使用64位IEEE格式将数字存储为浮点值。他们选择了28个特定

人们常说“SAS缺失值等于负无穷大”。但该语句有一个问题,因为可能有27或28个“风格”的缺失值(默认的
.a
.z
.
),每个都有预定义的排序顺序

由于不可能有些无穷大比其他无穷大,我开始理解:

  • 与有效的数值数据相比,缺失值被视为负无穷大,并且
  • 当与其他缺失值进行比较时,它们将使用另一组预定义规则进行排序

  • 所以我的问题是:在最低级别上,SAS如何存储数字数据,从而能够区分缺失和未缺失的数值?有没有像“符号位”一样的“缺失位”?SAS使用64位IEEE格式将数字存储为浮点值。他们选择了28个特定的位组合,并用它们来表示.、.u和.a到.z。按照惯例,他们是被命令的。到a到z。我不确定选择这些值是为了更容易地测试排序,还是排序是他们使用的特定位模式的意外

    您可以通过查看存储的值来查看所使用的位模式

    data _null_;
      length i 8 str $8 ;
      do i=._,.,.a,.z,constant('small'),0,1,constant('big');
        str=peekclong(addrlong(i));
        str=reverse(str);
        put i best12. @15 i hex16. @35 str $hex16. ;
      end;
    run;
    
    结果

               _                 _    FFFFFF0000000000
               .                 .    FFFFFE0000000000
               A                 A    FFFFFD0000000000
               Z                 Z    FFFFE40000000000
    2.22507E-308  0010000000000000    0010000000000000
               0  0000000000000000    0000000000000000
               1  3FF0000000000000    3FF0000000000000
    1.797693E308  7FEFFFFFFFFFFFFF    7FEFFFFFFFFFFFFF
    

    它实际上并没有在内存中显式地存储负无穷大。它在运算中被当作负无穷大。对于多个缺失值,它基本上打破了基于缺失值类型的联系。一些无穷大比其他无穷大。尝试在[0,1]中计算每一个自然数,而不是在计算机上进行测试,但我相信所有数字都是双倍的,甚至是缺失的值。我认为它们代表IEEE双精度浮点表示法中的最后27(或28)个整数。是
    >还是
    .
    ?此外,SAS是用C编写的,因此您可以在后台使用一个结构来管理值的“缺失”。就我而言,这纯粹是一种推测。@RobertPenridge这是一种区分调查数据的非响应类型以及其他可能用途的实用方法。例如,“不适用”与“拒绝回答”。但是谁需要27个呢,我想知道!好吧,如果你删除你的前两句话(我相信你能弄明白我为什么这么说),我可能会接受这句话作为答案。第一句话是对问题第一段的回应。我重新措辞了答案。很有趣。。。所以missing并不总是等于missing:
    data\u null;如果。然后做;放‘火柴’;结束;运行尽管可以使用
    missing()
    函数来解决此问题。是。SAS的一个很好的特性,在需要为丢失数据的多个原因编写代码时非常方便。