I'm using PC SAS 9.4M3.
I've done some time series modeling, generated scoring code, and I'm trying to predict into the future. But the issue I'm having is that I've been aksed to use AdaptiveReg and not TimeSeries so I had to code the lag variables myself. No problem there.
Where I'm running into issues is with the circular logic, for each row in my data, after the actuals, I need to grab the previous value, score the model, then store that prediction so I can grab it for the next row. Sounds simple enough.
So for a simplificaion let's say I have a dataset like this where A is my dep var and Z is my prediction. It is simply 2*LAG_A. I have 4 months of data and I'm trying to predict out to month 9.
month
a
lag_a
z
1
2
.
.
2
3
2
4
3
5
3
6
4
5
10
5
6
7
8
9
I tried something like the following:
data scored;
set actuals;/*the above table without column z*/
z=2*Lag_A;
if a=. then a=z;/*take the predicted value as my dep var where I have no actuals*/
temp_lag=lag(a);/*I want the lag to execute each time so all values go into the queue*/
if lag_a=. then lag_a=temp_lag;/*only fill in if I don't have the actual value already there*/
run;
this works great for month 4, but not for month 5 since I need the lag statement before I calculate z (otherwise I don't have a value in lag_a), BUT I can't really do that since it loads the value of a to the queue and before I calculate Z, A is missing.
I tried to do the lag before and after, thinking that doing it before would grab the value from the queue while loading a missing to the queue, and then doing it again after scoring would put the correct value in the queue, but that didn't work as I expected either.
data scored;
set actuals;/*the above table without column z*/
temp_lag=lag(a);/*grab last value from queue*/
z=2*Lag_A;
if a=. then a=z;/*take the predicted value as my dep var where I have no actuals*/
temp_lag=lag(a);/*write the new value of a to the queue*/
if lag_a=. then lag_a=temp_lag;/*only fill in if I don't have the actual value already there*/
run;
The only change is that lag_a does get filled in, but z still doesn't calculate correctly, it's still getting missing values from the queue.
I thought maybe I coudl do SYMGET before calculating Z and then do a CALL SYMPUT after calculations, but my understanding is that the macro var CALL SYMPUT creates isn't available till after the RUN;
Is there any hope?
... View more