Page 1 of 4

Automatic ARMA selection

Posted: Wed Jul 29, 2009 12:20 pm
by EViews Gareth

Code: Select all

'Create some data.  Delete these first few lines if you want to run on your existing workfile.

create u 1000
series y=nrnd






'Program that calculates the "best" ARMA specification for an equation.  Edit the variables below to match your particular data/setup.

%eqname = "EQ01"   'name of equation object that will be used.
%maxAR = "2"            'maximum number of AR terms
%maxMA = "3"   'maximum number of MA terms
%dep = "Y"   'dependent variable
%regs = "C "   'independent variables
%criterion = "@AIC"    'which criterion to use  enter "@AIC" for Akaike, "@schwarz" for Schwarz, and @HQ for Hannan-Quinn

!maxAR = @val(%maxAR)
!maxMA = @val(%maxMA)


close {%eqname}


'create table for storing critical values.
%matname = "crits"
if @isobject(%matname) then
   %matname = "__crits"
   if @isobject(%matname) then
      delete {%matname}
   endif
endif
table(!maxar+2,!maxma+2) {%matname}
{%matname}(1,1) = "AR /  MA"
{%matname}.setlines(1) +b
{%matname}.setlines(a) +r

'set sample
smpl @first+!maxAR @last

!mincrit = 1e12  'set the minimum to an artificially large value to begin

'estimate the models
%arstring = ""
for !i=0 to !maxar
   'build up string for AR terms.
   if !i>0 then
      %arstring = %arstring + " ar(" + @str(!i) + ")"
   endif
   %mastring = ""
   for !j=0 to !maxma
      'build up string for MA terms
      if !j>0 then
         %mastring = %mastring + " ma(" + @str(!j) + ")"
      endif
      'estimate equation
      equation {%eqname}.ls {%dep} {%regs} {%arstring} {%mastring}
      'capture criterion
      if @upper(%criterion) = "@AIC" then
         !crit = {%eqname}.@aic
      endif
      if @upper(%criterion) = "@SCHWARZ" then
         !crit = {%eqname}.@schwarz
      endif
      if @upper(%criterion) = "@HQ" then
         !crit = {%eqname}.@hq
      endif
      'compare criterion
      if !crit < !mincrit then
         !mincrit = !crit
         !bestAR = !i
         !bestMA = !j
         %bestARstr = %arstring   'store the best ar string
         %bestMAstr = %mastring   'store the best ma string
         {%matname}.settextcolor(@all) black   'table formatting.
         !ii=!i+2
         !jj=!j+2
         {%matname}.settextcolor(!ii,!jj) red
      endif
      {%matname}(!i+2,!j+2) = !crit
      {%matname}(!i+2,1) = !i
      {%matname}(1,!j+2) = !j
   next
next

equation {%eqname}.ls {%dep} {%regs} {%bestARstr} {%bestMAstr}

show {%eqname}
show {%matname}

Re: Automatic ARMA selection

Posted: Wed Jul 29, 2009 2:04 pm
by EViews Gareth
Note that this program was posted as a guide as to how such a program could be written, and is in no way a recommendation of the use of such a program as a method of calculating the best ARMA structure for your data :D

In practice it seems that such AIC/BIC/HQ based selection routines tend to over-specify the ARMA terms by a fair bit.

Re: Automatic ARMA selection

Posted: Thu Feb 18, 2010 8:59 pm
by micmic
I tried it but it said

@UPPER is an illegal or reserved name in "IF @UPPER("@AIC")="@AIC" THEN

Is there an alternative word for " UPPER " I can use? Does this code work in EVIEWS 5?

Re: Automatic ARMA selection

Posted: Mon Feb 22, 2010 12:06 pm
by micmic
This code only works in EVIEWS 6.0

Re: Automatic ARMA selection

Posted: Mon Feb 22, 2010 12:17 pm
by EViews Gareth
True, although you could always change the code to remove the @upper parts. Change the line:

Code: Select all

if @upper(%criterion) = "@AIC" then

to be:

Code: Select all

if %criterion = "@AIC" then



