%macro test(nb,l,m); %do a=0 %to &nb; proc iml; use ze_&a ; READ ALL INTO ze_&a ; use zs_&a; read all into zs_&a; orginal_z_&a=ze_&a||zs_&a; v_&a=orginal_z_&a[&l,1]; vv_&a=orginal_z_&a[&m,2]; max_&a=max(v_&a,vv_&a); create v_&a from v_&a; append from v_&a; create vv_&a from vv_&a; append from vv_&a; create max_&a from max_&a; append from max_&a; %end; data v_0(keep=COL2); set v_0; COL2=COL1; run; data vv_0(keep=COL2); SET vv_0; COL2=COL1; run; %do a=1 %to &nb; data ee_&a ; merge max_&a v_0; if COL1>=COL2 then lb=1; else lb=0; run; data ss_&a; merge max_&a vv_0; if COL1>=COL2 then mb=1; else mb=0; run; data e_&a; merge v_&a v_0; if COL1>=COL2 then lb=1; else lb=0; run; data s_&a; merge vv_&a vv_0; if COL1>=COL2 then mb=1; else mb=0; run; %end; data ee(keep=pe); set %do a=1 %to &nb; ee_&a END=lastobs %end; ; l+lb; pe=l/&nb; if lastobs ; run; data ss(keep=ps) ; set %do a=1 %to &nb; ss_&a END=lastobs %end; ; m+mb; ps=m/&nb ; if lastobs; run; data e(keep=pee); set %do a=1 %to &nb; e_&a END=lastobs %end; ; l+lb; pee=l/&nb; if lastobs; run; data s(keep=pss); set %do a=1 %to &nb; s_&a END=lastobs %end; ; m+mb; pss=m/&nb; if lastobs; run; proc iml; use ee; read all into pe; use ss; read all into ps; min=min(pe,ps); max=max(pe,ps); eee=j(1,1,0); sss=j(1,1,0); print pe ps; print &l &m; %mend; ** question ** %macro aaa; %do %until(pe[1,1]>=0.05 & ps[1,1]>=0.05); %let l=3; %let m=1; %test(nb=2,l=&l,m=&m); if pe[1,1]<0.05 then do; if ps[1,1]>=0.05 then %goto a; %let l=%eval(&l-1); %let m=%eval(&m+1); %a:%let l=%eval(&l-1); %let m=&m; end; if ps[1,1]<0.05 then %let m=%eval(&m+1); %end; eee=%eval(&l+1); sss=%eval(&m-1); print eee sss &l &m; %mend; %aaa;