R语言从经济时间序列中用HP滤波器,小波滤波和经验模式分解等提取周期性成分分析
原文链接:http://tecdat.cn/?p=9350
经济时间序列的分析通常需要提取其周期性成分。这篇文章介绍了一些方法,可用于将时间序列分解为它们的不同部分。它基于《宏观经济学手册》中Stock和Watson(1999)关于商业周期的章节,但也介绍了一些较新的方法,例如汉密尔顿(2018)替代HP滤波器,小波滤波和经验模式分解。
数据
我使用从1970Q1到2016Q4的美国对数实际GDP的季度数据来说明不同的方法。时间序列是通过 Quandl 及其相应的R包获得的。
# Load packages for data download and transformationlibrary(dplyr)library(Quandl)library(tidyr)# Download datadata <- Quandl("FRED/GDPC1", order = "asc", start_date = "1970-01-01", end_date = "2016-10-01") %>% rename(date = Date, gdp = Value) %>% mutate(lgdp = log(gdp)) # Take logs
library(ggplot2)ggplot(data, aes(x = date, y = lgdp)) + geom_line() + theme_classic() + labs(title = "Log real US GDP", x = "Quarter", y = "", caption = "Source: U.S. Bureau of Economic Analysis (GDPC1).nRetrieved via Quandl.com.")
数据有明显的增长趋势,到现在似乎逐渐变小。此外,似乎或多或少有规律地围绕这一趋势波动。与趋势之间存在相对较长的持久偏差,可以将其视为周期性波动。
与线性趋势的偏差
从系列中提取趋势的第一种方法是在常数和趋势项上回归目标变量并获得拟合值。在下图中绘制。
# Add a trenddata <- data %>% mutate(trend = 1:n())# Estimate the model with a constant and a trendtime_detrend <- fitted(lm(lgdp ~ trend, data = data))names(time_detrend) <- NULL# Add series to main data framedata <- data %>% mutate(lin_trend = time_detrend)# Create data frame for the plottemp <- data %>% select(date, lgdp, lin_trend) %>% gather(key = "Variable", value = "value", -date)# Plotggplot(temp, aes(x = date, y = value, colour = Variable)) + geom_line() + theme_classic() + labs(title = "Residuals of a linear trend estimation", x = "Quarter", y = "")
此方法相对有争议,因为它假定存在恒定的线性时间趋势。正如我们在上面看到的,鉴于趋势的增长率随着时间的推移持续下降,这不太可能。但是,仍然可以采用时间趋势的其他函数形式(例如二次项)来说明趋势的特殊性。该方法的另一个缺点是,它仅排除趋势,而不排除噪声,即序列中很小的波动。
Hodrick-Prescott过滤器
Hodrick和Prescott(1981)开发了一个过滤器,将时间序列分为趋势和周期性分量。与线性趋势相反,所谓的 HP过滤器可 估算趋势,该趋势会随时间变化。研究人员手动确定允许这种趋势改变的程度,即平滑参数λλ。
文献表明季度数据的值为1600。但是,也可以选择更高的值。下图绘制了由HP过滤器获得的实际GDP周期性成分的值,并将其与线性趋势下的序列的值进行比较。
尽管HP过滤器在经济学中得到了广泛的应用,但它们的某些功能也受到了广泛的批评。
基于回归的HP过滤器
汉密尔顿(2018)还提出了另一种HP过滤器的方法。它可以归结为一个简单的回归模型,其中 时间序列的第 h 个前导根据时间序列的最新p值进行回归。
Baxter King过滤器
Baxter和King(1994,1999)提出了一种过滤器,其产生的结果与HP过滤器非常相似。另外,它从时间序列中去除了噪声,因此可以对周期分量进行平滑估计。该方法的一个相对严重的缺点是,平滑因子导致序列开始和结束时观测值的损失。当样本量较小且当前经济状况令人关注时,这可能是一个问题。
小波滤波器
Yogo(2008)提出使用小波滤波器从时间序列数据中提取业务周期。该方法的优点是该函数不仅允许提取序列的趋势,周期和噪声,而且还可以更明确地了解周期发生的时间段。
R中的方法实现也很简洁,但是在使用之前需要进行一些其他的数据转换。
# Load packagelibrary(waveslim)# Calculate first difference of log GDPdata <- data %>% mutate(dlgdp = lgdp - lag(lgdp, 1))# Get datay <- na.omit(data$dlgdp)# Run the filterwave_gdp <- mra(y, J = 5)# Transform mra-output to data framewave_gdp <- as_tibble(wave_gdp)# Create data frame for plottingtemp <- wave_gdp %>% gather(key = "imf", value = "value") %>% group_by(imf) %>% mutate(date = data$date[-1])# Plot mra outputggplot(temp, aes(x = date, y = value)) + geom_line() + facet_wrap( ~ imf, scales = "free") + labs(title = "Wavelets", x = "Quarter", y = "")
data <- data %>% mutate(wave = c(NA, cumsum(wave_gdp$D3 + wave_gdp$D4 + wave_gdp$D5)))temp <- data %>% select(date, bk, wave) %>% gather(key = "Variable", value = "value", -date) %>% filter(!is.na(value)) %>% mutate(Variable = factor(Variable, levels = c("bk", "wave"), labels = c("BK filter", "Wavelets")))ggplot(temp, aes(x = date, y = value, colour = Variable)) + geom_hline(yintercept = 0, colour = "grey") + geom_line() + theme_classic() + labs(title = "Wavelets", x = "Quarter", y = "")
经验模式分解(EMD)
Kozic和Sever(2014)提出了经验模式分解作为商业周期提取的另一种方法,正如Huang等人(2014年)提出的那样。(1998)。 emd
函数可以在EMD 包中找到, 并且需要一个不同的时间序列,一个边界条件和一个指定的规则,在该点上迭代算法可以停止。滤波方法的结果与HP,BK和小波滤波相对不同。
Chan(2017)
初始值
# X_gammax_gamma <- cbind(2:(tt + 1), -1:-tt)# H_2h2 <- diag(1, tt)diag(h2[-1, -tt]) <- -2diag(h2[-(1:2), -((tt - 1):tt)]) <- 1h2h2 <- crossprod(h2)# H_phih_phi <- diag(1, tt)phi <- matrix(c(1.34, -.7))for (i in 1:p) { diag(h_phi[-(1:i), -((tt - i):tt)]) <- -phi[i,]}# Inverse of sigma taus_tau_i <- 1 / .001# Inverse of sigma cs_c_i <- 1 / .5# gammagamma <- t(rep(y[1], 2)) # Should be close to first value of the series
Gibbs 采样
- 卡特兰数简介原理性质应用参考:
- UVA Machined Surfaces
- NBUT 1117 Kotiya's Incantation
- React第三方组件1(路由管理之Router的使用④按需加载-上)
- React第三方组件1(路由管理之Router的使用③传参)
- Kindergarten Counting Game
- React第三方组件1(路由管理之Router的使用②多层级跳转及重定向)
- 括号配对问题描述输入输出样例输入样例输出解析代码实现运行结果参考链接
- React第三方组件1(路由管理之Router的使用①简单使用)
- POj 2253 Frogger
- React项目配置7(ES7的Async/Await的使用)
- HDU 1863 畅通工程
- 最小生成树判断唯一
- React项目配置5(引入MockJs,实现假接口开发)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法