SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1471|回复: 4
打印 上一主题 下一主题

SAS宏程序的扩展

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2006-4-17 14:27:18 | 只看该作者

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;

只要自己用心揣摩,一定可以编写出适合自己用的高效、通用的宏程序来。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2006-4-28 19:26:47 | 只看该作者

真不错

才发现你原来是在北京做临床实验中biostatistic。不知你在那个公司,没准我们还有联系呢。有机会见见。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2006-4-29 21:52:58 | 只看该作者

to maurice

QQ:517825572
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2006-5-9 19:31:25 | 只看该作者

QQ

QQ:22488341

我加了你,但是没反应
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2006-10-12 11:21:31 | 只看该作者

得到中心数更简单的方法

用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;

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-3 23:46 , Processed in 0.095393 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表