这里是第一个问题。
基本上,我想通过使用宏在 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
包含一个观测值,以及两列a
和b
,其中包含根据 &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;
语句来调试代码,并在日志中查看实际运行的命令。