gpt4 book ai didi

r - 在具有季节性周期的时间序列中插入缺失值

转载 作者:行者123 更新时间:2023-12-03 21:41:08 25 4
gpt4 key购买 nike

我有一个时间序列,我想智能地插入缺失值。特定时间的值受多日趋势及其在每日周期中的位置的影响。

这是一个示例,其中 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.*从最近的邻居进行插值的方法,但在这种情况下,它们无法识别缺失值是当天的最低值。也许解决方案是将数据 reshape 为宽格式,然后进行插值,但我不想完全忽略同一天的连续值。值得注意的是 diff(myzoo, lag = 4)返回一个 10 的向量。解决方案可能在于 reshape 的某种组合。 , na.spline , 和 diff.inv ,但我就是想不通。

以下是三种行不通的方法:
enter image description here

编辑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)

最佳答案

试试这个:

x <- ts(myzoo,f=4)
fit <- ts(rowSums(tsSmooth(StructTS(x))[,-2]))
tsp(fit) <- tsp(x)
plot(x)
lines(fit,col=2)

这个想法是使用时间序列的基本结构模型,使用卡尔曼滤波器处理缺失值。然后使用卡尔曼平滑估计时间序列中的每个点,包括任何省略的点。

为了使用 StructTS,我必须将您的 zoo 对象转换为频率为 4 的 ts 对象。您可能希望再次将拟合值更改回 zoo。

关于r - 在具有季节性周期的时间序列中插入缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com