下面的程序中 lstar 和 g 是事先编好的函数,ab是已知的数据集,想要使mu从0.1到20以0.1为间隔变化,怎么办,求高手指教,另外,再此之后(即新的数据集lstar产生之后),我想在每一个mu(从0.1到20,以0.1为间隔)下,判断sum1是否大于或者等于h1(h1已知的)和sum2是否大于或者等于h2(h2已知的),然后输出第一个对应的sum1大于或者等于h1的 i 和输出第一个对应的sum2大于或者等于h2的 i ,请各位指教。不知道我有没有说明白
options cmplib =sasuser.funcs;
%let r =10000;
data lstar;
call streaminit(1234);
set ab;
do sample =1 to &r;
call missing(sum1, sum2);
do i =1 to 6000;
x =rand('T',3) ;
y =x/sqrt(3)+mu ;
lstar =lstar(y,c,d) ;
l =g(y) ;
sum1 ++lstar; sum2 ++l;
if (sum1 lt 0) then sum1=0;
if (sum2 lt 0) then sum2=0;
output;
end;
end;
keep sample i sum1 sum2;
run;
#######################################
下面是我之前编的程序,但是其中的mu=2.5并且程序相当慢,我现在想使mu从0.1变到20,并且想用%let加以改进,但是不知道怎么办,请各位指点下吧,多谢了!
%macro arim(r);
%do m=1 %to &r;
data lstar&m;
set ab;
do i=1 to 1000;
x=rand('T',3);
y=x/sqrt(3)+2.5;
lstar=f(y,c,d);
l=g(y);
output;
end;
run;
data ci&m;
set lstar&m;
retain sum1 0;
sum1=sum1+lstar;
if (sum1 ge 0) then sum1=sum1;
else sum1=0;
output;keep i sum1;
run;
data si&m;
set lstar&m;
retain sum2 0;
sum2=sum2+l;
if (sum2 ge 0) then sum2=sum2;
else sum2=0;
output;keep i sum2;
run;
data shifts&m;
set ci&m;
if (sum1 ge 4.6) then output;
run;
data shift&m;
set shifts&m;
if _n_=1 then output;keep i;
run;
data drifts&m;
set si&m;
if (sum2 ge 3.511) then output;
run;
data drift&m;
set drifts&m;
if _n_=1 then output;keep i;
run;
%end;
%mend arim;
%arim(10000);
data sumshift;
set shift1-shift10000;
run;
proc means data=sumshift;
var i;
run;
data sumdrift;
set drift1-drift10000;
run;
proc means data=sumdrift;
var i;
run;