我可以进行滚动回归
library(zoo)
seat <- as.zoo(log(UKDriverDeaths))
time(seat) <- as.yearmon(time(seat))
seat <- merge(y = seat, y1 = lag(seat, k = -1),
y12 = lag(seat, k = -12), all = FALSE)
tail(seat)
fm <- rollapply(seat, width = 50,
FUN = function(z) coef(lm(y ~ y1 + y12, data = as.data.frame(z))),
by.column = FALSE, align = "right")
fm
观察拦截情节,这有很大的不同。
plot(fm[,1]
我希望得到最好的平滑系数,这些系数不会随着时间的推移而发生变化,但会平滑变化。有没有办法做到这一点(在任何时候都只考虑过去的数据)。
包走行程序(具有时变系数的贝叶斯回归)执行此操作,但它使用所有数据计算系数,而不考虑任何点上的过去数据。
感谢您的帮助。
答案 0 :(得分:2)
首先请注意,我们可以使用dyn包缩短代码:
library(dyn)
seat <- as.zoo(log(UKDriverDeaths))
coef_fun <- function(z) coef(dyn$lm(z ~ lag(z, c(-1, -12)), z))
zcoef <- rollapplyr(seat, 50, coef_fun, coredata = FALSE)
如果我们不想要依赖未来,我们可以使用rollmean
(或rollmeanr
来简化系数:
zsmooth <- rollmeanr(zcoef, 3)
plot(zsmooth)
如果不够平滑,请使用更大的宽度。