Of course you then lose the ability to specify the IC you want in lower case letters.

Re: Automatic ARMA selection

Posted: Mon Feb 22, 2010 2:17 pm
by micmic
Thanks Gareth. This is very helpful.

Re: Automatic ARMA selection

Posted: Mon Feb 22, 2010 3:36 pm
by micmic
I noticed that using this code EVIEWS 6.0 cannot handle ARMA terms greater than 11 (i.e. ARMA(11,11)). I have no trouble running ARMA(1,11) but when I increase it I get warning "Too Many ARMA Terms".

Is there a way to increase EVIEWS memory size to accomodate higher order ARMA terms?

Re: Automatic ARMA selection

Posted: Mon Feb 22, 2010 4:27 pm
by EViews Gareth
It isn't really a case of memory size. There's just a limit on how many ARMA terms we let you estimate.

Re: Automatic ARMA selection

Posted: Wed Sep 01, 2010 11:25 am
by kanonathena
Hi,

I modified this code to regress inflation on lags of inflation (0-4 lags) and lags of indicator x (inl: long term interest rate) (1-4 lags) . Using AIC to automatically select lags, I got two tables, one is

_Crits
lags of inflation / lags of x 1.000000 2.000000 3.000000 4.000000
0.000000 3.162417 3.042816 2.999997 2.976678
1.000000 3.162417 3.042816 2.999997 2.976678
2.000000 3.162417 3.042816 2.999997 2.976678
3.000000 3.162417 3.042816 2.999997 2.976678
4.000000 3.162417 3.042816 2.999997 2.976678

Why is AIC is the same for different lags of inflation?

The other table
Crits
AR / MA 1.000000 2.000000 3.000000 4.000000
0.000000 2.995104 2.916265 2.904264 2.860316


I don't understand the reason for two tables. Can someone explain to me this part of the original code:

'create table for storing critical values.
%matname = "crits"
if @isobject(%matname) then
%matname = "__crits"
if @isobject(%matname) then
delete {%matname}
endif
endif

What is @isobject? What does mat from %matname refer to?

and also this part:

'estimate the models
%arstring = ""
for !i=0 to !maxar
'build up string for AR terms.
if !i>0 then
%arstring = %arstring + " ar(" + @str(!i) + ")"
endif
%mastring = ""
for !j=0 to !maxma
'build up string for MA terms
if !j>0 then
%mastring = %mastring + " ma(" + @str(!j) + ")"
endif

What does %arstring and %mastring equal to when !i and !j are 0? It seems undefined from the code?


Lastly, this is modified code I used:


'Program that calculates the "best" ARMA specification for an equation. Edit the variables below to match your particular data/setup.

%eqname = "EQ01" 'name of equation object that will be used.
%maxINF= "4" 'maximum number of AR terms
%maxX = "4" 'maximum number of MA terms
%dep = "INF" 'dependent variable
%regs = "INL" 'independent variables
%criterion = "@AIC" 'which criterion to use enter "@AIC" for Akaike, "@schwarz" for Schwarz, and @HQ for Hannan-Quinn

!maxINF = @val(%maxINF)
!maxX = @val(%maxX)


close {%eqname}

'create table for storing critical values.
%matname = "crits"
if @isobject(%matname) then
%matname = "__crits"
if @isobject(%matname) then
delete {%matname}
endif
endif
table(!maxINF+2,!maxX+2) {%matname}
{%matname}(1,1) = "lags of inflation / lags of x"
{%matname}.setlines(1) +b
{%matname}.setlines(a) +r

!mincrit = 10000 'set the minimum to an artificially large value to begin

