假设我有一个如下所示的数据框:
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很新,所以我很感激任何帮助。
答案 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,]
}