******************************************************************** ** THIS FILE CONTAINS THE PROGRAMS USED TO COMPUTE THE TABLES AND ** ** CERTAIN FIGURES FOR THE MILLS & WOOD JULY/AUGUST 1993 REVIEW ** ** ARTICLE "DOES THE EXCHANGE RATE REGIME AFFECT THE ECONOMY?" ** ** -------------------------------------------------------------- ** ** THIS PROGRAM IS WRITTEN IN MAINFRAME SAS, VERSION 6.07 ** ** THE HODRICK-PRESCOTT FILTER IS WRITTEN IN "IML" (MATRIX CODE) ** ** AND IS ENCLOSED IN A "MACRO" (SUBROUTINE) ** ******************************************************************** ; ************************************************************************ ** THE FOLLOWING CODE ESTIMATES THE OUTPUT MODEL ON PAGE 6, GENERATES ** ** THE DATA TO BE USED IN FIGURE 1 (THE TREND LINE) AND COMPUTES THE ** ** TREND GROWTH RATES USED ON PAGE 6. ** ************************************************************************ ; FILENAME ON 'H1KMW00.WOOD.CNTL'; DATA OUTPUT; INFILE ON(OUTPUT) FIRSTOBS=9; INPUT YEAR OUTPUT; T +1; y = LOG(OUTPUT); IF T > 64 THEN DUMMY1=T-64; ELSE DUMMY1=0; IF T > 67 THEN DUMMY2=T-67; ELSE DUMMY2=0; int = 1; ************************************************ ** output model from page 6 ** ** trend from this model is used for figure 1 ** ************************************************; PROC MODEL DATA=OUTPUT; PARMS ALPHA BETA LAMBDA1 LAMBDA2 THETA1 THETA2; Y = (ALPHA*INT + BETA*T + LAMBDA1*DUMMY1 + LAMBDA2*DUMMY2) + THETA1*(LAG1(Y) - (ALPHA*INT + BETA*LAG1(T) + LAMBDA1*LAG1(DUMMY1) + LAMBDA2*LAG1(DUMMY2))) + THETA2*(LAG2(Y) - (ALPHA*INT + BETA*LAG2(T) + LAMBDA1*LAG2(DUMMY1) + LAMBDA2*LAG2(DUMMY2))); FIT Y / OUTEST=PARMS; DATA BOTH; if _n_=1 then set parms(drop=_name_ _type_ _nused_); set OUTPUT; TREND = ALPHA + BETA*T + LAMBDA1*DUMMY1 + LAMBDA2*DUMMY2; TRENDGRO = DIF(TREND); CYCLE = Y - TREND; ************************************** ** trend growth mentioned on page 6 ** **************************************; PROC PRINT DATA=BOTH; **************************** ** STATISTICS FOR TABLE 1 ** ****************************; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1855<=YEAR<=1913)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1855<=YEAR<=1931)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1855<=YEAR<=1913 ³ 1922<=YEAR<=1931)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1922<=YEAR<=1931)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1922<=YEAR<=1939)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1932<=YEAR<=1939)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1932<=YEAR<=1990)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1932<=YEAR<=1939 ³ 1946<=YEAR<=1990)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1946<=YEAR<=1990)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1946<=YEAR<=1972)); VAR CYCLE; PROC MEANS DATA=BOTH(KEEP=YEAR CYCLE WHERE=(1973<=YEAR<=1990)); VAR CYCLE; **************************************************************** ** the following are programs for tables 2-5, with each table ** ** using the Hodrick-Prescott filter, for which the code ** ** immediately follows this note ** ****************************************************************; %MACRO HPFILTER(VAR=,DATASET=); PROC IML; USE &DATASET; READ ALL VAR{&VAR} INTO XDATA; S = 1600; ******** SMOOTHING PARAMETER; N = NROW(XDATA); IOPT = 0; SS = 0; NN = 0; T = J(N,1,0); D = J(N,1,0); V = J(N,3,0); IF ( (NN <> N) ³ (S <> SS) ³ (IOPT <> 1) ) THEN DO; SS = S; NN = N; V11 = 1; V22 = 1; V12 = 0; DO I = 3 TO N; X = V11; Z = V12; V11 = (1 / S) + (4 * (X - Z)) + V22; V12 = (2 * X) - Z; V22 = X; DET = (V11 * V22) - (V12 * V12); V(³I,1³) = (V22 / DET); V(³I,3³) = (V11 / DET); V(³I,2³) = -(V12 / DET); X = (V11 + 1); Z = V11; V11 = V11 - ((V11 * V11) / X); V22 = V22 - ((V12 * V12) / X); V12 = V12 - ((Z * V12) / X); END; END; M1 = XDATA(³2,1³); M2 = XDATA(³1,1³); DO I = 3 TO N; X = M1; M1 = (2 * M1) - M2; M2 = X; T(³I-1,1³) = (V(³I,1³) * M1) + (V(³I,2³) * M2); D(³I-1,1³) = (V(³I,2³) * M1) + (V(³I,3³) * M2); DET = (V(³I,1³) * V(³I,3³)) - (V(³I,2³) * V(³I,2³)); V11 = V(³I,3³) / DET; V12 = -(V(³I,2³) / DET); Z = (XDATA(³I,1³) - M1) / (V11 + 1); M1 = M1 + (V11 * Z); M2 = M2 + (V12 * Z); END; T(³N,1³) = M1; T(³N-1,1³) = M2; M1 = XDATA(³N-1,1³); M2 = XDATA(³N,1³); DO I = (N-2) TO 1 BY -1; I1 = I + 1; IB = N - I + 1; X = M1; M1 = (2* M1) - M2; M2 = X; IF (I > 2) THEN DO; E1 = (V(³IB,3³) * M2) + (V(³IB,2³) * M1) + T(³I,1³); E2 = (V(³IB,2³) * M2) + (V(³IB,1³) * M1) + D(³I,1³); B11 = V(³IB,3³) + V(³I1,1³); B12 = V(³IB,2³) + V(³I1,2³); B22 = V(³IB,1³) + V(³I1,3³); DET = (B11 * B22) - (B12 * B12); T(³I,1³) = ( (-B12 * E1) + (B11 * E2) ) / DET; END; DET = (V(³IB,1³) * V(³IB,3³)) - (V(³IB,2³) * V(³IB,2³)); V11 = V(³IB,3³) / DET; V12 = -(V(³IB,2³)) / DET; Z = (XDATA(³I,1³) - M1) / (V11 + 1); M1 = M1 + (V11 * Z); M2 = M2 + (V12 * Z); END; T(³1,1³) = M1; T(³2,1³) = M2; DO I = 1 TO N; D(³I,1³) = XDATA(³I,1³) - T(³I,1³); END; ALL = XDATA³³T³³D; CREATE OUTDAT FROM ALL; APPEND FROM ALL; %MEND; ********** MACRO ENDS HERE ***************; ********************** ** code for table 2 ** **********************; FILENAME ON 'H1KMW00.wood.CNTL'; DATA RPI; INFILE ON(RPI); INPUT RPI; sasdate = mdy(month,1,year); rpi = log(rpi); IF '01jan22'd <= sasdate <= '01apr92'd; FORMAT SASDATE YYMMP7.; %HPFILTER(VAR=rpi,DATASET=rpi); data trend;merge outdat(rename=(col1=rpi col2=trend col3=cycle)) rpi(keep=sasdate); ** THE "OUTDAT" DATA SET IS CREATED IN THE MACRO HPFILTER **; proc means data=trend(where=('01jan22'd<=sasdate<='31dec39'd)); var rpi trend cycle; title1 '1922.01 to 1939.12'; proc means data=trend(where=('01jan46'd<=sasdate<='01apr92'd)); var rpi trend cycle; title1 '1946.01 to 1992.04'; proc means data=trend(where=('01jan46'd<=sasdate<='31dec72'd)); var rpi trend cycle; title1 '1946.01 to 1972.12'; proc means data=trend(where=('01jan73'd<=sasdate<='01apr92'd)); var rpi trend cycle; title1 '1973.01 to 1992.04'; ********************** ** code for table 3 ** **********************; DATA M3; INFILE ON(M3); INPUT M3; m3 = log(m3); sasdate = mdy(month,1,year); IF '01JAN22'D <= SASDATE <= '01JUN89'D; FORMAT SASDATE YYMMP7.; %HPFILTER(VAR=m3,DATASET=m3); data trend;merge outdat(rename=(col1=m3 col2=trend col3=cycle)) m3(keep=sasdate); proc means data=trend(where=('01jan1922'd<=sasdate<='31dec1939'd)); var m3 trend cycle; title1 '1922.01 to 1939.12'; proc means data=trend(where=('01jan1946'd<=sasdate<='01jun1989'd)); var m3 trend cycle; title1 '1946.01 to 1989.06'; proc means data=trend(where=('01jan1946'd<=sasdate<='31dec1972'd)); var m3 trend cycle; title1 '1946.01 to 1972.12'; proc means data=trend(where=('01jan1973'd<=sasdate<='01jun1989'd)); var m3 trend cycle; title1 '1973.01 to 1989.06'; ********************** ** code for table 4 ** **********************; DATA PRIME; INFILE ON(PRIME); INPUT PRIME; sasdate = mdy(month,1,year); FORMAT SASDATE YYMMP7.; %HPFILTER(VAR=prime,DATASET=prime); data trend; merge outdat(rename=(col1=prime col2=trend col3=cycle)) prime(keep=sasdate); proc means data=trend(where=('01jan1870'd<=sasdate<='31dec1913'd)); var prime trend cycle; title1 '1870.01 to 1913.12'; proc means data=trend(where=('01jan1922'd<=sasdate<='31dec1931'd)); var prime trend cycle; title1 '1922.01 to 1931.12'; proc means data=trend(where=('01jan1932'd<=sasdate<='31dec1939'd)); var prime trend cycle; title1 '1932.01 to 1939.12'; proc means data=trend(where=('01jan1954'd<=sasdate<='31dec1972'd)); var prime trend cycle; title1 '1954.01 to 1972.12'; proc means data=trend(where=('01jan1973'd<=sasdate<='01apr1992'd)); var prime trend cycle; title1 '1973.01 to 1992.04'; ********************** ** code for table 5 ** **********************; DATA CONSOL; INFILE ON(CONSOL); INPUT CONSOL; sasdate = mdy(month,1,year); FORMAT SASDATE YYMMP7.; if 537<=_n_<=540 then delete; %HPFILTER(VAR=consol,DATASET=consol); data trend; merge outdat(rename=(col1=consol col2=trend col3=cycle)) consol(keep=sasdate); proc means data=trend(where=('01jan1870'd<=sasdate<='31dec1913'd)); var consol trend cycle; title1 '1870.01 to 1913.12'; proc means data=trend(where=('01jan1922'd<=sasdate<='31dec1931'd)); var consol trend cycle; title1 '1922.01 to 1931.12'; proc means data=trend(where=('01jan1932'd<=sasdate<='31dec1939'd)); var consol trend cycle; title1 '1932.01 to 1939.12'; proc means data=trend(where=('01jan1954'd<=sasdate<='31dec1972'd)); var consol trend cycle; title1 '1954.01 to 1972.12'; proc means data=trend(where=('01jan1973'd<=sasdate<='01apr1992'd)); var consol trend cycle; title1 '1973.01 to 1992.04'; ********************************************************** ** THE FOLLOWING IS THE CODE USED TO PRODUCE THE CHARTS ** ** IN FIGURES 9 THROUGH 12 ** **********************************************************; *********************** ** CODE FOR FIGURE 9 ** ***********************; DATA RPI; INFILE ON(RPI); INPUT RPI; sasdate = mdy(month,1,year); rpi = log(rpi); IF '01JAN22'D <= SASDATE <= '01APR92'D; FORMAT SASDATE YYMMP7.; %HPFILTER(VAR=rpi,DATASET=rpi); data rpi_t;MERGE outdat(rename=(col1=rpi col2=TREND col3=CYCLE)) RPI(KEEP=SASDATE); file 'wood.cntl(figure9)'; put sasdate yymmp7. @12 rpit1 @26 rpid1; ************************ ** CODE FOR FIGURE 10 ** ************************; DATA M3; INFILE ON(M3); INPUT M3; sasdate = mdy(month,1,year); M3 = log(M3); IF '01JAN22'D <= SASDATE <= '01JUN89'D; FORMAT SASDATE YYMMP7.; %HPFILTER(VAR=M3,DATASET=M3); data M3_t;MERGE outdat(rename=(col1=M3 col2=TREND col3=CYCLE)) M3(KEEP=SASDATE); file 'wood.cntl(figure10)'; put sasdate yymmp7. @12 TREND @26 CYCLE; ************************ ** CODE FOR FIGURE 11 ** ************************; DATA PRIME; INFILE ON(PRIME); INPUT PRIME; sasdate = mdy(month,1,year); PRIME = log(PRIME); FORMAT SASDATE YYMMP7.; %HPFILTER(VAR=PRIME,DATASET=PRIME); data PRIME_t;MERGE outdat(rename=(col1=PRIME col2=TREND col3=CYCLE)) PRIME(KEEP=SASDATE); file 'wood.cntl(figure11)'; put sasdate yymmp7. @12 TREND @26 CYCLE; ************************ ** CODE FOR FIGURE 12 ** ************************; DATA CONSOL; INFILE ON(CONSOL); INPUT CONSOL; CONSOL = log(CONSOL); IF 537 <= _N_ <= 540 THEN DELETE; FORMAT SASDATE YYMMP7.; %HPFILTER(VAR=CONSOL,DATASET=CONSOL); data CONSOL_t;MERGE outdat(rename=(col1=CONSOL col2=TREND col3=CYCLE)) CONSOL(KEEP=SASDATE); file 'wood.cntl(figure12)'; put sasdate yymmp7. @12 TREND @26 CYCLE; ********************************************************************; ** THE FOLLOWING CODE DETAILS HOW THE ANNUAL PRICE LEVEL DATA WAS ** ** COMPUTED FOR USE IN FIGURE 2. ** ** THE "OLD" SERIES WAS TAKEN FROM CAPIE & WEBBER(1985) AND RUNS ** ** THROUGH 1948. THE "NEW" SERIES WAS TAKEN FROM THE 1991 ANNUAL ** ** SUPPLEMENT TO ECONOMIC TRENDS, TABLE 25, THE "ALL ITEMS" INDEX ** ** AND THE RATIO THE "OLD" 1948 VALUE AND THE "NEW" 1948 VALUE ** ** WAS USED TO LINK THE TWO SERIES. ** ********************************************************************; DATA OLD; INFILE ON(RPI1) FIRSTOBS=5; INPUT YEAR RPI; DATA NEW; INFILE ON(RPI2) FIRSTOBS=8; ** FIRST YEAR IS 1949 **; INPUT YEAR RPI; RPI = RPI * (268/8.3); ** RATIO OF OLD TO NEW AT COMMON YR OF 1948 **; DATA BOTH; SET OLD NEW; ** STACK TWO SERIES INTO ONE **; RPI = LOG(RPI); PROC PRINT; DATA _NULL_;SET BOTH; FILE ON(FIGURE2A); ** CREATE TWO OUTPUT FILES FOR CHARTS **; PUT YEAR @10 RPI; DATA _NULL_;SET BOTH; FILE ON(FIGURE2B); PUT YEAR @10 RPI; ******************************************************************; ** THE FOLLOWING CODE DETAILS HOW THE OUTPUT SERIES WAS CREATED ** ** THE "OLD" DATA RUNS THROUGH 1948 AND IS FROM FEINSTEIN, THE ** ** "NEW" DATA STARTS IN 1948, BUT 1948'S VALUE IS ONLY USED TO ** ** COMPUTE THE RATIO OF THE TWO SERIES IN THAT YEAR. THEN THE ** ** NEW DATA IS MULTIPLIED BY THE RATIO AND THE TWO SERIES ARE ** ** LINKED, TAKING 1949 AS THE FIRST "NEW" DATA SERIES POINT. ** ******************************************************************; DATA OLD; INFILE ON(OUTPUT1) FIRSTOBS=7; INPUT YEAR OUTPUT; DATA NEW; INFILE ON(OUTPUT2) FIRSTOBS=9; ** OBS 9 IS YEAR 1949 **; INPUT YEAR OUTPUT; OUTPUT = OUTPUT * (144.7/40.3); ** RATIO OF OLD/NEW AT COMMON 1948 **; PROC PRINT; DATA BOTH; SET OLD NEW; ** STACK THE TWO SERIES TO CREATE NEW LINKED SERIES **; DATA _NULL_;SET BOTH; ** SET UP LINKED DATA FILE TO BE USED IN PGMS **; FILE ON(OUTPUT); PUT YEAR @10 OUTPUT;