我有一个时间序列,希望能够智能地插值缺失的值。特定时间的值受多日趋势以及每日周期位置的影响。
以下是一个示例,其中第十个观测值在myzoo
中缺失。
start <- as.POSIXct("2010-01-01")
freq <- as.difftime(6, units = "hours")
dayvals <- (1:4)*10
timevals <- c(3, 1, 2, 4)
index <- seq(from = start, by = freq, length.out = 16)
obs <- (rep(dayvals, each = 4) + rep(timevals, times = 4))
myzoo <- zoo(obs, index)
myzoo[10] <- NA
如果我要实现这个,我会使用一些加权平均数来计算附近几天的关闭时间,或者将某天的值添加到适合更大趋势的函数线中,但我希望已经存在一些适用于这种情况的软件包或函数?
编辑:稍微修改了代码以澄清我的问题。有一些na.*
方法可以从最近的邻居进行插值,但在这种情况下,它们没有认识到缺失值是当天最低值的时间。也许解决方案是将数据重塑为宽格式,然后进行插值,但我不想完全忽略同一天的连续值。值得注意的是,diff(myzoo, lag = 4)
返回一个10的向量。解决方案可能在reshape
、na.spline
和diff.inv
的某种组合中,但我就是想不出来。
以下是三种行不通的方法:
编辑2. 使用以下代码生成图像。
myzoo <- zoo(obs, index)
myzoo[10] <- NA # knock out the missing point
plot(myzoo, type="o", pch=16) # plot solid line
points(na.approx(myzoo)[10], col = "red")
points(na.locf(myzoo)[10], col = "blue")
points(na.spline(myzoo)[10], col = "green")
myzoo[10] <- 31 # replace the missing point
lines(myzoo, type = "o", lty=3, pch=16) # dashed line over the gap
legend(x = "topleft",
legend = c("na.spline", "na.locf", "na.approx"),
col=c("green","blue","red"), pch = 1)
na.approx
、na.spline
、na.locf
和其他na.*
函数可以填充NA
值。 - G. Grothendieck