Заполнение NA с взвешенной линейной интерполяцией - PullRequest
1 голос
/ 19 июня 2019

У меня есть временной ряд (данные о высоте волны), для которого мне нужно заполнить пробелы путем интерполяции. Я нашел функцию na.approx в пакете zoo, чтобы сделать это, но я не нашел способа заставить ее учесть, когда отсутствующее наблюдение намного ближе к одному наблюдению, чем к другому.

Пример:

library(zoo)
test = data.frame(Wave_Height = c(1.2, NA, 0.5), Data = 
    as.POSIXct(c("2019-01-01 00:00", "2019-01-01 05:00", "2019-01-01 06:00"), 
      format = "%Y-%m-%d %H:%M"))
> test
  Wave_Height                Data
1         1.2 2019-01-01 00:00:00
2          NA 2019-01-01 05:00:00
3         0.5 2019-01-01 06:00:00

test$Wave_Height = na.approx(test$Wave_Height)
> test
  Wave_Height                Data
1        1.20 2019-01-01 00:00:00
2        0.85 2019-01-01 05:00:00
3        0.50 2019-01-01 06:00:00

Я чувствую, что где-то должен быть параметр веса, но при сканировании документации я не смог его найти. Я ищу такой результат:

> test
  Wave_Height                Data
1        1.20 2019-01-01 00:00:00
2        0.62 2019-01-01 05:00:00
3        0.50 2019-01-01 06:00:00

1 Ответ

0 голосов
/ 19 июня 2019

Может быть, вы могли бы простую линейную регрессию?

mod <- lm(Wave_Height ~ Data, test[complete.cases(test), ])
test$Wave_Height[is.na(test$Wave_Height)] <- predict(mod, newdata = test[!complete.cases(test), ])

Вот решение, использующее обобщенную аддитивную модель и, следовательно, не предполагающее линейности отношения:

library(mgcv)
mod <- gam(Wave_Height ~ s(Data), data=test[complete.cases(test), ])
test$Wave_Height[is.na(test$Wave_Height)] <- predict(mod, newdata = test[!complete.cases(test), ])

Но вам нужно немного изменить формат данных (см. здесь ) и, возможно, захотите адаптировать спецификацию модели ...

...