Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Find a Community

- Home
- /
- Analytics
- /
- Forecasting
- /
- How to generate a forecast path using data step?

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

03-04-2013 02:27 PM

Hi, folks:

I have a simple time series model but not estimated by arima, but I want to generate a forecast path based on historical data and estimated parameters.

For example, the model is given by x=beta1*lag(x)+beta2*lag2(x); obviously the forecast for a given forecast period, say, t+k, should be xhat(t+k)=beta1*xhat(t+k-1)+beta2*xhat(t+k-2), where xhat is the forecast value.

I wonder if I can use the data step to archieve this goal. The key part is to update the value of xhat iteratively.

I have a data set with the structure as the following:

xxxx;

T X Beta1 Beta2

_________________________

1 x (1) beta1 beta2

2 x (2) beta1 beta2

3 . beta1 beta2

4 . beta1 beta2

5 . beta1 beta2

Basically, if there is historical data, the value of x is the historical value, if not, it is missing and the value of Beta1 and Beta2 are hold at the estimated value for each observation. The task is to generate a series of Xhat. Xhat(T)=beta1*Xhat(t-1)+beta2*Xhat(t-2);, for T=3, Xhat(2)=x(2) and Xhat(1)=x(1). For T>3, we just use lag values of Xhat.

Here is my code;

data yyy;

set xxxx;

xhat=X;

l1_xhat0=lag(xhat);

l2_xhat0=lag(l1_xhat);

xhat0=beta1*l1_xhat0+beta2*l2_xhat0;

xhat=xhat0;

run;

However, in the dataset, yyy, the value of xhat is still missing.

Can anyone give me some hints or advice on what the correct way is to do it?

Thank you very much in advance.

Regards,

Jing

Accepted Solutions

Solution

03-04-2013
05:28 PM

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

Posted in reply to bigbigben

03-04-2013 05:28 PM

Here's an attempt, possibly a good one at that.

data yyy;

L2 = L1;

L1 = Xhat;

retain Xhat L1 L2;

set xxx;

if _n_ < 3 then Xhat = X;

else Xhat = beta1 * L1 + beta2 * L2;

run;

Good luck.

All Replies

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

Posted in reply to bigbigben

03-04-2013 03:17 PM

Can you provide some sample data and, based on that data, the values you want used at each step of the calculation?

Solution

03-04-2013
05:28 PM

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

Posted in reply to bigbigben

03-04-2013 05:28 PM

Here's an attempt, possibly a good one at that.

data yyy;

L2 = L1;

L1 = Xhat;

retain Xhat L1 L2;

set xxx;

if _n_ < 3 then Xhat = X;

else Xhat = beta1 * L1 + beta2 * L2;

run;

Good luck.

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

Posted in reply to Astounding

03-05-2013 09:50 AM

Hi, Astounding:

Thank you very much. It works very well. If there are different groups of data and different parameter values, and I want to do the same thing for each group, can I simply write the code as:

data yyy;

L2 = L1;

L1 = Xhat;

retain Xhat L1 L2;

set xxx;

** by group;**

if _n_ < 3 then Xhat = X;

else Xhat = beta1 * L1 + beta2 * L2;

run;

I know I am being lazy here, but your input is highly appreciated.

Best,

Jing

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content

Posted in reply to bigbigben

03-05-2013 11:12 AM

Should be possible with minor changes:

data yyy;

L2 = L1;

L1 = Xhat;

retain Xhat L1 L2;

set xxx;

**by group;**

** if first.group then group_counter=1;**

** else group_counter + 1;**

** ** if **group_counter** < 3 then Xhat = X;

else Xhat = beta1 * L1 + beta2 * L2;

run;

If you're working with large amounts of data, you can speed things up a tiny bit by changing the order of the last two statements:

if group_counter > 2 then Xhat = beta1 * L1 + beta2 * L2;

else Xhat = X;

Good luck.