我使用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
默认排除了缺失值,因此我不确定我的代码有什么问题。
非常感谢任何帮助。
答案 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子句过滤掉任何不适用的东西是最简单的。)