我在用freq和tabulate分别做四格表,写的程序如下,我认为,以下三组程序所产生的结果应该是一样的:
第一组:
proc freq data=a;
tables v012*sex/nocol norow nopercent;
tables v013*sex/nocol norow nopercent;
run;
第二组:
proc tabulate data=a;
class v012 sex;
tables (v012='' all='合计'), (all='合计' sex='')* n='';
run;
proc tabulate data=a;
class v012 v013 sex;
tables (v013='' all='合计'), (all='合计' sex='')* n='';
run;
第三组:
proc tabulate data=a;
class v012 v013 sex;
tables (v012='' all='合计'), (all='合计' sex='')* n='';
tables (v013='' all='合计'), (all='合计' sex='')* n='';
run;
但是事实上,这三组得出的四格表中的数据都不一样,看合计项就能看出。更为可笑的就是第二和第三组,我只是把两个tables语句合在一个tabulate过程中,但居然和分开为两个tabulate过程的结果不一样。
现附上数据。
请高手运算以下,看是不是我的sas出了问题,还是我自己的知识出了问题。难道这三组程序不等价么?非常疑惑,求解!
tabulate和freq对统一数据的四格表产出不一样?
数据如下
回复 第1楼 的 lisijie515:
因为数据中v012和v013有不同的缺失情况,proc tabulate在处理时会剔除缺失值,参加帮助中“If you omit MISSING, then PROC TABULATE excludes the observations with any missing CLASS variable values from tables and output data sets.”
而proc freq得到的表下面会说明缺失值的情况。
在proc tabulate的class后添加missing选项就清楚了,三种方法得到的结果也是一致的。
如:
<br />
proc tabulate data=a;<br />
class v012 sex / missing;<br />
tables (v012='' all='合计'), (all='合计' sex='')* n='';<br />
run;<br />
</p>回复 第3楼 的 hssnow:好的,我会试试。但是请教一下,为什么第二组和第三组的结果会不同呢?这二者的区别仅仅是两个tables语句放在一个tabulate过程中,或者分别放在两个tabulate过程中。我认为这不会导致输出结果的差异呀?