lp_lin_panel: Compute linear impulse responses with local projections for...

Description Usage Arguments Value Author(s) References Examples

View source: R/lp_lin_panel.R

Description

This function estimates impulse responses with local projections for panel data, either with an identified shock or by an instrument variable approach.

Usage

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
lp_lin_panel(
  data_set = NULL,
  data_sample = "Full",
  endog_data = NULL,
  cumul_mult = TRUE,
  shock = NULL,
  diff_shock = TRUE,
  iv_reg = FALSE,
  instrum = NULL,
  panel_model = "within",
  panel_effect = "individual",
  robust_cov = NULL,
  robust_method = NULL,
  robust_type = NULL,
  robust_cluster = NULL,
  robust_maxlag = NULL,
  use_gmm = FALSE,
  gmm_model = "onestep",
  gmm_effect = "twoways",
  gmm_transformation = "d",
  c_exog_data = NULL,
  l_exog_data = NULL,
  lags_exog_data = NaN,
  c_fd_exog_data = NULL,
  l_fd_exog_data = NULL,
  lags_fd_exog_data = NaN,
  confint = NULL,
  hor = NULL
)

Arguments

data_set

A data.frame, containing the panel data set. The first column has to be the variable denoting the cross section. The second column has to be the variable denoting the time section.

data_sample

Character or numeric. To use the full sample set value to "Full" (default). To estimate a subset, you have to provide a sequence of dates. This sequence has to be in the same format as the second column (time-section).

endog_data

Character. The column name of the endogenous variable. You can only provide one endogenous variable at a time.

cumul_mult

Boolean. Estimate cumulative multipliers? TRUE (default) or FALSE. If TRUE, cumulative responses are estimated via:

y_(t+h) - y_(t-1),

where h = 0,..., H-1.

shock

Character. The column name of the variable to shock with.

diff_shock

Boolean. Take first differences of the shock variable? TRUE (default) or FALSE.

iv_reg

Boolean. Use instrument variable approach? TRUE or FALSE.

instrum

NULL or Character. The name(s) of the instrument variable(s) if iv_reg = TRUE.

panel_model

Character. Type of panel model. The default is "within" (fixed effects). Other options are "random", "ht", "between", "pooling" or "fd". See vignette of the plm package for details.

panel_effect

Character. The effects introduced in the model. Options are "individual" (default), "time", "twoways", or "nested". See the vignette of the plm-package for details.

robust_cov

NULL or Character. The character specifies the method how to estimate robust standard errors: Options are "vcovBK", "vcovDC", "vcovG", "vcovHC", "vcovNW", "vcovSCC". For these options see vignette of plm package. Another option is "Vcxt". For details see Miller (2017) If "use_gmm = TRUE", this option has to be NULL.

robust_method

NULL (default) or Character. The character is an option when robust_cov = "vcovHC". See vignette of the plm package for details.

robust_type

NULL (default) or Character. The character is an option when robust_cov = "vcovBK", "vcovDC", "vcovHC", "vcovNW" or "vcovSCC". See vignette of the plm package for details.

robust_cluster

NULL (default) or Character. The character is an option when robust_cov = "vcovBK", "vcovG" or "vcovHC". See vignette of the plm package for details.

robust_maxlag

NULL (default) or Character. The character is an option when robust_cov = "vcovNW" or "vcovSCC". See vignette of the plm package for details.

use_gmm

Boolean. Use GMM for estimation? TRUE or FALSE (default). See vignette of plm package for details. If TRUE, the option "robust_cov" has to be set to NULL.

gmm_model

Character. Either "onestep" (default) or "twosteps". See vignette of the plm package for details.

gmm_effect

Character. The effects introduced in the model: "twoways" (default) or "individual". See vignette of the plm-package for details.

gmm_transformation

Character. Either "d" (default) for the "difference GMM" model or "ld" for the "system GMM". See vignette of the plm package for details.

c_exog_data

NULL or Character. Name(s) of the exogenous variable(s) with contemporaneous impact.

l_exog_data

NULL or Character. Name(s) of the exogenous variable(s) with lagged impact.

