Help using Base SAS procedures

Anything wrong with the codes?

Reply
Contributor
Posts: 36

Anything wrong with the codes?

Hi All,

I want to generate one random walk sequence, but can't achieve it with the codes below. Anything wrong with the codes?  Any saser could help me out? Thanks in advance..

data want;

call streaminit(123);

do i=1 to 1000;

x=rand('normal', 0, 1);

if i=1 then y=x;

   else y=lag(y)+x;

output;

end;

run;

Super User
Posts: 9,681

Re: Anything wrong with the codes?

You are using LAG() with a conditon which usually is wrong.

You should split it into two different data step.

data x;
call streaminit(123);
do i=1 to 1000;
x=rand('normal', 0, 1);
output;
end;
run;

data want;
 set x;
y=lag(x)+x;
if i=1 then y=x;
run;



Ksharp

Respected Advisor
Posts: 3,124

Re: Anything wrong with the codes?

,

Your comment of using lag() conditionally is absolutely appropriate, and I think you are reading OP's mind correctly. However, just in case that OP wants to use lag() on the fly (y=lag(y)), and to avoid conditional lag() as well as 50% obs being missing,  we can try:

data want1;

call streaminit(123);

do i=1 to 1000;

x=rand('normal', 0, 1);

y=ifn(i<3,x,lag(y)+x);

/*if i=1 then y=x;*/

/* else y=lag(y)+x;*/

output;

end;

run;

Haikuo

Super User
Posts: 10,500

Re: Anything wrong with the codes?

Or RETAIN may be appropriate:

 

data want;

call streaminit(123);

retain y .;

do i=1 to 1000;

x=rand('normal', 0, 1);

if i=1 then y=x;

else y=y+x;

output;

end;

run;

Respected Advisor
Posts: 3,124

Re: Anything wrong with the codes?

Yes, 'retain' is better, and it is  for sure worth introducing it to OP instead of trying squeezing lag() and making it more complex. Haikuo

Frequent Contributor
Posts: 129

Re: Anything wrong with the codes?

I may be wrong here, but it seems to me that the easiest way to fix this is to remove the lag function since it is not needed.  Since the overall implicit data loop runs only once, won't the following code generate the desired random walk?

data want;
  call streaminit(123);
 
  do i=1 to 1000;

     x=rand('normal', 0, 1);
     if i=1 then y=x;
     else y=y+x;
     output;

  end;

run;

Ask a Question
Discussion stats
  • 5 replies
  • 282 views
  • 0 likes
  • 5 in conversation