SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1103|回复: 1
打印 上一主题 下一主题

问个循环的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-6-11 14:25:28 | 只看该作者

问个循环的问题

我的code如下,只是在一大段macro中间的一部分,这里面的原有文件one中,含有permno year month date a r f va e;
这一段要实现的功能是通过方程求出新的a,计算出新的va(称为va1),然后比较新的和原有的之间差值,如果绝对差值<0.001,则输出到一个文件中,而绝对差值比较大的则继续循环计算出新的a、va。

我的问题是,我在这里固定了循环的次数15,但是有的时候不到这个循环次数的时候留下的大差值的数据(one)就很少了,然后再循环进行到proc model的时候就会报错,但是如果把次数减少,有的时候又会达不到我想要的精度。请问如何当最后一个one(即剩下的大差值)少于一定量时就让循环跳出?或者proc model那一步运行不下去的时候跳出?

谢谢!!!

[code:2ep3kiee]
%do j=1 %to 15;
                proc model noprint data=one; endogenous a; exogenous r f va e;
                        e=a*probnorm((log(a/f)+(r+va*va/2))/va)-f*exp(-r)*probnorm((log(a/f)+(r-va*va/2))/va);
                        solve a/out=two;
                data two; set two; num=_n_; keep a num;
                data one; set one; num=_n_; drop a;
                data two; merge one two; by num; l1p=lag1(permno); l1a=lag1(a);
                data two; set two; if l1p=permno then ra=log(a/l1a);
                proc means noprint data=two; var ra; by permno; output out=bob;
                data bar; set bob; if _stat_='MEAN'; mu=252=ra; keep permno mu;
                data bob; set bob; if _stat_='STD'; va1=sqrt(252)*ra;
                        if va1<0.01 then va1=0.01; keep permno va1;
                data one; merge two bob bar; by permno; vdif=va1-va;
                        if abs(vdif)<0.001 and vdif ne . then conv=1;
                data fin; set one; if conv=1; assetvol=va1;
                proc sort data=fin; by permno descending date;
                data fin; set fin; if permno ne lag1(permno); curdat=100*&yyy.+&mmm.; iter=&j.;
                data conv; merge conv fin; by permno; drop va ra l1p l1a conv cdt num;
                data one; set one; if conv ne 1; va=va1; drop va1;
        %end;
[/code:2ep3kiee]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-6-11 15:47:01 | 只看该作者

Re: 问个循环的问题

是这意思吗?
[code:3lpw05oz]data raw;
        x=100;
run;
options nonotes;
%macro test;
        %local flag n;
        %let flag=1;
        %let n=0;
        %put ### 循环结束条件:大于15次或剩余值小于10 ###;
        %do %while(&flag=1);
                %put;
                %put *** 第%eval(&n+1)次循环开始 ***;
                data raw;
                        set raw(obs=1);
                        reduce=ceil(ranuni(0)*10);
                        x=x-reduce;
                        put '*** 减' reduce '剩' x ' ***';
                        if x le 10 then
                                do;
                                        call symputx('flag','0');
                                        put "### 剩余不足 循环结束(总&n.次) ###";
                                end;
                run;
                %let n=%eval(&n+1);
                %if &n ge 15 %then
                        %do;
                                %let flag=0;
                                %put ### 循环次数超限 循环结束(总&n.次) ###;
                        %end;
        %end;
%mend;
%test
options notes;[/code:3lpw05oz]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 05:06 , Processed in 0.189972 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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