lags_exog_data

Integer. Lag length for the exogenous variable(s) with lagged impact.

c_fd_exog_data

NULL or Character. Name(s) of the exogenous variable(s) with contemporaneous impact of first differences.

l_fd_exog_data

NULL or Character. Name(s) of exogenous variable(s) with lagged impact of first differences.

lags_fd_exog_data

NaN or Integer. Number of lags for variable(s) with impact of first differences.

confint

Double. Width of confidence bands. 68% = 1; 90% = 1.65; 95% = 1.96.

hor

Integer. Number of horizons for impulse responses.

Value

A list containing:

irf_lin_mean

A matrix, containing the impulse responses. The columns are the horizons.

irf_lin_low

A matrix, containing all lower confidence bands. The columns are the horizons.

irf_lin_up

A matrix, containing all upper confidence bands. The columns are the horizons.

reg_summaries

Regression output for each horizon.

xy_data_sets

Data sets with endogenous and exogenous variables for each horizon.

specs

A list with data properties for e.g. the plot function.

Author(s)

Philipp Adämmer

References

Croissant, Y., Millo, G. (2008). "Panel Data Econometrics in R: The plm Package." Journal of Statistical Software, 27(2), 1-43. doi: 10.18637/jss.v027.i02.

Jordà, Ò. (2005). "Estimation and Inference of Impulse Responses by Local Projections." American Economic Review, 95 (1): 161-182.

Jordà, Ò., Schualrick, M., Taylor, A.M. (2018). "Large and State-Dependent Effects of Quasi-Random Monetary Experiments", NBER working paper 23074, FRBSF working paper 2017-02.

Millo G (2017). “Robust Standard Error Estimators for Panel Models: A Unifying Approach.” Journal of Statistical Software, 82(3), 1-27. doi: 10.18637/jss.v082.i03.

Examples

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#--- Info
# This example is based on a STATA code that has been provided on
# Òscar Jordà's website (https://sites.google.com/site/oscarjorda/home/local-projections)
# It estimates impulse reponses of the ratio of (mortgage lending/GDP) to a
# +1% change in the short term interest rate

#--- Get data
# Go to the website of the 'The MacroFinance and MacroHistory Lab'
# Download the Excel-Sheet of the 'Jordà-Schularick-Taylor Macrohistory Database':
# URL: https://www.macrohistory.net/database/
# Then uncomment and run the code below...


#--- Code

