将滚动窗口应用于HP过滤器

时间:2016-06-03 09:20:11

标签: r

假设我有一个如下所示的数据框:

Date <- seq(as.Date("1990-03-01"), by = 'quarters', length.out=100)
Date<- as.yearqtr(Date, format="%Y-%m-%d")
GDP <- runif(100, 500, 2000)
df <- data.frame(Date,GDP)

通常为了应用hpfilter函数,我会这样做:

GDP <- xts(GDP[,-1], order.by=GDP[,1]) #Convert to xts
hpf <- hpfilter(GDP,freq=1600) #Apply the HP filter
GDP <- xts(cbind(hpf$x, hpf$trend, hpf$cycle), index(GDP))
colnames(GDP) <- c("GDP", "Trend", "Cycle")

但是,我现在想要将20个季度的滚动窗口应用到我的HP过滤器(即使用20个数据点来过滤掉趋势),而不是使用整个系列。我试过这样做:

rollapply(data=GDP, 20, hpfilter(GDP, freq=1600))

但由于hpfilter无法被检测为函数而出现错误。我确定某些地方出了问题,我对R很新,所以我很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

@ Binggg,您的代码存在问题,我不知道您是如何在下面运行的:

GDP <- xts(GDP[,-1], order.by=GDP[,1]) #Convert to xts

因为,如果你在

以下运行
GDP <- runif(100, 500, 2000)

它生成一个向量。在上面的代码中,GDP被视为一个data.frame,我想你可能会指的是&#34; df&#34;而不是&#34; GDP&#34;如下:

GDP <- xts(df[,-1], order.by=df[,1]) #Convert to xts

现在,回答你的问题&#34;将20个季度的滚动窗口应用到我的HP过滤器&#34;,如果你想使用HP过滤器作为&#34; rollapply&#34;的功能,那么,你需要将它指定为函数,但是,它遇到了xts格式的问题,并且可以正常使用data.frame。

library(mFilter)    
GDP_roll <- as.data.frame(rollapply(df[,2], 20, function(x) {hpfilter(df[,2], freq=1600)}))

忘了早些时候提到库(mFilter)中存在hpfilter函数,你需要调用它。

答案 1 :(得分:0)

好吧,我设法通过使用循环来解决这个问题。

GDP<- xts(GDP[,-1], order.by=GDP[,1])
HPF <- merge(GDP, Trend=NA, Cycle=NA)
for (i in 20:length(GDP)){ 
hpf <- hpfilter(GDP[(i-19):i], freq=400000) 
temp <- xts(cbind(hpf$x, hpf$trend, hpf$cycle), index(GDP[(i-19):i])) 
HPF[i,] <- temp[20,]
}