|
|
楼主

楼主 |
发表于 2007-8-29 11:57:36
|
只看该作者
新药统计中定量指标的SAS宏程序
%macro ttest(database=,var=,index=);
/*利用univariate程序输出描述性结果到result数据集*/
proc univariate noprint data=&database.;
var &var.;
by group;
output out=result n=n mean=mean median=med std=std min=min max=max nmiss=nmiss
Q1=Q1 Q3=Q3;
/*将两对比组描述性结果分别输出到独立的数据集中,并定义变量的长度*/
data aa(where=(group="A")) bb(where=(group="B"));
set result;
format mean 6.2 med 6.2 std 6.2;
/*两个独立的数据集分别重新更名变量名,再合并到一个数据集中*/
data result(drop=group);
merge aa(rename=(n=NA nmiss=MA mean=MeanA med=medA std=StdA Q1=QA1 Q3=QA3 Min=MinA Max=MaxA))
bb(rename=(n=NB nmiss=MB mean=MeanB med=medB std=StdB Q1=QB1 Q3=QB3 Min=MinB Max=MaxB));
/*利用ODS输出成组T检验的结果到数据集TTests,方差齐性检验的结果到数据集Equality*/
ods listing close;
ods output TTests=TTests Equality=Equality;
proc ttest data=&database.;
var &var.;
class group;
run;
ods listing;
/*合并数据集ttests、Eauality到一个数据集中*/
data test2;
merge ttests Equality;
by Variable;
/*生成方差齐性的成组T检验的数据集,并定义变量格式*/
data test21;set test2; where ProbF>0.05 and Variances="Equal";length stat $5;stat="t";
/*生成方差不齐的成组T检验的数据集,并定义变量格式*/
data test22; set test2; where ProbF<0.05 and Variances="Unequal";length stat $5;stat="校正t";
/*合并成组T检验的数据集,并定义变量的长度*/
data test(keep=tValue Probt stat);
merge test21 test22;
tValue=abs(tValue);
format tValue 6.2 Probt 6.4;
/* 生成打印结果的数据集*/
/*合并描述性结果和成组T检验的数据集,生成打印的数据集,并定义打印输出格式*/
data _null_;
merge result test;
file print n=ps notitle;
put #1 @2 "&index." @61 stat '=' tValue @72 'P='Probt
#2 @4 "例数(缺失)" @20 NA'('MA')' @39 NB'('MB')'
#3 @4 "均数(标准差)" @20 MeanA'('StdA')' @39 MeanB'('StdB')'
#4 @4 "中位数(P25-P27)" @20 MedA'('QA1'-'QA3')' @39 MedB'('QB1'-'QB3')'
#5 @4 "最小值-最大值" @20 MinA'-'MaxA @39 MinB'-'MaxB;
run;
/*删除程序中生成的临时数据集,并定义打印表格的表头和表格线*/
proc datasets; delete result aa bb TTests Equality test2 test21 test22 test stt;quit;
%mend ttest;
%macro ctitl(titl=);
data _null_;
file print n=ps notitles;
put #1 @5 "&titl"
#2 @2 80*'_'
#3 @2 '指标项' @21 'A组' @40 'B组' @60 '统计量' @72 'P值'
#4 @2 80*'_';
run;
%mend ctitl;
%macro cleg;
data _null_;
file print n=ps notitles;
put #1 @2 80*'_';
run;
%mend cleg;
DATA pps;
INPUT group$ Temp Pulse;
cards;
A 36.1 78
A 36.2 79
A 36.4 81
A 36.6 83
A 36.8 85
A 37 87
A 37.2 89
A 37.3 90
A 37.4 91
A 37.5 92
A 37.1 97
A 37.7 100
A 38.1 102
A 38.5 104
A 38.7 105
B 36.3 80
B 36.5 82
B 36.7 84
B 36.9 86
B 37.1 88
B 36.3 93
B 36.5 94
B 36.7 95
B 36.9 96
B 37.3 98
B 37.5 99
B 37.9 101
B 38.3 103
B 38.9 106
;
run;
%ctitl(titl=表1:两组治疗前临床一般资料报告);
%ttest(database=pps,var=Temp,index=体温/摄氏度);
%ttest(database=pps,var=Pulse,index=心率/次.min);
%cleg;
这个程序有个缺点是每条横线上都有一个空行,不知道这么删除。还有横线打印出来后,是一些点。请大家讨论指正 |
|