使用ARIMA模型填补缺失值

3

我在尝试使用R中的ARIMA模型对时间序列中的缺失值进行插补,但是使用了以下代码并没有成功。

x <- AirPassengers
x[90:100] <- NA
fit <- auto.arima(x)
fitted(fit)[90:100]  ## this is giving me NAs
plot(x)
lines(fitted(fit), col="red")

拟合的模型并未对缺失值进行插补。有什么建议吗?

2个回答

6

fitted可以提供样本内的一步预测。你想要的“正确”方法是通过卡尔曼平滑器实现的。对于大多数情况来说,使用前向和后向预测的平均值可以得到足够粗略的近似值来填补缺失的部分。像这样:

x <- AirPassengers
x[90:100] <- NA
fit <- auto.arima(x)
fit1 <- forecast(Arima(AirPassengers[1:89],model=fit),h=10)
fit2 <- forecast(Arima(rev(AirPassengers[101:144]), model=fit), h=10)

plot(x)
lines(ts(0.5*c(fit1$mean+rev(fit2$mean)), 
  start=time(AirPassengers)[90],freq=12), col="red")

enter image description here


如果前5%的数据缺失,这还有效吗?我无法解决这个错误:stats::arima(x = x, order = order, seasonal = seasonal, include.mean = include.mean,)中的错误: 非缺失观测值太少。 - SamV

3
如Rob所说,使用卡尔曼平滑器通常是更好的解决方案。
例如可以通过imputeTS包实现(免责声明:我维护这个包)。 (https://cran.r-project.org/web/packages/imputeTS/index.html
library("imputeTS")
x <- AirPassengers
x[90:100] <- NA
x <- na.kalman(x, model = "auto.arima")

在内部,imputeTS包对由auto.arima获得的ARIMA模型的状态空间表示执行Kalman平滑。

即使理论背景不易理解,它通常会产生非常好的结果 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接