## Load libraries to download and read excel file from the website
#  library(lpirfs)
#  library(readxl)
#  library(dplyr)
#
# Load JST Macrohistory Database
#  jst_data <- read_excel("JSTdatasetR5.xlsx", sheet = "Data")
#
## Choose years <= 2013. Swap the first two columns so that 'country' is the
## first (cross section) and 'year' the second (time section) column
#   jst_data <- jst_data                     %>%
#               dplyr::filter(year <= 2013)  %>%
#               dplyr::select(country, year, everything())
#
## Prepare variables
#  data_set <- jst_data %>%
#                 mutate(stir     = stir)                         %>%
#                 mutate(mortgdp  = 100*(tmort/gdp))              %>%
#                 mutate(hpreal   = hpnom/cpi)                    %>%
#                 group_by(country)                               %>%
#                 mutate(hpreal   = hpreal/hpreal[year==1990][1]) %>%
#                 mutate(lhpreal  = log(hpreal))                  %>%
#
#                 mutate(lhpy     = lhpreal - log(rgdppc))        %>%
#                 mutate(lhpy     = lhpy - lhpy[year == 1990][1]) %>%
#                 mutate(lhpreal  = 100*lhpreal)                  %>%
#                 mutate(lhpy     = 100*lhpy)                     %>%
#                 ungroup()                                       %>%
#
#                 mutate(lrgdp    = 100*log(rgdppc))              %>%
#                 mutate(lcpi     = 100*log(cpi)) 		            %>%
#                 mutate(lriy     = 100*log(iy*rgdppc))           %>%
#                 mutate(cay      = 100*(ca/gdp))                 %>%
#                 mutate(tnmort   = tloans - tmort)               %>%
#                 mutate(nmortgdp = 100*(tnmort/gdp))             %>%
#                 dplyr::select(country, year, mortgdp, stir, ltrate,
#                               lhpy, lrgdp, lcpi, lriy, cay, nmortgdp)
#
#
## Use data from 1870 to 2013 and exclude observations during WWI and WWII
#   data_sample <-   seq(1870, 2013)[!(seq(1870, 2016) %in%
#                                   c(seq(1914, 1918), seq(1939, 1947)))]
#
## Estimate panel model
# results_panel <-  lp_lin_panel(data_set          = data_set,
#                                 data_sample       = data_sample,
#                                 endog_data        = "mortgdp",
#                                 cumul_mult        = TRUE,
#
#                                 shock             = "stir",
#                                 diff_shock        = TRUE,
#                                 panel_model       = "within",
#                                 panel_effect      = "individual",
#                                 robust_cov        = "vcovSCC",
#
#                                 c_exog_data       = "cay",
#                                 l_exog_data       = "cay",
#                                 lags_exog_data    = 2,
#                                 c_fd_exog_data    = colnames(data_set)[c(seq(4,9),11)],
#                                 l_fd_exog_data    = colnames(data_set)[c(seq(3,9),11)],
#                                 lags_fd_exog_data = 2,
#
#                                 confint           = 1.67,
#                                 hor               = 5)
#
## Plot irfs
#   plot(results_panel)
#
#
## Simulate and add instrument to data_set
#   set.seed(123)
#   data_set   <- data_set %>%
#                 group_by(country) %>%
#                 mutate(instrument = 0.8*stir + rnorm(length(stir), 0, sd(na.omit(stir))/10)) %>%
#                 ungroup()
#
#
## Estimate panel model with iv approach
#  results_panel <-  lp_lin_panel(data_set          = data_set,
#                                 data_sample       = data_sample,
#                                 endog_data        = "mortgdp",
#                                 cumul_mult        = TRUE,
#
#                                 shock             = "stir",
#                                 diff_shock        = TRUE,
#                                 iv_reg            = TRUE,
#                                 instrum           = "instrument",
#                                 panel_model       = "within",
#                                 panel_effect      = "individual",
#                                 robust_cov        = "vcovSCC",
#
#                                 c_exog_data       = "cay",
#                                 l_exog_data       = "cay",
#                                 lags_exog_data    = 2,
#                                 c_fd_exog_data    = colnames(data_set)[c(seq(4,9),11)],
#                                 l_fd_exog_data    = colnames(data_set)[c(seq(3,9),11)],
#                                 lags_fd_exog_data = 2,
#
#                                 confint           = 1.67,
#                                 hor               = 5)
#
## Create and plot irfs
#   plot(results_panel)
#
#
##############################################################################
###                           Use GMM                                      ###
##############################################################################
#
#
## Use a much smaller sample to have fewer T than N
# data_sample <-   seq(2000, 2012)
#
## Estimate panel model with gmm
## This example (please uncomment) gives a warning at each iteration.
## The data set is not well suited for GMM as GMM is based on N-asymptotics
## and the data set only contains 27 countries
#
# results_panel <-  lp_lin_panel(data_set          = data_set,
#                              data_sample        = data_sample,
#                              endog_data         = "mortgdp",
#                              cumul_mult         = TRUE,
#
#                              shock              = "stir",
#                              diff_shock         = TRUE,
#
#                              use_gmm            = TRUE,
#                              gmm_model          = "onestep",
#                              gmm_effect         = "twoways",
#                              gmm_transformation = "ld",
#
#                              l_exog_data        = "mortgdp",
#                              lags_exog_data     = 2,
#                              l_fd_exog_data     = colnames(data_set)[c(4, 6)],
#                              lags_fd_exog_data  = 1,
#
#                              confint            = 1.67,
#                              hor                = 5)
#
# Create and plot irfs
# plot(results_panel)
#

lpirfs documentation built on March 24, 2021, 1:10 a.m.