SAS中文论坛
标题:
SAS宏程序的扩展
[打印本页]
作者:
shiyiming
时间:
2006-4-17 14:27
标题:
SAS宏程序的扩展
SAS宏程序的扩展
无论多么复杂的宏程序,要让宏程序具有广泛的通用性,它都是从一个个小的宏程序扩展而来的。
比如[url:5cb53]http://www.mysas.net/forum/viewtopic.php?t=1448[/url:5cb53],这可以让我们得到如下的统计表格:
____________________________________________________
指标项 A组 B组
____________________________________________________
年龄(岁)
例数(缺失) 115 (0 ) 121 (0 )
均数(标准差) 48.37 (18.31 ) 44.93 (16.66 )
中位数(Q1~Q3) 48.00 (32.00 -66.00 ) 45.00 (30.00 -56.00 )
最小值-最大值 18.00 -77.00 18.00 -76.00
_____________________________________________________
现在如果想对这个宏程序进行扩展,(假设有3个中心),想得到类似下面的表格,我们就需要对原来的宏程序加以扩展。这个在多中心主要指标定量分析中显得尤为突出。虽然我们可以不用修改原来的ttest宏,而只是改变原来ttest宏中的data指向,比如data=origin data(where=(cn=1));等等,但是在中心数较多时还是比较麻烦。
________________________________________________________
指标项 A组 B组
________________________________________________________
年龄(岁)
例数(缺失) 115 (0 ) 121 (0 )
均数(标准差) 48.37 (18.31 ) 44.93 (16.66 )
中位数(Q1~Q3) 48.00 (32.00 -66.00 ) 45.00 (30.00 -56.00 )
最小值-最大值 18.00 -77.00 18.00 -76.00
1中心
例数(缺失) 10 (0 ) 20 (0 )
均数(标准差) 46.20 (18.15 ) 44.20 (17.69 )
中位数(Q1~Q3) 45.50 (38.00 -53.00 ) 41.50 (30.00 -58.00 )
最小值-最大值 18.00 -77.00 21.00 -75.00
2中心
例数(缺失) 16 (0 ) 14 (0 )
均数(标准差) 37.69 (15.11 ) 44.29 (17.05 )
中位数(Q1~Q3) 35.00 (22.00 -52.00 ) 43.50 (30.00 -55.00 )
最小值-最大值 18.00 -65.00 18.00 -70.00
3中心
例数(缺失) 89 (0 ) 87 (0 )
均数(标准差) 50.54 (18.32 ) 45.20 (16.55 )
中位数(Q1~Q3) 52.00 (33.00 -68.00 ) 46.00 (30.00 -56.00 )
最小值-最大值 19.00 -77.00 18.00 -76.00
________________________________________________________
实际上只要对原来的ttest宏稍加修改即可,加上一个新的控制宏变量multi。自己定义:如果multi=0,那么输出单变量的统计结果;如果multi=1,那么输出单变量多中心的统计结果。
在编译调试完%ttest后,可以定义新的ttest1宏,类似如下:
%macro ttest1(data,var, index,multi);
%if &multi=0 %then %do;
%ttest;
%end;
%else %if &multi=1 %then %do;
%ttest;
%do i=1 %to &cnnum;
data &data.;
set &data.(where=(cn=&i));
run;
%ttest;
%end;
%end;
%mend ttest1;
用if语句控制multi的走向,至于程序中的中心数目,可以有多种方法得到,在mysas.net和sasor论坛中都有讨论。下面提供一种直观的得到多中心中心数的方法:
proc sort data=&data. out=cnnum;
by cn;
run;
data cnnum;
set cnnum;
by cn;
if first.cn then output cnnum;
run;
proc sql noprint;
select count(*) into: cnnum from cnnum;
quit;
只要自己用心揣摩,一定可以编写出适合自己用的高效、通用的宏程序来。
作者:
shiyiming
时间:
2006-4-28 19:26
标题:
真不错
才发现你原来是在北京做临床实验中biostatistic。不知你在那个公司,没准我们还有联系呢。有机会见见。
作者:
shiyiming
时间:
2006-4-29 21:52
标题:
to maurice
QQ:517825572
作者:
shiyiming
时间:
2006-5-9 19:31
标题:
QQ
QQ:22488341
我加了你,但是没反应
作者:
shiyiming
时间:
2006-10-12 11:21
标题:
得到中心数更简单的方法
用if语句控制multi的走向,至于程序中的中心数目,可以有多种方法得到,在mysas.net和sasor论坛中都有讨论。下面提供一种直观的得到多中心中心数的方法:
proc sort data=&data. out=cnnum;
by cn;
run;
data cnnum;
set cnnum;
by cn;
if first.cn then output cnnum;
run;
proc sql noprint;
select count(*) into: cnnum from cnnum;
quit;
更简单的方法:
proc sort data=&data. out=cnnum nodupkey;
by cn;
run;
proc sql noprint;
select count(*) into: cnnum from cnnum;
quit;
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2