/* 利用freq 程序输出描述性结果到TabFreq 数据集*/
proc freq data = &database. noprint ;
tables &var. * group /out = TabFreq ;
run ;
/* 将两对比组的缺失例数分别输出到独立的数据集ma 和mb 中*/
data ma ( where = (group ="A") ) mb ( where= (group ="B") ) ;
set TabFreq (keep = &var. group COUNT) ;
where &var. = . ;
run ;
/* 利用ODS 输出描述性结果到CrossTabFreqs数据集,
对比统计的结果到数据集chisq,FishersExact */
ods listing close ;
ods output CrossTabFreqs = CrossTabFreqs chisq = chisq FishersExact=FishersExact ;
proc freq data = &database. ;
tables &var. * group /chisq exact expected nopercent norow ;
run ;
ods listing ;
/* 自CrossTabFreqs 数据集中生成理论频数的数据集,并将其排序 */
proc sort out = EXPECTED(keep = EXPECTED)
data = CrossTabFreqs ( where = ( EXPECTED not=. ) ) ;
by Expected ;
run ;
/* 自理论频数数据集中取出最大理论频数值,输出到数据集T中 */
data T(keep = T) ;
set EXPECTED ;
if n = 1 then T = EXPECTED ;
if T = . then delete ;
run ;
/* 自CrossTabFreqs 数据集中生成例数的数据集,并将其排序 */
proc sort out = Frequency ( keep = Frequency)
data = CrossTabFreqs ;
by descending Frequency ;
run ;
/* 自例数数据集中取出例数,输出到数据集n中 */
data n (keep = n) ;
set Frequency ;
if n = 1 then n = Frequency ;
if n = . then delete ;run ;
run ;
/* 自chisq 数据集中生成普通卡方检验的统计量和P值的数据库 */
data chisq1 (keep =value1 Prob1 ) ;
set chisq ( rename = (value = value1 Prob =Prob1) ) ;
where (Statistic = ('Chi-Square') | Statistic = ('卡方') ) ;
run ;
/* 自chisq 数据集中生成连续校正卡方检验的统计量和P值的数据库 */
data chisq2 (keep =value2 Prob2 ) ;
set chisq ( rename = (value = value2 Prob =Prob2) ) ;
where ( Statistic = ( 'Continuity Adj. Chi-Square') | Statistic = ('连续校正卡方') ) ;
run ;
/* 自Fishersexact 数据集中生成精确概率法P值的数据库 */
data Fishersexact (keep = cvalue1) ;
set Fishersexact ;
where (Name1 = ('XP2_FISH') ) ;
run ;
/* 合并结果,并定义统计量格式 */
data st (keep = ma mb n T value1 Prob1 value2 Prob2 cvalue1 &var. c) ;
merge ma ( rename = (COUNT = ma) ) mb ( rename = (COUNT = mb) ) n T chisq1 chisq2 Fishersexact ;
&var. = - 99 ;
if ma = . then ma = 0 ;
if mb = . then mb = 0 ;
format value1 6.2 value2 6.2 ;
run ;
data outa ( where = ( group ="A") ) outb (where = (group ="B") ) ;
set CrossTabFreqs ;
format ColPercent 6.2 ;
run ;
data outt (drop = table group _TYPE_ _TABLE_ Expected Missing) ;
merge outa (rename = ( Frequency = A ColPercent = percentA) )
outb ( rename = ( Frequency = B ColPercent =percentB) ) ;
if &var. = . then &var. = - 99 ;
run ;
proc sort ;by &var. ;run ;
data _null_ ;
file print notitle ;
merge outt st ;
if &var. = - 99 then do ;
if n < 40 or T < 1 or 0.0450 < Prob1 < 0.0550 then do ;
put @3 "&index." @70 '精确概率法' @83 'P= ' cvalue1 ;
end ;
else if n > = 40 and 1 < = T < = 5 then do ;
put @3 "&index. " @70 '校正chisq = 'value2 @83 'P= 'Prob2 ;
end ;
else if n > = 40 and T > = 5 then do ;
put @3"&index. " @70 'chisq = 'value1 @83 'P= 'Prob1 ;
end ;
put @5 "例数(缺失) " @22 A '(' MA ') ' @47 B '(' MB ') ';
end ;
else do ;
put @5 &var. '(%) ' @22 A '(' PercentA ') '@47 B '('PercentB ') ';
format &var. &varfmt..;
end ;
run ;
proc datasets;
delete chisq chisq1 chisq2 Crosstabfreqs Expected Fishersexact
Frequency Ma Mb N Outa Outb Outt st stt t Tabfreq ; quit ;
%mend chisq ;
data jixian;
input id group$ SEX;
datalines;
1 A 1
2 A 2
3 A 2
4 A 2
5 B 1
6 B 2
7 B 1
8 B 2
;
run;
[code:2b1dd]%macro clianova(data,group=,var=,prnopt=0,where=);
%if &prnopt=0 %then %do;ods select none;%end;
options nodate nonumber;title '';
proc means n mean std median min max lclm uclm nmiss noprint data=&data;var &var;class &group;
%if &where ne %then %do; where &where; %end;
output out=tmp1 n=n mean=mean median=median std=std min=min max=max nmiss=nmiss q1=q1 q3=q3;
run;
proc glm data=&data;class &group;model &var=&group;
ods output diff=tmpf;
lsmeans &group/tdiff pdiff;run;
data t12(keep=t12 p12);set tmpf;if _n_=1;rename _2=t12 p2=p12;run;
data t13(keep=t13 p13);set tmpf;if _n_=1;rename _3=t13 p3=p13;run;
data t23(keep=t23 p23);set tmpf;if _n_=2;rename _3=t23 p3=p23;run;
data t12;set t12 t12 t12 t12 t12;run;
data t13;set t13 t13 t13 t13 t13;run;
data t23;set t23 t23 t23 t23 t23;run;
data tmp;merge t12 t13 t23;format t12 t13 t23 6.2 p12 p13 p23 6.3;run;
data tmp2;set tmp1;
nnm=put(n,6.) ||'('||trim(left(put(nmiss,6.)))||')';
ms=put(mean,6.1) ||'±'||left(put(std,6.1));
lu=put(lclm,6.1) ||'~'||left(put(uclm,6.1));
mm=put(min,6.1) ||'~'||left(put(max,6.1));
format median 6.1;
label nnm='N(Miss)' ms='Mean±SD' lu='95%CI(L~U)' mm='Min~Max' median='Median';
drop mean std min max n nmiss lclm uclm;run;
proc anova data=&data;ods output modelANOVA=anova(rename=(fvalue=F probf=P));class &group;model &var=&group;
%if &where ne %then %do; where &where; %end;run;
proc transpose data=tmp2 out=tmp3;var nnm ms q13 mm median;run;
data tmp3(drop=_name_ col1 F t12 p12 t13 p13 t23 p23);merge tmp3 anova(keep=F P) tmp;
format f 6.2 p 6.3;rename _label_=&var col2=A col3=B col4=C;
if _n_=2 then do;F=t12;P=p12;end;if _n_=3 then do;F=t13;P=p13;end;
if _n_=4 then do;F=t23;P=p23;end;run;
ods select all;ods listing;proc print data=tmp3 noobs;run;
%mend clianova;