SAS:PROC FREQ 自动组合?
SAS: PROC FREQ combinations automatically?
我有一个看起来像下面 table 的患者数据集,我想一起查看哪些疾病 运行 并最终制作一个 热图 。我使用 PROC FREQ 制作了这个列表 table,但是像这样完成它太费力了,因为它给了我每个组合(数千)。
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;
谢谢!
可以使用TABLES
语句控制在PROC FREQ
中生成的表。要生成数据集中所有列对的 2-way 列联表,可以编写一个 SAS 宏来循环变量列表,并生成 TABLES
语句来创建所有正确的列联表.
例如,使用原始post中的数据:
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 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;
我有一个看起来像下面 table 的患者数据集,我想一起查看哪些疾病 运行 并最终制作一个 热图 。我使用 PROC FREQ 制作了这个列表 table,但是像这样完成它太费力了,因为它给了我每个组合(数千)。
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;
谢谢!
可以使用TABLES
语句控制在PROC FREQ
中生成的表。要生成数据集中所有列对的 2-way 列联表,可以编写一个 SAS 宏来循环变量列表,并生成 TABLES
语句来创建所有正确的列联表.
例如,使用原始post中的数据:
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 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;