在SAS中使用PROC FREQ(等)时,它包含我在PROC FORMAT中创建的缺失值。如何排除这些缺失值?

时间:2014-10-29 22:37:00

标签: sas missing-data

我使用PROC FORMAT创建了数据中的缺失值,如下所示:

proc format;
value ideofmt
   1-2='Lib or Extr Lib'
   3-5='Mod, Slight Lib or Slight Cons'
   6-7='Cons or Extr Cons'
   other=.;
run;

当我尝试使用PROC FREQ进行适合度测试时,它决定包含我编码为缺失的other值(.)。这是我的代码:

proc freq data=sasuser.project2;
table ideology /nocum chisq testp = (0.2 0.6 0.2);
format ideology ideofmt.;
run;

我反复收到以下错误:

ERROR: The number of TESTP values does not equal the number of levels. For the table of
ideology, there are 4 levels and 3 TESTP values.

此错误(以及频率表输出)表明PROC FREQ仍然认为我的缺失值可用于计算(即,我有4个值而不是3个值)。

我的假设是PROC FREQ默认排除了缺失值,因此我不确定我的代码有什么问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这是SAS做一些与你期望的有点不同的例子。

SAS会将​​缺失格式的值折叠为缺失,如果有任何真正的缺失。这不是因为您将它们格式化为. - 它会将任何内容都折叠为丢失,您将格式化为与丢失相同的结果,即使这不是缺失值。如果没有任何基础(未格式化)缺失值的值,则会显示该值。

请参阅以下示例。看看当你将“Something Else”更改为“。”时会发生什么。或“” - 没什么!

proc format;
value milef
   10-<15 = "Low"
   15-<25 = "Medium"
   25-40  = "High"
   other  = "Something Else";
quit;

proc freq data=sashelp.cars;
  tables mpg_highway;
  format mpg_highway milef.;
run;

data cars;
  set sashelp.cars;
  if mpg_highway = 66 then mpg_highway=.;
run;

proc freq data=cars;
  tables mpg_highway;
  format mpg_highway milef.;
run;

为了使您的示例正常工作,您需要在数据中引入一个真正的缺失,否则以不同的方式处理它(使用WHERE子句过滤掉任何不适用的东西是最简单的。)