This can be done with lag, even when sorted by monthend/group.
It's not initialy intutitive, but it does allow for a very simple program:
data want (drop=oldgoal);
oldgoal=lag3(goal);
set temp;
if _n_<=4 then goal=goal+comm_inc;
else do;
comm_inc=comm*oldgoal;
goal=oldgoal+comm_inc;
end;
run;
It has three main features:
It takes the lag of goal and puts it in another var (oldgoal), as per @Astounding's suggestion.
Because you were modifying the GOAL variable after retrieving its value, the lag queue was not getting the modified value. To remedy this I moved the LAG function to precede the SET statement. This allowed it to work from the modified values (but note it's the modified value of the PRIOR obs, which is about to be replaced by the SET statement).
Instead of lag4 (for 4 regions: east/north/south/west), I have to use LAG3. This is because I placed the lag function prior to the SET statement, so I need to go back one less entry.
... View more