【问题标题】:proc tabulate missing values SASproc 列出缺失值 SAS
【发布时间】:2016-02-16 23:36:23
【问题描述】:

我有以下代码:

ods tagsets.excelxp file = 'G:\CPS\myworkwithoutmissing.xml'
style = printer;
proc tabulate data = final;
Class Year Self_Emp_Inc Self_Emp_Uninc Self_Emp Multi_Job P_Occupation Full_Part_Time_Status;
table Year, P_Occupation*n;
table Year, (P_Occupation*Self_Emp_Inc)*n;
table Year, (Self_Emp_Inc*P_Occupation)*n;
run;
ods tagsets.excelxp close;

当我运行此代码时,我收到以下错误消息:

WARNING: A class, frequency, or weight variable is missing on every observation.
WARNING: A class, frequency, or weight variable is missing on every observation.
WARNING: A class, frequency, or weight variable is missing on every observation.

现在为了规避这个问题,我在类语句的末尾添加了“缺失”选项,这样:

class year self_emp_inc ....... Full_Part_Time_Status/ missing;

这解决了问题,因为它没有给我错误消息并创建表。但是,我的图表现在还计算了缺失值的数量,这是我不想要的。例如,我的变量 self_emp_inc 的值为 1 和 .(表示缺失)。现在,当我使用缺失选项运行代码时,我也得到了所有缺失值的 P_Occupation 计数,但我只想要 self_emp_Inc 的值为 1 时的计数。我怎样才能完成该任务?

【问题讨论】:

  • 我不能尝试这个,所以我现在会发表评论。您可以有多个 CLASS 语句,并且只缺少感兴趣的值。您还可以使用 WHERE 语句来限制您的分析。
  • 我实际上只使用了“缺失”选项来查看是否可以解决问题。我虽然默认情况下 proc tabulate 会忽略缺失值,但在这种情况下它似乎是一个问题。不知道为什么。我实际上想忽略所有情况和所有变量中的缺失值。
  • Proc tabulate 按列表排除案例。列出的任何具有缺失值的变量都会导致观察结果被排除在所有分析之外。
  • 那该怎么办呢?我应该为每个变量写一个单独的类语句吗?
  • 为每个表语句尝试一个 proc 表格,将变量限制在必要的最小值。不过,我只是在猜测——您应该发布复制您的问题的示例数据。

标签: sas proc


【解决方案1】:

这是 SAS 中令人沮丧的事情之一,出于某种原因,SAS 没有为我们提供“好的”解决方案。根据您的工作情况,有一些解决方案。

这里真正的问题不是你有缺失 - 在一个 1x1 表(1 var x 1 var)中,排除缺失是你想要的。这是因为您正在调用多个表,并且每个表都受到另一个表中类变量缺失的影响。

因此,通常最简单的答案就是将表拆分为多个 proc tabulate 语句。就运行时间而言,这有时可能过于复杂或繁重,但我怀疑大多数情况下这是最好的解决方案 - 无论如何,它通常适合我。

由于您只使用n,因此您可以构建包含缺失的列表,输出到数据集,然后将它们过滤掉并重新打印或导出该数据集。这通常是最简单的解决方案。

您究竟想如何做到这一点当然取决于您到底想要什么。例如:

data test_cars;
  set sashelp.cars;
  if _n_=5 then call missing(make);
  if _n_=7 then call missing(model);
  if _n_=10 then call missing(type);
  if _n_=13 then call missing(origin);
run;

proc tabulate data=test_cars out=test_tabulate(rename=n=count);
  class make model type origin/missing;
  tables (make model type),origin*n;
run;

data test_tabulate_want;
  set test_tabulate;
  if cmiss(of make model type origin)>2 then delete;
  length colvar $200;
  colvar = coalescec(of make model type);
run;

proc tabulate data=test_tabulate_want missing;
  class colvar origin/order=data;
  var count;
  tables colvar,origin*count*sum;
run;

这并不完美,尽管在格式方面做更多工作可以做得更好——这只是一个简单的例子。

如果您使用百分比,当然,这并不完全有效。您要么需要重构该数据步骤中的百分比 - 这有点工作,但可行 - 或者您需要为每个类变量单独制作表格。

【讨论】:

  • 非常感谢乔。不幸的是,我必须计算百分比。但这给了我一些其他的想法。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多