此处SAS实现卡方检验的两两比较的思路借鉴于利用SAS进行Nemenyi检验(见于
http://cos.name/cn/topic/10619)。
该程序首先做了整体的卡方检验,然后再进行亚组的两两比较。
两两比较思路如下:
1、利用sql创建用以识别亚组的标识。这里利用sql将列值赋值于宏变量,且用“-”进行分隔,以便下一步读取这些列值。
2、将不同亚组进行两两组合。在循环语句中用%scan语句读取上一步的列值,并用sql创建表,对表进行卡方检验。
3、计算调整的alpha。此计算公式来自《医学统计学》(孙振球主编第三版)P122公式7-12。
ps:创建表的时候也可以利用set语句。这个程序是针对频数表数据的,如果是原始数据,只需将加权变量全部去掉即可。
%macro
multicompare(libname=,filename=,fvar=,gvar=,outcomevar=);
options nodate nonumber formdlim='*';
title;
proc freq data=test;
tables &gvar*&outcomevar / nocol norow nopercent
chisq;
weight f;
run;
proc sql noprint;
select n(distinct &gvar) into :gn from
&libname..&filename.;
select distinct a.&gvar,b.&gvar into :ag separated by
'-',:bg separated by '-'
from &libname..&filename. a,&libname..&filename. b
where a.&gvarquit;
%let gn1=%eval_r(&gn);
%Macro chisq;
%do t=1 %to &gn1;
%let m=%scan(&ag,&t);
%let n=%scan(&bg,&t);
proc sql ;
create table test as select * from &libname..&filename.
where &gvar=&m or &gvar=&n;
quit;
proc freq data=test;
tables &gvar*&outcomevar / nocol norow nopercent
chisq;
weight f;
run;
data alpha;
alpha=0.05/(&gn1*(&gn1-1)/2+1);
proc print data=alpha;
run;
%end;
%mend chisq;
%chisq;
%mend multicompare;
利用《医学统计学》(孙振球主编第三版)P122的例7-9数据进行示范:
data a;
input f g outcome;
cards;
199 1 1
7 1 0
164 2 1
18 2 0
118 3 1
26 3 0
;
run;
%multicompare(libname=work,filename=a,fvar=f,gvar=g,outcomevar=outcome);
打印的结果太多,就不展示了。