全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1532 4
2011-12-06
各位高手,我现在想对某一段SAS程序进行100次重复运算,我使用宏程序来完成,但是在运行过程中出现问题,想请教各位大侠一下。我的程序如下:

%macro prog;
%do times= 1 %to 100;  (说明:times指示运行次数)
一段sas程序;
%end;
%mend prog;

中间包含的那段SAS程序有如下特性:1. 会由do循环产生随机数,且随机数的种子受到times的影响;2. 会由t test产生一个P值,并且我使用了ODS将P值输出到SAS数据集。我的主要目的是想运行这段中间程序100次并对产生的100个P值进行分析。但是现在的问题是:

1. 如果单独运行中间的那段程序,没有问题,结果会产生一些列的中间数据集以及最后的P值数据集(当然,数据集里只包含一个P值)。但是如果运行宏的话,中间数据集里的很多变量以及最后的P值都不会产生,不知道为什么?
2. 有没有方便的办法把100个含P值数据放在一个数据集里?

先谢谢各位啦!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2011-12-6 12:07:54
这个问题以前大家也曾经讨论过。一是关于随机数的机制;另一个是宏在这里的作用。
作者试图通过改变种子的值以求得随机的样本-样本之间的独立。从目前sas的随机数产生的原理来看,这是一种误解。从更安全的角度来看,保持同一个种子应该更加合理。比如说,种子111和333很可能是在很大程度上相关的。
那么宏的作用是什么呢?在这里,既没有简化代码,也没有增加效率。相反,宏在这里阻碍了某些sas所提供的很有效率的算法和原则。原则一,尽量减少所创立的数据集的数量;原则二,合理利用BY变量来驱动过程。如果得当,100次的TTEST,如果数据集在1000之内,理应在30秒之内。
很多人抱怨sas很难做大数据量的反复处理,比如boostrapping。其实如果合理抽样合理计算,sas在boostrapping本身的效率应该是非常不错的。而其中最大的优势是有组织的比较简洁的结果输出。
从统计应用的角度来看,sas的长处在于在基础端的扎实可靠,而劣于创新。而数据组织和整理更是sas的擅长。关键在于如果合理利用sas所提供的良好方法。
关于宏的应用:本人认为,无论从程序的可读性还是合理性来讲,80%的宏程序都属于不必要的,低效率的。如果不能把握合理的利用宏程序,其往往蜕变为一种滥用的标志。
不过你的问题很难回答,因为你省略了其中最关键的那段程序。从结果来看,问题也没有鉴别性。
京剧

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-12-6 12:20:16
The SAS macro is not easy to debug and it is hard to understand. This is especially true for a beginner.

Here is a simulation with 100 time in a data step.

data t1;
   do i=1 to 100;
      n=ranuni(123)*30+5;
          do j=1 to n;
             x=rannor(123);
             output;
          end;
        end;
run;


proc means data=t1 nway;   
     class i;
         var x;
         output out=x meam=m std=s;
run;

data x2;
  set x;
  tstat=m/s;
  df=_freq_;
  p=probt(tstat,df);
  drop _freq_;
run;


proc print;run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-12-6 12:20:41
The SAS macro is not easy to debug and it is hard to understand. This is especially true for a beginner.

Here is a simulation with 100 time in a data step.

data t1;
   do i=1 to 100;
      n=ranuni(123)*30+5;
          do j=1 to n;
             x=rannor(123);
             output;
          end;
        end;
run;


proc means data=t1 nway;   
     class i;
         var x;
         output out=x meam=m std=s;
run;

data x2;
  set x;
  tstat=m/s;
  df=_freq_;
  p=probt(tstat,df);
  drop _freq_;
run;


proc print;run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-12-6 15:04:23
谢谢楼上的两位高手。特别是jingju11提到的by驱动使我受到了启发,用by语句得到结果的速度更快,而且使程序大为简化。我已修改了程序并运行成功。
我中间的那段程序比较长,所以没有写上去。程序的基本内容是产生一系列随机数,然后通过各种运算和法则构造出两组数据,对它们进行t test 后分析P值。
SAS专版果然高手多多,有不懂的再来请教,嘿嘿!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群