yth_filter
returns an xts
object containing
user-defined combinations of the original, trend, cycle, and random walk series.
yth_filter(x, h = 8, p = 4, output = c("x", "trend", "cycle", "random"), ...)
A univariate xts
object of any
zoo
index class, such as Date
,
yearmon
, or yearqtr
.
For converting objects of type timeSeries
, ts
, irts
,
fts
, matrix
, data.frame
, or zoo
,
please see as.xts
.
An integer
, defining the lookahead period.
Defaults to h = 8
. The default assumes economic data of quarterly
periodicity with a lookahead period of 2 years.
An integer
, indicating the number of lags. Defaults to
p = 4
, assuming quarterly data. For monthly data, one may choose
p = 12
or aggregate to quarterly. Use this parameter to match
the seasonality of your data.
A character
vector. Defaults to
output = c("x","trend","cycle","random")
, which returns the original
series ("x"
), the fitted values from yth_glm
("trend"
),
the residuals from yth_glm
("cycle"
), and a random walk
defined by differencing \(y_{t+h}\) and \(y_t\) ("random"
).
Any subset of these components can be returned.
Other arguments passed to glm
.
An xts
object defined by the output
parameter.
For time series of quarterly periodicity, Hamilton suggests parameters of h = 8 and p = 4, or an \(AR(4)\) process, additionally lagged by \(8\) lookahead periods. Econometricians may explore variations of h. However, p is designed to correspond with the seasonality of a given periodicity and should be matched accordingly.
James D. Hamilton. Why You Should Never Use the Hodrick-Prescott Filter. NBER Working Paper No. 23429, Issued in May 2017.
data(GDPC1)
gdp_filter <- yth_filter(100*log(GDPC1), h = 8, p = 4)
head(gdp_filter, 15)
#> GDPC1 GDPC1.trend GDPC1.cycle GDPC1.random
#> 1947-01-01 768.8309 NA NA NA
#> 1947-04-01 768.5653 NA NA NA
#> 1947-07-01 768.3603 NA NA NA
#> 1947-10-01 769.9141 NA NA NA
#> 1948-01-01 771.4089 NA NA NA
#> 1948-04-01 773.0478 NA NA NA
#> 1948-07-01 773.6207 NA NA NA
#> 1948-10-01 773.7339 NA NA NA
#> 1949-01-01 772.3477 NA NA 3.516789
#> 1949-04-01 772.0075 NA NA 3.442130
#> 1949-07-01 773.0361 NA NA 4.675851
#> 1949-10-01 772.1948 779.1321 -6.9373485 2.280665
#> 1950-01-01 776.0511 780.3038 -4.2526309 4.642219
#> 1950-04-01 779.0565 781.5229 -2.4664958 6.008660
#> 1950-07-01 782.8487 782.1703 0.6783457 9.228028
#---------------------------------------------------------------------------#
data(PAYEMS)
log_Employment <- 100*log(xts::to.quarterly(PAYEMS["1947/2016-6"], OHLC = FALSE))
employ_trend <- yth_filter(log_Employment, h = 8, p = 4, output = c("x", "trend"))
plot(employ_trend, grid.col = "white", legend.loc = "topleft",
main = "Log of Employment and trend")
#----------------------------------------------------------------------------#
quarterly_data <- 100*log(merge(GDPC1, PCECC96, GPDIC1, EXPGSC1, IMPGSC1, GCEC1, GDPDEF))
cycle <- do.call(merge, lapply(quarterly_data, yth_filter, output = "cycle"))
random <- do.call(merge, lapply(quarterly_data, yth_filter, output = "random"))
cycle.sd <- t(data.frame(lapply(cycle, sd, na.rm = TRUE)))
GDP.cor <- t(data.frame(lapply(cycle, cor, cycle[,1], use = "complete.obs")))
random.sd <- t(data.frame(lapply(random, sd, na.rm = TRUE)))
random.cor <- t(data.frame(lapply(random, cor, random[,1], use = "complete.obs")))
my_table_2 <- round(data.frame(cbind(cycle.sd, GDP.cor, random.sd, random.cor)), 2)
names(my_table_2) <- names(Hamilton_table_2)[1:4]
my_table_2
#> cycle.sd gdp.cor random.sd gdp.rand.cor
#> GDPC1.cycle 3.27 1.00 3.55 1.00
#> PCECC96.cycle 2.90 0.80 3.08 0.82
#> GPDIC1.cycle 12.47 0.82 12.98 0.78
#> EXPGSC1.cycle 10.81 0.36 11.35 0.36
#> IMPGSC1.cycle 9.55 0.76 9.88 0.76
#> GCEC1.cycle 6.89 0.30 8.13 0.35
#> GDPDEF.cycle 3.05 0.07 4.04 -0.09