Error in imputing daily time series with zoo package

时间:2019-04-08 12:51:18

标签: r time-series zoo

The na.StructTS()-function, according to it's documentation, is for filling NAvalues in time series using seasonal Kalman Filter (not familiar with the mathematics behind this one).

But I have a problem:

When I want to replace NAs in a zooreg object, it only works if the specified frequency (observation per time unit) is greater than 1.

Example:

#with frequency = 1 appearantly being the default
t <- zooreg(c(34, 12, 45, 56, 34, NA, 57, 59), 
            start = as.Date("2019-01-01"))

> t
2019-01-01 2019-01-02 2019-01-03 2019-01-04 2019-01-05 2019-01-06 2019-01-07 2019-01-08 
        34         12         45         56         34         NA         57         59 

na.StructTS(t, na.rm = TRUE)

Returns the error:

Error in rowSums(tsSmooth(StructTS(y))[, -2]) : 'x' must be an array of at least two dimensions

Changing:

t <- zooreg(c(34, 12, 45, 56, 34, NA, 57, 59), 
            start = as.Date("2019-01-01"), frequency = 2)

> na.StructTS(t, na.rm = TRUE)
2019-01-01 2019-01-01 2019-01-02 2019-01-02 2019-01-03 2019-01-03 2019-01-04 2019-01-04 
  34.00000   12.00000   45.00000   56.00000   34.00000   49.84633   57.00000   59.00000 

to anything > 1 works, but the imputations are different each time, and take increasingly long.

Why is that behaviour? How can I impute a daily time series with na.StructTS()?

1 个答案:

答案 0 :(得分:1)

您会想到什么样的系列会很有趣。 对于很短的系列,na.Struct()可能不是最佳选择。

还有许多其他插补方法(有些更易于理解)。 例如。 zoo 还提供na.approxna.splinena.StructTSna.locf

还有 imputeTS 软件包,该软件包仅与时间序列插补有关。 (并且还应该与zoo时间序列兼容,因此您可以在动物园序列中使用它)

在imputeTS软件包中,您有:na.interpolation()na.locf()na.ma()na.kalman()na.seadec()na.seasplit(),甚至还有{{3 }}。

如果您想使用卡尔曼滤波器,可以看看na.kalman()函数

  

na.kalman(x,model =“ StructTS”,smooth = TRUE,nit = -1,...)

它有几个附加选项,因此您可以使用ARIMA模型代替StructTS的模型,或者可以选择是否要使用KalmanRun或KalmanSmoothing。

na.kalman(x, model = "StructTS", smooth = TRUE) 

最类似于     na.StructTS。但是仍然是不同的实现-因此它们不会给出完全相同的结果。因此,如果您坚持在状态空间模型上进行KalmanSmoothing处理,则可以从imputeTS使用此功能(频率不为1时不会给出错误)