在SAS中实现递归二分法

时间:2015-01-16 17:17:14

标签: recursion sas sas-macro

这里的第一个问题。

基本上,我想通过使用宏在SAS中实现递归二分算法。我已经编写了一个宏,它接受两个参数(当前间隔的下端点和上端点)并生成一个包含另一个间隔的两个端点的表。我遇到的问题是编写一个宏来迭代这个过程,直到间隔的宽度低于某个阈值。

这是我到目前为止所做的,但代码不能像我期望的那样工作。请记住,在过去三天左右的时间里,我学到了有关SAS的所有知识的99%。非常感谢任何可以提供帮助的人!

data interval;
     input a b;
     datalines;
          0 1
          ;
run;

%macro iter(a,b);
data rec;
     set interval;
     %let a0 = &a;
     %let b0 = &b;
     %do %while(%sysevalf(&b0 - &a0) > .00001);
          %nextint(&a0,&b0);
          call symput('a0',trim(left(a)));
          call symput('b0',trim(left(b)));
     %end;
run;
%mend;

其中%nextint(&a0,&b0)生成一个包含一个观察的表interval,以及两个列ab,其中的值由&a0和{{1}计算得出}。正如你所看到的,SAS对我来说是一个完全的谜,我不知道我在做什么。

2 个答案:

答案 0 :(得分:3)

不确定你的宏%nextint做了什么,但我写了一些东西只是为了展示%iter宏将如何运行。

您需要将这些调用问卷放在数据步骤中。

我在这里使用 null 只是为了从间隔数据集中获取宏变量a0和b0的新值。

注意,这将产生具有a和b的第一组值的区间数据集,其中b-a小于0.0001。

宏末尾的%put语句将显示每个交互的a和b的变化值。

    %macro nextint(a1,b1);
        data interval;
            a = &a1. + 0.1;
            b = &b1. - 0.1;
        run;
    %mend;


    %macro iter(a,b);
        %let a0 = &a.;
        %let b0 = &b.;
        %do %while(%sysevalf(%sysevalf(&b0. - &a0.) > 0.0001));
            %nextint(&a0,&b0);
            data _null_;
                set interval;
                call symput('a0',strip(a));
                call symput('b0',strip(b));
            run;
            %put &a0.;
            %put &b0.;
            %put %sysevalf(&b0. - &a0.);
        %end;
    %mend;

    %iter(0,1);

答案 1 :(得分:1)

我建议您查看SAS/IML语法来进行数值分析工作。

Rick Wicklin的

This blog解释了如何使用SAS / IML查找函数的根。

如果您仍想使用宏和数据步骤,则可以使用 options mprint;语句用于调试代码并在日志中查看实际运行的命令。