SAS 卡方检验
SAS Chi Square Test
我有以下数据集,我打算对其执行卡方检验(所有变量都是分类变量)。
Indicator Area Range1 Range2
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 0-17 25-50
1 B 17-25 25-50
1 B 0-17 17-25
1 B 17-25 25-50
测试需要在所有级别执行,即范围 1、范围 2 & area.One 方法是创建一个宏来执行 same.But 我有大约 300 个变量 &调用宏 300 次效率不高。我用于 3 个变量的代码如下:
options mprint mlogic symbolgen;
%macro chi_test(vars_test);
proc freq data =testdata.AllData;
tables &vars_test*Indicator/ norow nocol nopercent chisq ;
output out=stats_&vars_test &vars_test PCHI;
run;
data all_chi;
set stats_:;
run;
%mend chi_test;
%chi_test(Range1);
%chi_test(Range2);
%chi_test(Area);
有谁能帮忙吗?
为什么不直接转置数据并使用 BY 组处理。
首先添加一个唯一的行标识符,以便 PROC TRANSPOSE 可以将您的变量转换为单个列。
data have_extra;
row+1;
set have;
run;
proc transpose data=have_extra out=tall ;
by row indicator ;
var area range1 range2 ;
run;
然后按原始变量名对记录进行排序。
proc sort; by _name_ ; run;
然后您可以 运行 您的每个原始变量的 CHI-SQ。
proc freq data =tall ;
by _name_;
tables col1*Indicator/ norow nocol nopercent chisq ;
output out=all_chi PCHI;
run;
如果您的所有变量都是分类变量,那么您可以在 tables
语句中使用 _all_
,并为数据集使用 ods output
。这将创建一个包含所有变量组合 * Indicator 的数据集。
如果需要,您可以对输出数据集应用数据集选项(where=、keep=、drop= 等)。
data have;
input Indicator Area $ Range1 $ Range2 $;
datalines;
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 0-17 25-50
1 B 17-25 25-50
1 B 0-17 17-25
1 B 17-25 25-50
;
run;
ods select chisq;
ods output chisq=want;
proc freq data=have;
tables _all_*Indicator/ norow nocol nopercent chisq;
run;
我有以下数据集,我打算对其执行卡方检验(所有变量都是分类变量)。
Indicator Area Range1 Range2
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 0-17 25-50
1 B 17-25 25-50
1 B 0-17 17-25
1 B 17-25 25-50
测试需要在所有级别执行,即范围 1、范围 2 & area.One 方法是创建一个宏来执行 same.But 我有大约 300 个变量 &调用宏 300 次效率不高。我用于 3 个变量的代码如下:
options mprint mlogic symbolgen;
%macro chi_test(vars_test);
proc freq data =testdata.AllData;
tables &vars_test*Indicator/ norow nocol nopercent chisq ;
output out=stats_&vars_test &vars_test PCHI;
run;
data all_chi;
set stats_:;
run;
%mend chi_test;
%chi_test(Range1);
%chi_test(Range2);
%chi_test(Area);
有谁能帮忙吗?
为什么不直接转置数据并使用 BY 组处理。
首先添加一个唯一的行标识符,以便 PROC TRANSPOSE 可以将您的变量转换为单个列。
data have_extra;
row+1;
set have;
run;
proc transpose data=have_extra out=tall ;
by row indicator ;
var area range1 range2 ;
run;
然后按原始变量名对记录进行排序。
proc sort; by _name_ ; run;
然后您可以 运行 您的每个原始变量的 CHI-SQ。
proc freq data =tall ;
by _name_;
tables col1*Indicator/ norow nocol nopercent chisq ;
output out=all_chi PCHI;
run;
如果您的所有变量都是分类变量,那么您可以在 tables
语句中使用 _all_
,并为数据集使用 ods output
。这将创建一个包含所有变量组合 * Indicator 的数据集。
如果需要,您可以对输出数据集应用数据集选项(where=、keep=、drop= 等)。
data have;
input Indicator Area $ Range1 $ Range2 $;
datalines;
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 17-25 25-50
0 A 0-17 25-50
1 B 17-25 25-50
1 B 0-17 17-25
1 B 17-25 25-50
;
run;
ods select chisq;
ods output chisq=want;
proc freq data=have;
tables _all_*Indicator/ norow nocol nopercent chisq;
run;