У меня есть временной ряд, для которого я хочу разумно интерполировать пропущенные значения. На значение в определенное время влияет многодневный тренд, а также его положение в дневном цикле.
Вот пример, в котором десятое наблюдение отсутствует в 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
, но я просто не могу понять это.
Вот три подхода, которые не работают:
![enter image description here](https://i.stack.imgur.com/xm05G.jpg)
EDIT2. Изображение получено с использованием следующего кода.
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)