SAS中文论坛

标题: 求助编程中的问题 [打印本页]

作者: shiyiming    时间: 2009-6-5 19:42
标题: 求助编程中的问题
%macro deltacal;
%do delta=.1 %to 4.0 %by .05;
%put delta mean:δ
%end;
%mend deltacal;
%deltacal;

为什么delta 不是整数是不能显示出来,怎么用eval 改进
作者: shiyiming    时间: 2009-6-5 20:49
标题: Re: 求助编程中的问题
%macro deltacal;
%do delta_=10 %to 400 %by 5;
       %let delta=%sysevalf(&delta_/100);
      %put delta mean:δ
%end;
%mend deltacal;

%deltacal
;

*i think you knew the reason why your program did not work well;
*as far as I know, %do only works on integer (%eval());
作者: shiyiming    时间: 2009-6-5 21:11
标题: Re: 求助编程中的问题
好的,谢谢,我的确知道是什么问题,也知道用eval就是不知道怎么用,
再次感谢
作者: shiyiming    时间: 2009-6-5 21:33
标题: Re: 求助编程中的问题
能不能帮我看看为什么刚才的问题单独算是没有问题的,为什么我的加到我自己的程序中,就会有问题呢

%let delta=.10;
%macro cusum(k=.05,ucl=4.1089,w=50,outfile=asdsum,t=50);
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;
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;

%macro deltacal;
data deltasum;
sum=.;
mean=.;
delta=.;
run;
%do delta=10 %to 400 %by 5;
%let delta=%sysevalf(&delta_/100);
%cusum;
proc append base=deltasum data=asdmean;
run;
%end;
%mend deltacal;
%deltacal;
作者: shiyiming    时间: 2009-6-5 22:10
标题: Re: 求助编程中的问题
%macro deltacal;
data deltasum;
sum=.;
mean=.;
delta=.;
run;
%do delta=10 %to 400 %by 5[color=#FF4000:y24p7aub];*delta=10 should be delta_=10;[/color:y24p7aub]
%let delta=%sysevalf(&delta_/100);
%cusum;
proc append base=deltasum data=asdmean;
run;
%end;
%mend deltacal;
%deltacal;
作者: shiyiming    时间: 2009-6-5 23:20
标题: Re: 求助编程中的问题
我想问一下为什么我都用delta不可以呢,好像没有要求有下划线呀
作者: shiyiming    时间: 2009-6-5 23:49
标题: Re: 求助编程中的问题
There,
It is nothing to do with the naming convention. but look at the program

%do [color=#FF0000:e5ams0zd]delta[/color:e5ams0zd] =10 %to 400 %by 5;
%let delta=%sysevalf( [color=#FF0000:e5ams0zd]&delta_[/color:e5ams0zd] /100);
%cusum;
proc append base=deltasum data=asdmean;
run;
%end;
%mend deltacal;

first you define macro variable 'delta' ,then you evaluate delta_; that is not consistent. I think, in case of any ambiguity, you could progarm like that

%local i;
%do i=10 %to 400 %by 5;
%let delta=%sysevalf(&i/100);
...
作者: shiyiming    时间: 2009-6-6 07:03
标题: Re: 求助编程中的问题
还是不怎么明白,我还有一个问题要问,就像我在做上面的大循环的时候,一直会出现一个窗口,window is full and must be cleared, please select
这个问题怎么解决呢
作者: shiyiming    时间: 2009-6-6 08:54
标题: Re: 求助编程中的问题
这么大的循环,看得我头发晕,错一点在所难免。要换了我,估计行行都错!
作者: shiyiming    时间: 2009-6-6 09:12
标题: Re: 求助编程中的问题
我的程序现在没有什么问题了,但是唯一的问题就是它在运行的时候运行一段时间就会出来一个对话框说明window is full please clear, 我直接关闭就可以了,不过我想问问有没有什么方法可以使得这些窗口不出现
作者: shiyiming    时间: 2009-6-6 09:38
标题: 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程序效率低下,同时又产生很多日志。
作者: shiyiming    时间: 2009-6-6 10:24
标题: 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;...
但这可以避免读入无用的数据,对吗?

另外你的程序写的比我好。
作者: shiyiming    时间: 2009-6-6 13:27
标题: 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;

这是我的数据的第二部分




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