SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 802|回复: 5
打印 上一主题 下一主题

求助 为什么用proc sql 连接两个数据集得到的是迷失数据

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-6-6 23:48:17 | 只看该作者

求助 为什么用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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-6-8 20:57:23 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-6-8 22:25:02 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-6-8 23:41:01 | 只看该作者

Re: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据

OUTER UNION也没错,错的是没加CORR选项。

楼主,你第一次程序都写得这么靚了,前途一定不可限量!人家都说要傍潜力股,我们都崇拜的byes暂时还没决定收我为徒,能让我跟你先学着吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-6-9 07:16:18 | 只看该作者

Re: 求助 为什么用proc sql 连接两个数据集得到的是迷失数据

我也觉得是,第一次写SAS程序就连宏带宏循环,还带SQL. 实为高人也。我当年是学了五六年的SAS后才知道有宏这个东西。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-6-9 08:01:14 | 只看该作者

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,那它的运算效率就差不多是时间的函数了。

如果我理解得不准确,敬请指教。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-5 15:56 , Processed in 0.132402 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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