SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

求助编程中的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2009-6-6 09:38:42 | 只看该作者

Re: 求助编程中的问题

很不好意思,我可以给你点建议,这样写程序肯定会产生很多日志。改进参考:
[code:v0irrvvu]源程序段:
data asdsum;
j=.;
c=.;
x=.;
run;
%do i=1 %to &t;
Data asd;
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;
run;
proc append base=asdsum data=asd;
run;
%end;
[/code:v0irrvvu]
等价程序如下:
[code:v0irrvvu]
Data asdsum(drop=mm);
        if _n_=1 then do;j=.;c=.;x=.;output;end;
        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;[/code:v0irrvvu]
我只提供一小段例子,你可以自己试着改改。
因为你这样的append程序效率低下,同时又产生很多日志。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
12#
 楼主| 发表于 2009-6-6 10:24:08 | 只看该作者

Re: 求助编程中的问题

有意思。
我有些班门弄斧了。从此程序看,大量的输出应该在log window中产生。可以取消mprint等等的选择或者写入nonotes一类的options.
如果不考虑程序的可读性,可以把%cusum直接写入%deltacal之中。MACRO CALL MACRO不是很高效率吧。
data asdmean(keep=mean sum delta);
set asdsum end=endobs;
[color=#0000FF:2x4q35t4]if (j>=50) then do;[/color:2x4q35t4]
sum+1;
rl+j-50;
[color=#0000FF:2x4q35t4]end;[/color:2x4q35t4]
if endobs;...
应该等价于
data asdmean(keep=mean sum delta);
set asdsum[color=#0000FF:2x4q35t4](where=(j>=50)) [/color:2x4q35t4]end=endobs;
sum+1;
rl+j-50;
if endobs;...
但这可以避免读入无用的数据,对吗?

另外你的程序写的比我好。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
13#
 楼主| 发表于 2009-6-6 13:27:59 | 只看该作者

Re: 求助编程中的问题

这是我第一次写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;

这是我的数据的第二部分
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-5 17:47 , Processed in 0.067374 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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