SAS中文论坛

标题: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据 [打印本页]

作者: shiyiming    时间: 2009-6-6 23:48
标题: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据
这是我第一次写sas程序,不过我觉得bays他的程序程序很好,运行很快,主要是不用append,但是第一部分修改的很好,
第一部分是没有什么问题的,


第二部分问题有来了,我用的是macro中又调用了cusum,而且cusum中产生的是数据集,不是一个观察值,这次我如何不用APPEND 来得到我想要得结果呢,我想了向可以用PROC SQL 来 合并数据集,但是不知道是不是编程的问题一直没有实现


我自己也下了这样的程序,不知道为什么一直得到的deltasum数据集中全部是迷失数据
%macro deltacal;
data deltasum;
sum=.;
mean=.;
delta=.;
run;
%do miu_=10 %to 20 %by 5;
%let delta=%sysevalf(&miu_/100);
%cusum(t=50000);
proc sql;
create table delta as
select * from deltasum;
proc sql;
create table deltasum as
select * from delta
outer union
select * from asdmean;
%end;
%mend deltacal;
%deltacal;

这是我的数据的第二部分

第一部分如下
%macro cusum(k=.05,ucl=4.1089,w=50,outfile=asdsum,t=50,delta=.10);
Data &outfile(drop=mm);
   do mm=1 to &t;
      j=0;
      c=0;
      do while (c<&ucl);
         j+1;
         if(j>=&w) then x=rannor(0)+δ
         else x=rannor(0);
         c+x-&k;
         c=max(c,0.00);
      end;
      output;
   end;
run;
data asdmean(keep=mean sum delta);
set asdsum end=endobs;
if (j>=50) then do;
sum+1;
rl+j-50;
end;
if endobs;
mean=rl/sum;
delta=δ
run;
%mend cusum;
%cusum;
作者: shiyiming    时间: 2009-6-8 20:57
标题: Re: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据
%macro deltacal;
data deltasum;length sum 8 mean 8 delta 8;delete;run;
%do miu_=10 %to 30 %by 5;
%let delta=%sysevalf(&miu_/100);
%cusum(t=50000);
proc append base=deltasum data=asdmean force;run;
%end;
%mend deltacal;

options nomprint nomlogic nosymbolgen;;
option nonotes;
%deltacal
;
*that is my second part;
作者: shiyiming    时间: 2009-6-8 22:25
标题: Re: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据
When you call the macro Cusum, you should pass the new delta value to it. Or the delta value for Cusum will always be 0.10.
i.e.:
%cusum(t=50000,delta=&delta.);

and don't use outer union, instead with 'union' .

try this:

%macro deltacal;
data deltasum;
sum=.;
mean=.;
delta=.;
run;
%do miu_=10 %to 20 %by 5;
%let delta=%sysevalf(&miu_/100);

%cusum(t=50000,delta=&delta.);
proc sql;
create table delta as
select * from deltasum;

create table deltasum as
select * from delta
  union
select * from asdmean;
quit;
%end;
%mend deltacal;
%deltacal;
作者: shiyiming    时间: 2009-6-8 23:41
标题: Re: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据
OUTER UNION也没错,错的是没加CORR选项。

楼主,你第一次程序都写得这么靚了,前途一定不可限量!人家都说要傍潜力股,我们都崇拜的byes暂时还没决定收我为徒,能让我跟你先学着吗?
作者: shiyiming    时间: 2009-6-9 07:16
标题: Re: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据
我也觉得是,第一次写SAS程序就连宏带宏循环,还带SQL. 实为高人也。我当年是学了五六年的SAS后才知道有宏这个东西。。。。。。。。。。。。。。。
作者: shiyiming    时间: 2009-6-9 08:01
标题: Re: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据
他的确是很厉害。可以写出如此概念清楚的赋值语句‘c+x-&k;’但是生疏于其他比较基本的概念。我想对PROC APPEND发表一些愚见,为他正正名。原因是个人很喜欢这个过程,它在我的许多程序之中功不可没呢。为什么呢?它使用起来很简单,自身的纠错能力很强,也就是如果用得不合适,便有一清二楚的错误提示出现。

[u:1tswyllv]这是我第一次写sas程序,不过我觉得bays他的程序程序很好,运行很快,主要是不用append,但是第一部分修改的很好,
第一部分是没有什么问题的,


第二部分问题有来了,我用的是macro中又调用了cusum,而且cusum中产生的是数据集,不是一个观察值,这次我如何不用APPEND 来得到我想要得结果呢,我想了向可以用PROC SQL 来 合并数据集,但是不知道是不是编程的问题一直没有实现[/u:1tswyllv]

我个人以为PROC APPEND的长处在于当BASE远远大于DATA的时候。具体地说当此程序循环多次之后。从这个观点来看,我觉得APPEND 用在这里很合适。因此我很纳闷作者的评论,不理解为何去掉APPEND便提高了程序的效率。另外,SAS程序的效率非常依赖于BENCHMARK 的选择。尤其如果是NETWORK PC,那它的运算效率就差不多是时间的函数了。

如果我理解得不准确,敬请指教。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2