'estimate the models
%infstring = ""
for !i=0 to !maxINF
'build up string for AR terms.
if !i>0 then
%infstring = %infstring + " inf(-" + @str(!i) + ")"
endif
%xstring = ""
for !j=1 to !maxX
'build up string for indicator
if !j>1 then
%xstring = %xstring + " inl(-" + @str(!j) + ")"
endif
'estimate equation
equation {%eqname}.ls {%dep} c {%arstring} {%xstring}
'capture criterion
if @upper(%criterion) = "@AIC" then
!crit = {%eqname}.@aic
endif
if @upper(%criterion) = "@SCHWARZ" then
!crit = {%eqname}.@schwarz
endif
if @upper(%criterion) = "@HQ" then
!crit = {%eqname}.@hq
endif
'compare criterion
if !crit < !mincrit then
!mincrit = !crit
!bestINF = !i
!bestX = !j
%bestINFstr = %arstring 'store the best ar string
%bestXstr = %mastring 'store the best ma string
{%matname}.settextcolor(@all) black 'table formatting.
!ii=!i+2
!jj=!j+2
{%matname}.settextcolor(!ii,!jj) red
endif
{%matname}(!i+2,!j+2) = !crit
{%matname}(!i+2,1) = !i
{%matname}(1,!j+2) = !j
next
next

equation {%eqname}.ls {%dep} c {%bestINFstr} {%bestXstr}


The best model is:

Variable Coefficient Std. Error t-Statistic Prob.

C 1.454179 0.093277 15.58990 0.0000

Only a constant term, can anyone tell me what is wrong with my code?

Re: Automatic ARMA selection

Posted: Wed Sep 01, 2010 12:06 pm
by EViews Gareth
Seems a lot of your questions could be answered by reading through the manual. I'll have a go at some of them though.


kanonathena wrote:

I don't understand the reason for two tables. Can someone explain to me this part of the original code:

'create table for storing critical values.
%matname = "crits"
if @isobject(%matname) then
%matname = "__crits"
if @isobject(%matname) then
delete {%matname}
endif
endif

What is @isobject? What does mat from %matname refer to?


The individual questions I'll leave up to the manual to describe. However all that code is doing is making sure that if there is already an item called CRITS, then we don't use that name, rather we use the name __CRITS.


'estimate the models
%arstring = ""
for !i=0 to !maxar
'build up string for AR terms.
if !i>0 then
%arstring = %arstring + " ar(" + @str(!i) + ")"
endif
%mastring = ""
for !j=0 to !maxma
'build up string for MA terms
if !j>0 then
%mastring = %mastring + " ma(" + @str(!j) + ")"
endif

What does %arstring and %mastring equal to when !i and !j are 0? It seems undefined from the code?

Both strings are initialised as "" (i.e. empty strings).

Lastly, this is modified code I used:


'Program that calculates the "best" ARMA specification for an equation. Edit the variables below to match your particular data/setup.

%eqname = "EQ01" 'name of equation object that will be used.
%maxINF= "4" 'maximum number of AR terms
%maxX = "4" 'maximum number of MA terms
%dep = "INF" 'dependent variable
%regs = "INL" 'independent variables
%criterion = "@AIC" 'which criterion to use enter "@AIC" for Akaike, "@schwarz" for Schwarz, and @HQ for Hannan-Quinn

!maxINF = @val(%maxINF)
!maxX = @val(%maxX)


close {%eqname}

'create table for storing critical values.
%matname = "crits"
if @isobject(%matname) then
%matname = "__crits"
if @isobject(%matname) then
delete {%matname}
endif
endif
table(!maxINF+2,!maxX+2) {%matname}
{%matname}(1,1) = "lags of inflation / lags of x"
{%matname}.setlines(1) +b
{%matname}.setlines(a) +r

!mincrit = 10000 'set the minimum to an artificially large value to begin

