在 SAS 中实现递归平分



这里是第一个问题。

基本上,我想通过使用宏在 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&b0 计算的值。 正如你所看到的,SAS对我来说是一个完全的谜,我不知道我在做什么。

不确定你的宏 %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);

我建议您研究SAS/IML语法以进行数值分析工作。

Rick Wicklin 撰写的这篇博客解释了如何使用 SAS/IML 查找函数的根。

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

最新更新