The na.StructTS()
-function, according to it's documentation, is for filling NA
values 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 NA
s 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()
?
答案 0 :(得分:1)
您会想到什么样的系列会很有趣。
对于很短的系列,na.Struct()
可能不是最佳选择。
还有许多其他插补方法(有些更易于理解)。
例如。 zoo
还提供na.approx
,na.spline
,na.StructTS
,na.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时不会给出错误)