SAS:PROC FREQ自动组合?

时间:2018-04-15 21:55:24

标签: sas medical

我有一个类似下表的患者数据集,我希望看到哪些疾病一起运行并最终制作热图。我使用PROC FREQ来制作这个列表,但是这样做太费力了,因为它给了我每一个组合(数千)。

Moya    Hypothyroid Hyperthyroid    Celiac
   1       1           0             0
   1       1           0             0       
   0       0           1             1
   0       0           0             0
   1       1           0             0
   1       0           1             0
   1       1           0             0
   1       1           0             0
   0       0           1             1
   0       0           1             1


proc freq data=new;
tables HOHT*HOGD*CroD*Psor*Viti*CelD*UlcC*AddD*SluE*Rhea*PerA/list;
run;

我最终会喜欢下面显示的一组交叉标签,所以我可以看到每个组合有多少患者。显然,可以手动复制粘贴每个变量,但有没有办法快速查看或自动执行此操作?

proc freq data=new;
tables HOHT*HOGD/list;
run;

proc freq data=new;
tables HOHT*CroD/list;
run;


proc freq data=new;
tables HOHT*Psor/list;
run;

谢谢!

2 个答案:

答案 0 :(得分:3)

可以使用PROC FREQ语句控制TABLES中生成的表格。要生成数据集中所有列对的双向列联表的表,可以编写循环遍历变量列表的SAS宏,并生成TABLES语句以创建所有正确的列联表。

例如,使用原始帖子中的数据:

data xtabs;
input Moya    Hypothyroid Hyperthyroid    Celiac;
datalines;
   1       1           0             0
   1       1           0             0       
   0       0           1             1
   0       0           0             0
   1       1           0             0
   1       0           1             0
   1       1           0             0
   1       1           0             0
   0       0           1             1
   0       0           1             1
;
run;
%macro gentabs(varlist=);
   %let word_count = %sysfunc(countw(&varlist));
   %do i = 1 %to (&word_count - 1);
      tables %scan(&varlist,&i,%str( )) * (
      %do j = %eval(&i + 1) %to &word_count;
        %scan(&varlist,&j,%str( ))
      %end; )
      ; /* end tables statement */
   %end;
%mend;
options mprint;
proc freq data = xtabs;
  %gentabs(varlist=Moya Hypothyroid Hyperthyroid Celiac)
  run;

SAS宏生成的代码是:

 73         proc freq data = xtabs;
 74           %gentabs(varlist=Moya Hypothyroid Hyperthyroid Celiac)
 MPRINT(GENTABS):   tables Moya * ( Hypothyroid Hyperthyroid Celiac ) ;
 MPRINT(GENTABS):   tables Hypothyroid * ( Hyperthyroid Celiac ) ;
 MPRINT(GENTABS):   tables Hyperthyroid * ( Celiac ) ;
 75         run;

...结果输出中的前几个表格如下:

enter image description here

要向TABLES语句添加选项,可以在注释为/* end tables statement */的行上的分号前添加代码。

答案 1 :(得分:0)

Proc MEANS是获取数据中组合组的各种统计数据的常用工具。在您的情况下,您只需要每个组合的计数。

假设您有10,000名患有10个二元因子的患者

data patient_factors;
  do patient_id = 1 to 10000;
    array factor(10);
    do _n_ = 1 to dim(factor);
      factor(_n_) = ranuni(123) < _n_/(dim(factor)+3);
    end;
    output;
  end;
  format factor: 4.;
run;

正如您所提到的,Proc FREQ可以计算每个10级组合的计数。

proc freq noprint data=patient_factors;
  table 
    factor1
    * factor2 
      * factor3
        * factor4
          * factor5
            * factor6
              * factor7
                * factor8
                  * factor9
                    * factor10
  / out = pf_10deep
  ;
run;

FREQ没有语法支持创建包含涉及factor1的每个成对组合的输出数据。

Proc MEANS 确实具有此类输出的语法。

proc means noprint data=patient_factors;
  class factor1-factor10;
  output out=counts_paired_with_factor1 n=n;
  types factor1 * ( factor2 - factor10 );
run;