正确归因于 zooreg 对象?

Correct imputation for a zooreg object?

我的objective 是在 zooreg 时间序列对象中估算 NA。时间序列的模式是循环的。我的代码是:

#load libraries required
library("zoo")

# create sequence every 15 minutes from 1st Dec to 20th Dec, 2018
timeStamp <- seq.POSIXt(from=as.POSIXct('2018-01-01 00:00:00', tz="UTC"), to=as.POSIXct('2018-01-20 23:45:00', tz="UTC"), by = "15 min")
# data which increases from 12am to 12pm, then decreases till 12 am of next day, for 20 days
readings <- rep(c(seq(1,48,1), seq(48,1,-1)), 20)
dF <- data.frame(timeStamp=timeStamp, readings=readings)

# create a regular zooreg object, frequency is 1 day( 4 readings * 24 hours)
readingsZooReg <- zooreg(dF$readings, order.by  = dF$timeStamp, frequency = 4*24)
plot(readingsZooReg)

# force some data to be NAs
window(readingsZooReg, start = as.POSIXct("2018-01-14 00:00:00", tz="UTC"), end = as.POSIXct("2018-01-16 23:45:00", tz="UTC")) <- NA
plot(readingsZooReg)


# plot imputed values
plot(na.approx(readingsZooReg))

情节是: Full time series, NAs added, Imputed time series

我特意在这里使用动物园,因为我处理的时间序列是不规则的(例如太阳能、油井等)

1) 我对 "zooreg" 的用法正确吗?或者 "zoo" 对象就足够了吗?
2)我的频率变量对吗?
3) 为什么 na.approx 不起作用?我也试过 na.StructTs,R 脚本挂起。
4)是否有使用任何其他包的解决方案? xts、ts 等?

您当前的示例时间序列是常规时间序列。 (不规则 时间序列的时间步长与观察之间的时间距离不同)

例如:

  • 10:00:10, 10:00:20, 10:00:30, 10:00:40, 10:00:50(等间距)
  • 10:00:10, 10:00:17, 10:00:33, 10:00:37, 10:00:50(不规则间距)

如果你真的需要处理不规则间隔的时间序列,zoo 是你的首选包。否则你也可以使用其他时间序列 类 作为 xtsts.

关于频率:

您通常根据期望模式重复的值来设置时间序列的频率。 (在您的示例中,这可能是 96)。在现实生活中,这通常是 1 天、1 周、1 个月……但也可能与这些不同,例如 1.5 天。 (例如,如果您有每日返回模式和 1 分钟观察,您可以将频率设置为 1440)。

na.approx zoo 完美运行。它完全按照预期的方式进行。间隙之前的点 0 和间隙末端的 0 之间的插值将在 0 处给出一条直线。当然,这可能不是您预期的结果,因为它没有考虑季节性。这就是为什么 G. Grothendieck 建议您 na.StructTS 作为一种选择方法。 (这种方法通常在考虑季节性方面更好)

如果您不受限于动物园,在这种特定情况下,最好的选择是使用 imputeTS 包中的 na_seadec(一个专门用于时间序列插补的包).

我已经为您添加了一个示例,其中还包含来自 imputeTS

的漂亮图
library(imputeTS)
yourTS <- ts(coredata(readingsZooReg), frequency = 96)
ggplot_na_distribution(yourTS)
imputedTS <- na_seadec(yourTS)
ggplot_na_imputations(yourTS, imputedTS)

通常 imputeTS 也可以完美地将动物园时间序列作为输入。我只是再次将它更改为 ts,因为你的动物园对象看起来很奇怪......这也是为什么 na.StructTS 来自动物园本身的原因。也许有更好知识的人可以在这里提供帮助。

注意,如果你真的应该有不规则的时间序列,请不要使用 zoo 以外的其他包/插补函数。因为他们都假设数据是规则间隔的,并且会相应地给出结果。