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.

If you DISPLAY a HASH, it will show the combination of key and value as in the following:

"def" => 13.50000

"ghi" => 11.30000

"jlk" => 15.30000

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:

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.

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