У меня есть временной ряд, для которого я хочу разумно интерполировать отсутствующие значения. Значение в определенное время зависит от многодневной тенденции, а также от ее позиции в ежедневном цикле.
Вот пример, в котором десятое наблюдение отсутствует в 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
Если бы мне пришлось реализовать это, я бы использовал какое-то средневзвешенное значение близких времен в близлежащие дни или добавлял значение для дня к функциональной строке, привязанной к большей тенденции, но я надеюсь, что там уже есть некоторые пакет или функции, которые применяются к этой ситуации?
EDIT: немного изменил код, чтобы прояснить мою проблему. Существуют методы na.*
, которые интерполируют из ближайших соседей, но в этом случае они не признают, что недостающее значение находится в момент, когда это самое низкое значение дня. Возможно, решение состоит в том, чтобы преобразовать данные в широкий формат и затем интерполировать, но я не хотел бы полностью игнорировать смежные значения с того же дня. Стоит отметить, что diff(myzoo, lag = 4)
возвращает вектор из 10. Решение может быть связано с некоторой комбинацией reshape
, na.spline
и diff.inv
, но я просто не могу понять это.
Вот три подхода, которые не работают:
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)