美文网首页
SAS编程:频数汇总时如何处理分析分组种类不全的情况?

SAS编程:频数汇总时如何处理分析分组种类不全的情况?

作者: 野藤_ | 来源:发表于2021-12-28 22:48 被阅读0次

在项目Table的输出中,少不了对分类变量进行频数汇总,这一整个计算输出过程并不复杂。一般研究要求,分类变量的所有类别都需要输出,这里有一点需要注意,分析时很有可能出现个别分组分类计数为0的情况。

为了保证分析分组变量的种类完整,计数为0的类别的结果也需要输出。并且,编程中一些同事会机械地将分类计数结果赋值到宏变量中,如果不将计数为0的类别输出,后续调用宏变量会出现Error。下面介绍两个具体的处理方法。

Dummy数据集

处理分类计数为0的情况,在日常工作中想必大家非常熟悉。常见的做法是生成一个包含所有种类的Dummy数据集,与有缺失种类的分析结果数据集进行拼接,补全计数为0的那一个类别的结果。这里用SASHELP.Class数据集简单演示一下:

**Get data from sashelp.class;
data class;
  set sashelp.class;
  where sex = "M";
run;

**Count for each sex category;
proc freq data = class;
  tables sex / out = result1(keep = sex count);
run;

**Create a dummy dataset for missing category;
data dummy;
  length sex $1;
  sex = "F"; output;
  sex = "M"; output;
run;

**Merge result dataset with dummy dataset;
data result;
  merge dummy result1;
  by sex;

  if count = . then count = 0;
run;

Result

结果数据集中输出了Sex=F这一类别计数为0的情况了。

Preloadfmt选项

Preloadfmt是Means过程步中Class语句的选项之一,SAS官方文档中是这样描述Preloadfmt选项的——指定分类变量的所有格式都预先加载(specifies that all formats are preloaded for the class variables.,来源:SAS Help Center: Syntax: PROC MEANS CLASS Statement)。

使用Preloadfmt选项时,分组分析的所有种类的Format都会输出,包括计数为0的种类。只要提前设置好分组变量的Format,就可以输出计数为0的那一组类别。官方文档中也说明,如果想要输出计数为0的种类,PROC语句中要使用COMPLETETYPES选项。

需要注意的是,Means过程步的分析变量只能是数值变量,所以计数分类变量数目时需要一个数值的标记变量,通常我是新建一个变量flag = 1;

具体的演示代码如下:

**Get data from sashelp.class;
data class2;
  set sashelp.class;
  where sex = "M";

  *Create count flag;
  flag = 1;
run;

**Set format for class var;
proc format;
  value $sex
    "F"="Female"
    "M"="Male"
  ;
run;

**Get count;
proc means data = class2 completetypes;
  class sex/ preloadfmt;
  var flag;
  output n=count out = result2;

  format sex $sex.;
run;

输出结果如下,我们可以看到Sex=F的那一组类别计数为0的记录也输出出来。

Result2

但是,这个结果也多输出了一行两组汇总的数据(_type_=0),在调用Proc语句时,使用nway选项就可以移除这一行记录。当然,这一行也可以在输出数据集的数据集选项中筛选删除(out = result2 (where=(_type_ ne 0)))。但是,遇到多个分组变量时,type变量的取值就不只是0和1这两个了,进行手动删除还需要查看数据集中的具体输出值,这里其实已经涉及到Hardcoding了。所以,建议直接使用nway选项,移除多余的汇总计数记录。

**Get count;
proc means data = class2 nway completetypes;
  class sex/ preloadfmt;
  var flag;
  output n=count out = result2;

  format sex $sex.;
run;
Result3

结语

计数处理在临床试验SAS编程中非常常见,Preloadfmt选项可以简化计数编程过程,这个简化效果在分组变量数目越多、分组变量种类越多时,越明显。关于这个选项的延伸应用,会在后续文章中介绍。

感谢阅读!若有疑问,欢迎评论区交流!

相关文章

网友评论

      本文标题:SAS编程:频数汇总时如何处理分析分组种类不全的情况?

      本文链接:https://www.haomeiwen.com/subject/enkmqrtx.html