Page 1 of 1

The HASH aggregator

Posted: Fri Jun 20, 2014 5:41 pm
by TomDoan
The HASH was introduced with RATS 8.2. A HASH is similar to a VECTOR, except that the elements are indexed by strings (called "keys") rather than by numbers. It can't be used directly in calculations the way a VECTOR can, but is instead designed to make it simpler to organize information. You can create a HASH of any data type. The one function which applied to a HASH is %KEYS, which returns a VECTOR[STRINGS] with the keys. The keys aren't case-sensitive, so you can use "abc" or "ABC" or "AbC" to reference the same element.

As with other aggregate types, the data type for a HASH is written as HASH[basetype], such as HASH[REAL] or HASH[VECT[VECT]]. It's important to note that a new element is added to the HASH any time you use a new string, even if it's by mistake. For instance,

dec hash[series] rseries
set rseries("defined") = %ran(1.0)
stats rseries("notdefined")

will add a second (empty) series named "notdefined" to the HASH and give a warning about having no data on the STATISTICS instruction.


An example is the following:

Code: Select all

open data "g7rxrate.xls"
calendar(a) 1970:1
data(format=xls,org=columns) 1970:01 2003:01 canrxrate frarxrate gbrrxrate gerrxrate $
   itarxrate jpnrxrate
*
dec hash[integer] lags
dofor s = canrxrate to jpnrxrate
   set lx = log(s{0}/s{1})
   @adfautoselect(maxlags=4,print,crit=aic) lx
   compute lags(%l(s))=%%autop
end dofor s
This runs a set of @ADFAUTOSELECT procedures on data, and saves the number of chosen lags into a HASH[INTEGER]. Now LAGS("CANRXRATE") will be the number of lags chosen when S is CANRXRATE and LAGS("ITARXRATE") will be the number chosen when S is ITARXRATE. Note that you have to use "..." around literal strings in referencing an element.

As another example, this creates a HASH[STRING], again indexed by the series names, with long descriptors of the series. These are used in the headers on the graphs and to label regression output.

Code: Select all

dec hash[string] ln
compute ln("rgnp")="Real GNP"
compute ln("gnp")="Nominal GNP"
compute ln("pcrgnp")="Real GNP(per capita)"
compute ln("ip")="Industrial production"
compute ln("emp")="Employment"
compute ln("un")="Unemployment"
compute ln("prgnp")="GNP Deflator"
compute ln("cpi")="CPI"
compute ln("wg")="Wages"
compute ln("rwg")="Real wages"
compute ln("m")="Money stock"
compute ln("vel")="Velocity"
compute ln("bnd")="Bond yield"
compute ln("sp500")="Stock price"
compute ln("dettrend")="Det. trend"
compute ln("sttrend")="Random walk"
*
spgraph(vfields=4,hfields=4,fillby=rows,footer="Figure 16.1 US annual macroeconomics variables")
dofor y = rgnp to sp500 dettrend sttrend
   graph(header=ln(%l(y)))
   # y
end dofor y
spgraph(done)
*
set trend = t*.01
*
dofor y = rgnp to sp500 dettrend sttrend
   disp ln(%l(y))
   linreg(noprint) y
   # constant trend
   disp %beta
   linreg(noprint) y
   # constant y{1}
   disp %beta
   linreg(noprint) y
   # constant trend y{1}
   disp %beta
end dofor y