SAS:PROC FREQ自动组合?

SAS:PROC FREQ自动组合?,sas,medical,Sas,Medical,我有一个病人数据集,看起来像下表,我想看看哪些疾病一起运行,最终形成一个热图。我使用PROC FREQ制作这个列表表,但这样做太费劲了,因为它提供了每个组合(数千个) 我最终想要一组交叉标签,如下所示,这样我可以看到每个组合有多少患者。很明显,可以像这样手动复制粘贴每个变量,但有没有办法快速查看或自动执行 proc freq data=new; tables HOHT*HOGD/list; run; proc freq data=new; tables HOHT*CroD/list; run;

我有一个病人数据集,看起来像下表,我想看看哪些疾病一起运行,最终形成一个热图。我使用PROC FREQ制作这个列表表,但这样做太费劲了,因为它提供了每个组合(数千个)

我最终想要一组交叉标签,如下所示,这样我可以看到每个组合有多少患者。很明显,可以像这样手动复制粘贴每个变量,但有没有办法快速查看或自动执行

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;

谢谢

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

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

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;
…结果输出的前几个表如下所示:


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

Proc意味着
是一种常用工具,用于获取数据中包含的组合组的各种统计信息。在您的情况下,您只需要每个组合的计数

假设你有10000名患者,有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;
FREQ
没有语法来支持创建包含涉及
factor1
的每个成对组合的输出数据

Proc意味着
是否具有此类输出的语法

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

实际上,
PROC FREQ
确实支持类似于
表factor1*(factor2--factor10)的语法。参见SAS/STAT 14.3《用户指南》第2796页是的,的确,表格将创建所有交叉点的ODS输出,但我相信由“FREQ”中的output=(作为数据)创建的数据集将只是最后一个解析的交叉点。哇。给人印象深刻的多谢各位much@ybao-不客气。SAS宏语言绝对值得学习。一开始这是一个挑战,因为宏语言的输出是SAS代码,但是你可以用它做一些令人印象深刻的事情。你也可以编写一个宏来从SAS数据集中提取列名,并将其保存到一个宏变量中,该变量可以用作
%gentabs()
的参数。
proc freq noprint data=patient_factors;
  table 
    factor1
    * factor2 
      * factor3
        * factor4
          * factor5
            * factor6
              * factor7
                * factor8
                  * factor9
                    * factor10
  / out = pf_10deep
  ;
run;
proc means noprint data=patient_factors;
  class factor1-factor10;
  output out=counts_paired_with_factor1 n=n;
  types factor1 * ( factor2 - factor10 );
run;