首页 文章

SAS PROC TABULATE具有缺失值的多个类变量的百分比

提问于
浏览
3

我想创建一个包含三个变量的表,其中var2是var1的百分比,var3是var2的百分比,由具有缺失值的类变量细分 .

为了解释,想象一下,我有数据显示谁申请,接受采访,并被聘用工作,例如

data job; 
input applied interviewed hired; 
datalines; 
1   1   1
1   1   1
1   1   1
1   1   0
1   1   0
1   1   0
1   0   .
1   0   .
1   0   .
1   0   .
; 
run;

创建一个表格可以很容易地显示应用者的数量,然后是受访者的百分比,然后是那些人的百分比,被雇用的百分比 .

proc tabulate data = job; 
var applied interviewed hired; 
tables applied * n (interviewed hired) * mean * f=percent6.; 
run;

这使:

applied interviewed hired 
   10        60%     50%

现在我想通过缺少值的几个类变量来解决这个问题 .

data have; 
input sex degree exp applied interviewed hired; 
datalines; 
0   1   1   1   1   1
1   .   0   1   1   1
.   0   1   1   1   1
0   1   0   1   1   0
1   0   1   1   1   0
0   1   0   1   1   0
1   .   1   1   0   .
0   1   .   1   0   .
.   0   0   1   0   .
1   0   0   1   0   .
; 
run;

如果我一次做一个类变量,它会给我正确的百分比:

proc tabulate data = have format = 6.; 
    class sex; 
    var applied interviewed hired; 
    tables sex, applied * sum (interviewed hired) * mean * f=percent6.; 
run;

有没有办法一次在表中执行所有三个类变量,并为每个类别获得正确的百分比 . 所以表格如下:

applied  interviewed  hired
sex 
  0       4        75%       33%
  1       4        50%       50%
degree  
  0       4        50%       50%
  1       4        75%       33%
exp 
  0       5        60%       33%
  1       4        75%       67%

这是我必须做很多次的事情,我需要在报表中用数字填充表格,所以我正在寻找一个可以一步打印表格的解决方案 .

你怎么解决这个问题?

2 回答

  • 0

    您遇到的问题是缺少数据 . 当任何类变量都缺少一个case时,它将从整个表中删除,除非你在proc调用中指定MISSING . 所以,例如,你没有采访的第四性别= 0缺少EXP;所以他们没有在 table 上露面,尽管你希望他们出现在SEX中 .

    您可以获得正确的数字,主要是:

    proc tabulate data = have format = 6. missing; 
        class sex degree exp; 
        var applied interviewed hired; 
        tables (sex degree exp), applied * sum (interviewed hired) * mean * f=percent6.; 
    run;
    

    但是,您有一个额外的行,其中包含缺少数据的行 . 您无法从打印输出中消除这些行,同时还将其包含在其他类计算中;这只是SAS制表的限制之一 . 其他PROC也有类似的问题;如果生成多个表,PROC FREQ是唯一不执行此操作的人,但即使在一个表中(与星号结合),您也会遇到相同的问题 .

    我找到的唯一方法是将表输出到数据集,然后过滤掉这些行,然后PROC REPORT或PRINT或TABULATE数据 .

  • 0

    我认为这很接近你想要的 . 您必须修复行标签,但它是一个PROC TABULATE步骤 .

    title;
    data have; 
    input sex degree exp applied interviewed hired; 
    datalines; 
    0   1   1   1   1   1
    1   .   0   1   1   1
    .   0   1   1   1   1
    0   1   0   1   1   0
    1   0   1   1   1   0
    0   1   0   1   1   0
    1   .   1   1   0   .
    0   1   .   1   0   .
    .   0   0   1   0   .
    1   0   0   1   0   .
    ; 
    run; 
    proc print;
       run;
    
    proc summary data=have missing ;
       class sex degree exp;
       ways 1;
       output out=stats sum(applied)= mean(interviewed hired)= / levels;
       run;
    
    data stats2;
       set stats;
       if n(of sex degree exp) eq 0 then delete;
       run;
    proc print;
       run;
    proc tabulate data=stats2;
       class _type_ / descend;
       class _level_;
       var applied interviewed hired;
       tables (_type_*_level_),applied*sum='N'*f=8. (interviewed hired)*sum='Percent'*f=percent6.;
       run;
    
    
    /**/
    /*       applied  interviewed  hired*/
    /*sex */
    /*  0       4        75%       33%*/
    /*  1       4        50%       50%*/
    /*degree  */
    /*  0       4        50%       50%*/
    /*  1       4        75%       33%*/
    /*exp */
    /*  0       5        60%       33%*/
    /*  1       4        75%       67%*/
    

    enter image description here

相关问题