在项目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;
结果数据集中输出了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的记录也输出出来。
但是,这个结果也多输出了一行两组汇总的数据(_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;
结语
计数处理在临床试验SAS编程中非常常见,Preloadfmt选项可以简化计数编程过程,这个简化效果在分组变量数目越多、分组变量种类越多时,越明显。关于这个选项的延伸应用,会在后续文章中介绍。
感谢阅读!若有疑问,欢迎评论区交流!