这里的第一个问题。
基本上,我想通过使用宏在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
和{{1}计算得出}。正如你所看到的,SAS对我来说是一个完全的谜,我不知道我在做什么。
答案 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)