【发布时间】:2011-02-11 00:12:27
【问题描述】:
我有一个时间序列,我想智能地插入缺失值。特定时间的值受多日趋势及其在每日周期中的位置的影响。
这是一个示例,其中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)
【问题讨论】:
-
此代码不运行。 index 和 obs 未定义。 zoo包中的
na.approx、na.spline、na.locf等na.*函数可以填写NA的值。 -
谢谢,粘贴了正确的块。
-
请显示您用于创建情节的代码并解释“不工作”的含义。
-
@G。 Grothendieck:这三种插值方法不起作用,因为它们仅基于时间序列中的邻居,而不考虑每日模式。
标签: r interpolation time-series