I am working with both univariate and bivariate STAR models, which I have already estimated. I would now like to calculate and plot the impulse-response functions for these models using the generalized impulse-response function (GIRF) approach proposed by Koop et al. (1996):
Koop, Gary, M. Hashem Pesaran, and Simon M. Potter. 1996. “Impulse Response Analysis in Nonlinear Multivariate Models.” Journal of Econometrics, 74(1), 119–147.
Although the article focuses on nonlinear multivariate models, I would like to apply the GIRF methodology to both my univariate and bivariate STAR models. However, I have been unable to find any RATS code or examples for implementing this procedure.
Could you please advise me on how GIRFs can be estimated and plotted for univariate and bivariate STAR models in RATS? I would also greatly appreciate it if you could share any relevant code, examples, or references.
Thank you for your assistance.
I wrote the following code:
Code: Select all
********************************************************************
* GENERALIZED IMPULSE RESPONSE FUNCTIONS FOR AN LSTAR MODEL
* Koop, Pesaran and Potter (1996)
*
* Response variable : LOG GDP LEVEL (reconstructed), in percent
* Shock size : +/- 2s, s = residual standard error
* Histories : one expansion date and one recession date
********************************************************************
SEED 20250801
OPEN DATA "/Users/burcuozcan/Desktop/US BUSINESS CYCLE /USdata.xlsx"
CALENDAR(Q) 2005:1
DATA(FORMAT=XLSX,ORG=COLUMNS) 2005:01 2025:03 MAN
SET LGDPMAN = LOG(MAN)
SET Y = LGDPMAN - LGDPMAN{1}
********************************************************************
* DUMMY VARIABLES (used for ESTIMATION ONLY)
********************************************************************
SET D2008Q4 = T>=2008:04.AND.T<=2008:04
SET D2020Q2 = T>=2020:02.AND.T<=2020:02
SET D2020Q3 = T>=2020:03.AND.T<=2020:03
********************************************************************
* ESTIMATE THE LSTAR MODEL (once only)
********************************************************************
NONLIN A10 A11 A14 A20 A24 B1 C1 D1 D2 D3
FRML FLSTAR Y = A10 + A11*Y{1} + A14*Y{4} + $
(A20+A24*Y{4}) * $
(1.0/(1.0+EXP((-B1/0.024363)*(Y{1}-C1)))) + $
D1*D2008Q4 + D2*D2020Q2 + D3*D2020Q3
COMPUTE A10 = 0.00480084
COMPUTE A11 = 0.20416078
COMPUTE A14 = 0.94071737
COMPUTE A20 = -0.00445833
COMPUTE A24 = -1.06045591
COMPUTE D1 = -0.07994145
COMPUTE D2 = -0.10845153
COMPUTE D3 = 0.11869806
COMPUTE B1 = 19.37986840
COMPUTE C1 = -0.00198032
NLLS(FRML=FLSTAR) Y 2005:1 2025:3
COMPUTE SEESQ = %RSS/%NDF
COMPUTE STDDEV = SQRT(SEESQ)
DISPLAY "Residual variance = " SEESQ
DISPLAY "Residual std. dev. s = " STDDEV
********************************************************************
* TRANSITION FUNCTION -- USED TO CLASSIFY HISTORIES
*
* G(t) is evaluated with Y{1}, so G(t) describes the regime that
* prevails in the quarter in which the shock is imposed.
* G near 1 -> upper regime (expansion)
* G near 0 -> lower regime (recession)
********************************************************************
SET GFUN = 1.0/(1.0+EXP((-B1/0.024363)*(Y{1}-C1)))
PRINT / Y GFUN
********************************************************************
* NEUTRALISE THE OUTLIER DUMMIES BEFORE SIMULATING
*
* MUST come after NLLS. Without this, an expansion GIRF started in
* 2018:1 runs straight through 2020:2 and 2020:3 and the COVID
* dummies fire inside the simulation. Because the model is
* non-linear these do NOT cancel between the baseline and the
* shocked path -- they throw Y{1} into a different regime.
********************************************************************
SET D2008Q4 2005:1 2025:3 = 0.0
SET D2020Q2 2005:1 2025:3 = 0.0
SET D2020Q3 2005:1 2025:3 = 0.0
********************************************************************
* SELF-CONTAINED SIMULATION MODEL
*
* Equation 1 : LSTAR equation for the growth rate -> SIMS(1)
* Equation 2 : identity accumulating the log level -> SIMS(2)
*
* The impulse responses are taken from SIMS(2), i.e. from the
* reconstructed log GDP level, not from the growth rate.
********************************************************************
FRML(VARIANCE=SEESQ) FLSTAR_SIM Y = $
A10 + A11*Y{1} + A14*Y{4} + $
(A20+A24*Y{4}) * $
(1.0/(1.0+EXP((-B1/0.024363)*(Y{1}-C1)))) + $
D1*D2008Q4 + D2*D2020Q2 + D3*D2020Q3
FRML(IDENTITY) LGDPID LGDPMAN = LGDPMAN{1} + Y
GROUP STARMODEL FLSTAR_SIM LGDPID
********************************************************************
* GIRF SETTINGS
********************************************************************
COMPUTE NDRAWS = 5000
COMPUTE NSTEPS = 16
COMPUTE DELTA = 2.0*STDDEV
DISPLAY "Positive shock +2s = " DELTA
DISPLAY "Negative shock -2s = " -DELTA
* --- shock dates -------------------------------------------------
* The history conditioning the GIRF is everything up to the quarter
* BEFORE these dates.
COMPUTE ESTART = 2018:1
COMPUTE EEND = ESTART+NSTEPS-1
COMPUTE RSTART = 2009:2
COMPUTE REND = RSTART+NSTEPS-1
DISPLAY "Expansion date " %DATELABEL(ESTART) " G = " GFUN(ESTART)
DISPLAY "Recession date " %DATELABEL(RSTART) " G = " GFUN(RSTART)
* If these two G values are not close to 1 and 0 respectively,
* choose different dates from the PRINT of GFUN above before
* calling them "expansion" and "recession".
********************************************************************
* EXPANSION : POSITIVE SHOCK
********************************************************************
SET EGIRFPOS ESTART EEND = 0.0
DO DRAW=1,NDRAWS
SET SHOCKS ESTART EEND = %RAN(STDDEV)
FORECAST(PATHS,MODEL=STARMODEL,FROM=ESTART,TO=EEND,$
RESULTS=BASESIMS,NOPRINT)
# SHOCKS
COMPUTE SHOCKS(ESTART)=DELTA
FORECAST(PATHS,MODEL=STARMODEL,FROM=ESTART,TO=EEND,$
RESULTS=SIMS,NOPRINT)
# SHOCKS
SET EGIRFPOS ESTART EEND = EGIRFPOS+100.0*(SIMS(2)-BASESIMS(2))
END DO DRAW
SET EGIRFPOS ESTART EEND = EGIRFPOS/NDRAWS
********************************************************************
* EXPANSION : NEGATIVE SHOCK
********************************************************************
SET EGIRFNEG ESTART EEND = 0.0
DO DRAW=1,NDRAWS
SET SHOCKS ESTART EEND = %RAN(STDDEV)
FORECAST(PATHS,MODEL=STARMODEL,FROM=ESTART,TO=EEND,$
RESULTS=BASESIMS,NOPRINT)
# SHOCKS
COMPUTE SHOCKS(ESTART)=-DELTA
FORECAST(PATHS,MODEL=STARMODEL,FROM=ESTART,TO=EEND,$
RESULTS=SIMS,NOPRINT)
# SHOCKS
SET EGIRFNEG ESTART EEND = EGIRFNEG+100.0*(SIMS(2)-BASESIMS(2))
END DO DRAW
SET EGIRFNEG ESTART EEND = EGIRFNEG/NDRAWS
********************************************************************
* RECESSION : POSITIVE SHOCK
********************************************************************
SET RGIRFPOS RSTART REND = 0.0
DO DRAW=1,NDRAWS
SET SHOCKS RSTART REND = %RAN(STDDEV)
FORECAST(PATHS,MODEL=STARMODEL,FROM=RSTART,TO=REND,$
RESULTS=BASESIMS,NOPRINT)
# SHOCKS
COMPUTE SHOCKS(RSTART)=DELTA
FORECAST(PATHS,MODEL=STARMODEL,FROM=RSTART,TO=REND,$
RESULTS=SIMS,NOPRINT)
# SHOCKS
SET RGIRFPOS RSTART REND = RGIRFPOS+100.0*(SIMS(2)-BASESIMS(2))
END DO DRAW
SET RGIRFPOS RSTART REND = RGIRFPOS/NDRAWS
********************************************************************
* RECESSION : NEGATIVE SHOCK
********************************************************************
SET RGIRFNEG RSTART REND = 0.0
DO DRAW=1,NDRAWS
SET SHOCKS RSTART REND = %RAN(STDDEV)
FORECAST(PATHS,MODEL=STARMODEL,FROM=RSTART,TO=REND,$
RESULTS=BASESIMS,NOPRINT)
# SHOCKS
COMPUTE SHOCKS(RSTART)=-DELTA
FORECAST(PATHS,MODEL=STARMODEL,FROM=RSTART,TO=REND,$
RESULTS=SIMS,NOPRINT)
# SHOCKS
SET RGIRFNEG RSTART REND = RGIRFNEG+100.0*(SIMS(2)-BASESIMS(2))
END DO DRAW
SET RGIRFNEG RSTART REND = RGIRFNEG/NDRAWS
********************************************************************
* PUT THE RECESSION RESPONSES ON THE EXPANSION DATE RANGE SO THAT
* ALL FOUR CURVES SHARE A COMMON RESPONSE HORIZON
********************************************************************
SET RGIRFPOS_G ESTART EEND = RGIRFPOS(RSTART+T-ESTART)
SET RGIRFNEG_G ESTART EEND = RGIRFNEG(RSTART+T-ESTART)
PRINT ESTART EEND EGIRFPOS EGIRFNEG RGIRFPOS_G RGIRFNEG_G
LABELS EGIRFPOS ; # "Expansion +2sd"
LABELS EGIRFNEG ; # "Expansion -2sd"
LABELS RGIRFPOS_G ; # "Recession +2sd"
LABELS RGIRFNEG_G ; # "Recession -2sd"
********************************************************************
* GRAPH 1 : POSITIVE SHOCK, EXPANSION VS RECESSION
********************************************************************
GRAPH(KEY=UPRIGHT,NODATES,NUMBER=0,$
HLABEL="Quarters after the shock",$
VLABEL="Response of log manufacturing GDP (percent)",$
HEADER="Positive Shock: Expansion versus Recession",$
FOOTER="LSTAR generalized impulse responses to a +2s shock") 2
# EGIRFPOS ESTART EEND
# RGIRFPOS_G ESTART EEND
********************************************************************
* GRAPH 2 : NEGATIVE SHOCK, EXPANSION VS RECESSION
********************************************************************
GRAPH(KEY=UPRIGHT,NODATES,NUMBER=0,$
HLABEL="Quarters after the shock",$
VLABEL="Response of log manufacturing GDP (percent)",$
HEADER="Negative Shock: Expansion versus Recession",$
FOOTER="LSTAR generalized impulse responses to a -2s shock") 2
# EGIRFNEG ESTART EEND
# RGIRFNEG_G ESTART EEND
********************************************************************
* GRAPH 3 : ALL FOUR TOGETHER (matches the sample figure)
********************************************************************
GRAPH(KEY=UPRIGHT,NODATES,NUMBER=0,$
HLABEL="Quarters after the shock",$
VLABEL="Response of log manufacturing GDP (percent)",$
HEADER="GDP Transition: Asymmetric Responses") 4
# EGIRFPOS ESTART EEND
# EGIRFNEG ESTART EEND
# RGIRFPOS_G ESTART EEND
# RGIRFNEG_G ESTART EEND
********************************************************************