'estimate the models
%infstring = ""
for !i=0 to !maxINF
'build up string for AR terms.
if !i>0 then
%infstring = %infstring + " inf(-" + @str(!i) + ")"
endif
%xstring = ""
for !j=1 to !maxX
'build up string for indicator
if !j>1 then
%xstring = %xstring + " inl(-" + @str(!j) + ")"
endif
'estimate equation
equation {%eqname}.ls {%dep} c {%arstring} {%xstring}
'capture criterion
if @upper(%criterion) = "@AIC" then
!crit = {%eqname}.@aic
endif
if @upper(%criterion) = "@SCHWARZ" then
!crit = {%eqname}.@schwarz
endif
if @upper(%criterion) = "@HQ" then
!crit = {%eqname}.@hq
endif
'compare criterion
if !crit < !mincrit then
!mincrit = !crit
!bestINF = !i
!bestX = !j
%bestINFstr = %arstring 'store the best ar string
%bestXstr = %mastring 'store the best ma string
{%matname}.settextcolor(@all) black 'table formatting.
!ii=!i+2
!jj=!j+2
{%matname}.settextcolor(!ii,!jj) red
endif
{%matname}(!i+2,!j+2) = !crit
{%matname}(!i+2,1) = !i
{%matname}(1,!j+2) = !j
next
next

equation {%eqname}.ls {%dep} c {%bestINFstr} {%bestXstr}


You're estimating the equation:

Code: Select all

equation {%eqname}.ls {%dep} c {%arstring} {%xstring}

Yet nowhere in your program have you defined what %arstring is, so that bit is meaningless.

Re: Automatic ARMA selection

Posted: Thu Sep 02, 2010 5:54 am
by kanonathena
After finding the model with the right lags for inflation and indicator x, I want to use recursive estimation to find all the forecast errors from one-step ahead static regression. Here is the code I modified from the rolling window thread based on a test model(.ls inf c inl(-1) ):



' get size of workfile
!length = @obsrange

' declare equation for estimation
equation eq1

'create table for storing critical values.
%matname = "forecast errors"
table(!length-40,1) {%matname}

' move sample !step obs at a time
for !i = 0 to !length-40-1

' set sample to estimation period
smpl @first @first+40+!i

' estimate equation
equation eqtest.ls inf c inl(-1)

'calculate forecast error
smpl @first+40+!i+1 @first+40+!i+1
eqtest.forecast inffit
!error=@mean(inffit)- @first+40+!i+1 'calculate forecast error

'store forecast errors
{%matname}(!i,1)=!error
next

show {%matname}

Questions:

1. Regarding this part:

'calculate forecast error
smpl @first+40+!i+1 @first+40+!i+1
eqtest.forecast inffit
!error=@mean(inffit)- @first+40+!i+1 'calculate forecast error

What is the function to extract the fitted value of inflation(I used @mean here since there is only one fitted value) and the corresponding actual value(@first+40+!i+1)?
Is there any other ways to calculate forecast error? I know these must be somewhere in the manual I just can't find it.


2. Regarding this part:
' estimate equation
equation eqtest.ls inf c inl(-1)

How do I replace this with the model selected by AIC before:

equation {%eqname}.ls inf c {%bestINFstr} {%bestXstr}

How do I quote the result from a program before or must I nest it?

If there is any other problem you see please tell me.

Re: Automatic ARMA selection

Posted: Mon Nov 01, 2010 7:29 am
by tony
if we make a MLE method to estimate the coefficients, rather than OLS, how to do the automatic arma selection?

Re: Automatic ARMA selection

Posted: Tue Mar 08, 2011 4:35 am
by pablete
Hey Gareth, I saw you mention that there is a limit on the ARMA terms, I assume there is a reason for that. I'm asking because I'm working with hourly data that are clearly autocorrelated up to 24 hours, I'm trying to stimate a model with AR terms AR(1) ... AR(24), Am I doing something essentially wrong? Or just impossible to do in EVIEWS?

EViews Gareth wrote:It isn't really a case of memory size. There's just a limit on how many ARMA terms we let you estimate.

Re: Automatic ARMA selection

Posted: Tue Mar 08, 2011 9:00 am
by EViews Gareth
Currently impossible to have all 24 AR terms.

I will point out though that your model would probably be quite unreasonable with all 24 AR terms.

Re: Automatic ARMA selection

Posted: Sun Mar 27, 2011 7:08 am
by peter.t
Dear EViews Gareth,

I tried your program for an automatic ARMA selection and it worked.
Am I allowed to use your program for writing a paper, in which I have to estimate an ARMA model?
Of course, I would name you in the references section.

Thank you in advance for a reply!

Peter